JavaMail 附件是 InputStream 的实例吗?

Is JavaMail attachment an instanceof InputStream?

我正在尝试让 java 程序自动处理作为电子邮件附件发送到应用程序的 xml 内容。我一直在试验不同的方法来查询电子邮件的组成部分以查找 xml 文件,唯一可靠的方法是轮询 bodypart如何才能最好地确定正文部分是否为 xml 文件,然后将该 xml 文件自动转换为输入流? 我想转换任何 xml 附件到 inputstream 然后对 inputstream.

做进一步处理

这是我的想象:

for(int y=1;y<=msg_count;y++){
    Message msg = inbox.getMessage(y);
    if(msg.getContent() instanceof Multipart){
        Multipart mp = (Multipart) msg.getContent();
        for(int a=0;a<mp.getCount();a++){
            BodyPart bp = mp.getBodyPart(a);
            if(bp.getFileName()!=null){
                if(bp.getFileName().endsWith(".xml")){
                    if(bp.getContent() instanceof com.sun.mail.imap.IMAPInputStream){
                        InputStream myis = (InputStream)bp.getContent();
                        Blob blob = null;
                        byte[] content = IOUtils.toByteArray(myis);
                        try {blob = new SerialBlob(content);} 
                        catch (SerialException e) {e.printStackTrace();}
                        catch (SQLException e) {e.printStackTrace();}
                    }
                }
            }
        }
    }
}

问题是 eclipse 警告上面的代码引用 com.sun.mail.imap.IMAPInputStream 的阻碍编译错误,即使 System.out.println(bp.getContent()) returns com.sun.mail.imap.IMAPInputStream 用于上面代码中的 xml 附件。

您正在检查它是否是 com.sun.mail.imap.IMAPInputStream 的实例,如果是,您将转换为 java.io.InputStream。所以,实际上,您应该测试的是它是否是 java.io.InputStream 的实例。这就是演员成功所需要的。

是否 com.sun.mail.imap.IMAPInputStream 并不重要,而是一个实现细节。

当 class 未在您的上下文中定义时,您可以执行 getClass().getName() 和字符串与预期结果而不是 instanceof 进行比较。

你的代码中有太多的假设,所以问问你真正想做什么很重要...

许多不同类型的附件可以是 XML 格式,您真的要处理所有附件吗?说某事是 "XML" 只比说它是 "ASCII" 稍微有用一点。您希望得到什么样的 XML 数据,您想用它做什么?

附件可能有也可能没有名称,XML 格式的附件可能有也可能没有以“.xml”结尾的文件名。

谁在发送您要处理的邮件?他们是不是被发送到我的另一个你知道的程序,它只发送 XML 个文件名为“.xml”的文件?或者您是否正在尝试处理任何邮件程序在任何邮箱中发送的带有任何类型附件的任意消息?

了解您真正想要做什么将有助于我们推荐最佳解决方案。