我正在使用虚拟文件系统,我想将文件附加到电子邮件。但是,MimeBodyPart对象仅获取文件,该文件在JIMFS之类的默认文件系统上不起作用。请参阅下面的代码,当我尝试转换为文件时,我会在其中得到无支柱的异常。
public Email attach(Path file){
MimeBodyPart attachment = new MimeBodyPart()
attachment.attachFile(file.toFile())
attachments.add(attachment)
return this
}
,因为jimfs文件不是真的文件,您无法使用文件API。
一个简单的解决方法是使用bytearraydatasource,它将复制数据。
更好的方法是编写自己的PathDatasource,类似于FileDatasource,但使用files.newinputstream而不是fileInputStream。然后使用:
连接文件MimeBodyPart mbp = new MimeBodyPart();
mbp.setDataHandler(new DataHandler(new PathDataSource(path)));
mbp.setFileName(path.getFileName().toString());
mbp.setDisposition(Part.ATTACHMENT);
无论此 MimeBodyPart
api真正什么都应该可以使用 Path
,以便您可以直接使用jimfs文件,但是由于 java.nio.file
apis需要Java 7,并且不在Android上工作,但不幸的是,许多库都不支持Path
。
toFile()
永远无法适用于jimfs文件,也不能用于默认文件系统上不使用的任何文件,因为File
类只能在默认文件系统上表示文件。是的,您需要将jimfs文件复制到真实文件系统以使用此attachFile
方法。
如果MimeBodyPart
API可以选择使用URL
或URI
进行附件,则您可能可以使用该加上file.toUri()[.toURL()]
。或者,如果可以使用InputStream
,您显然可以从文件中获取其中一个并改用它。