我正在使用虚拟文件系统,我想将其中的文件附加到电子邮件中。但是,MimeBodyPart对象只接受文件,这些文件不能像jimfs这样的默认文件系统。请参阅下面的代码,当我尝试转换为文件时,我得到UnsupportedOperation异常。
public Email attach(Path file){
MimeBodyPart attachment = new MimeBodyPart()
attachment.attachFile(file.toFile())
attachments.add(attachment)
return this
}
答案 0 :(得分:3)
由于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);
答案 1 :(得分:1)
无论这个MimeBodyPart
API真的应该都可以选择使用Path
,以便您可以直接使用Jimfs文件,但是因为{{1} API需要Java 7并且不能在Android上运行,但很多库不幸还不支持java.nio.file
。
Path
永远不能用于Jimfs文件,也不能用于默认文件系统上的任何文件,因为toFile()
类只能代表默认文件系统上的文件。所以,是的,你需要将Jimfs文件复制到真实的文件系统才能使用这个File
方法。
如果attachFile
API有选项可以使用MimeBodyPart
或URL
作为附件,那么您可能可以使用URI
加file.toUri()[.toURL()]
。或者,如果它可以使用InputStream
,您显然可以从文件中获取其中一个并使用它。