0

我正在尝试通过使用camel附件并将附件获取为DataHandler. 一个10MB文件需要左右3hrs写入该位置。

File outputFile = new File(someDirectory, someFileName);
DataHandler attachment_data = destination1Attachments.get("someFileName.txt"); 

        try (FileOutputStream fos = new FileOutputStream(outputFile)) {
            attachment_data.writeTo(fos);  
        }

我还注意到,有时一个 6 到 7Mb 的文件大约需要 2 到 3 分钟,而当另一封邮件在此之后,它需要的时间比预期的要长。

因为GC?

试图找到确切的根本原因或任何其他将数据写入文件的方法。

更新1
尝试使用@user207421 在评论中提到的BufferedOutputStream周围。FileOutputSteam找不到太多变化(仅 1 秒或更多)。

4

2 回答 2

1

这可能是由于写入机制的默认实现。

attachment_data.writeTo(fos);  

如果DataHandler.getDataSource()!=null那么这个理论将起作用

在此方法实现中,一次读取 8 个字节并将其写入流中。读写次数更多,这可能是导致问题的原因。

尝试DataHandler.getInputStream通过增加输入流中的读取内容来自行读取文件并写入文件。

于 2019-09-18T10:32:49.213 回答
1

必须假设对象被加载到内存中或 writeTo 非常低效。因此指定 DataFlavor 和 inspect attachment_data.getTransferDataFlavors()

DataFlavor flavor = new DataFlavor(InputStream.class, "application/octetstream");
try (InputStream in = (InputStream) attachment_data.getTransferData(flavor)) {

需要一些摆弄。

于 2019-09-18T10:34:47.887 回答