JavaMail附件是InputStream的实例吗?

JavaMail附件是InputStream的实例吗?,java,jakarta-mail,Java,Jakarta Mail,我正在尝试使用java程序自动处理xml内容,这些内容作为电子邮件附件发送到应用程序。我一直在尝试不同的方法来查询电子邮件的组件,寻找xml文件,唯一可靠的方法是轮询bodyparts如何最好地确定身体部位是否为xml文件,然后自动将该xml文件转换为输入流?我想将任何xml附件转换为inputstream,然后对inputstream进行进一步处理 以下是我的想象: for(int y=1;y<=msg_count;y++){ Message msg = inbox.getMes

我正在尝试使用
java
程序自动处理
xml
内容,这些内容作为电子邮件附件发送到应用程序。我一直在尝试不同的方法来查询电子邮件的组件,寻找
xml
文件,唯一可靠的方法是轮询
bodypart
s如何最好地确定身体部位是否为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();}
                    }
                }
            }
        }
    }
}

for(int y=1;y您正在检查它是否是
com.sun.mail.imap.IMAPInputStream
的一个实例,如果是,您正在对
java.io.InputStream
进行强制转换。因此,实际上,您应该测试的是它是否是
java.io.InputStream
的一个实例。这是强制转换成功所需要的


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

如果在上下文中未定义类,则可以执行getClass().getName()将字符串与预期结果进行比较,而不是与实例进行比较。

代码中有太多假设,因此询问您真正想要做的是什么很重要

许多不同类型的附件都可以是XML格式,您真的想处理所有附件吗?说某个东西是“XML”比说它是“ASCII”稍微有用一点。您想要什么样的XML数据?您想用它做什么

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

谁在发送您试图处理的邮件?这些邮件是由您知道的另一个程序发送的,该程序只发送带有“.XML”文件名的XML文件?还是您试图处理任何邮箱中任何邮件程序发送的带有任何附件的任意邮件


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

“eclipse不喜欢”并不是对您的问题的详细描述,也不太可能吸引其他人的帮助谢谢您和+1添加有用的透视图。但这并不能让我通过eclipse编译错误警告。getClass().getName()在本例中,刚刚返回了
com.sun.mail.imap.IMAPInputStream
,它显然可以被转换为
java.io.InputStream
。我不知道实际的类对您是否重要。我开发了一些奇怪的API,在这些API中,您可以获得类,并检查您是否真正获得了预期的类,但您没有该类在您的上下文中。您的答案假设
com.sun.mail.imap.IMAPInputStream
可以可靠地转换为
java.io.InputStream
。它在这种情况下工作,但我不确定它的通用性。否。我的答案假设,如果您转换为InputStream,那么您就是做出此假设的人。如果您想测试有些东西是java.io.InputStream为了确保强制转换是安全的,那么您应该使用java.io.InputStream的
实例
。包含
xml
文件的电子邮件仅使用已知的电子邮件地址从其他应用程序发送。所有文件都将包含xml扩展名。
xml
文件的内容将在下面显示进行后续的下游处理,以解决您提出的问题。我正在努力保持每个问题的重点,以便我们能够保持堆栈溢出格式的完整性。解释更多的背景和要求将有助于保持问题的重点,并避免问这些澄清性问题。这个问题就是答案在您回复之前,已被其他人拒绝。您对此帖子的提交内容都是问题,这些问题属于原始帖子下方的评论。您尚未对此问题提供答案,因此您不应该单击将提交内容发布为答案的按钮。我感谢您可能需要帮助的任何意图。但是StackOverflow表示狭义问题的狭义答案。回复者在OP结束时发表评论。在回复者将其作为答案发表之前,交换评论会得到答案。然后,我们删除评论,并在交换评论得到答案后根据需要清理问题/答案。您的方法与此不符标准做法。这里有一篇文章解释了在本网站上使用的正确礼仪: