让BufferedReader流保持打开是否有任何性能优势?

时间:2018-03-04 12:48:58

标签: java bufferedreader

在我提出问题之前,我完全清楚将输入流打开会导致内存泄漏,因此这样做是不好的做法。

考虑以下前提条件:

  • 只需要阅读一个文件
  • 有问题的文件是包含数据行的文本文件
  • 此文件非常大:50MB或更多
  • 在测试运行期间多次读取文件

我要问的是,在我的测试自动化套件中,需要反复调用相同的文件来验证某些数据字段。

在当前状态下,数据读取器功能打开BufferedReader流,读取/返回数据,然后关闭流。

但是,由于文件大小和文件读取的次数,我不知道将流保持打开是否有益。如果我是诚实的,我根本不知道文件大小是否会影响流的开放。

总而言之,鉴于上面列出的前提条件,是否会打开BufferedReader输入流来提高整体性能?还有内存泄漏吗?

2 个答案:

答案 0 :(得分:0)

如果您有足够的内存来执行此操作,那么您可能会将整个文件读入StringBuilder,将其转换为String,然后重复读取{{{}},从而获得最佳效果。 1}}通过String

但是,您可能需要6倍或更多(可用)堆空间的字节数与文件大小相同。

  • 2 x以允许StringReader - > byte扩展
  • 3 x,因为char缓冲区随着它的增长而扩展。

您可以通过将文件保存在内存中来保存空间,如字节(不是字符),并通过读入恰当大小的StringBuilder。但是你需要重复字节 - >每次从byte[]读取时都会进行字符解码。

如果您需要最终表现,您应该对替代方案进行基准测试。

然后使用byte[]来减少复制。

重新考虑你的想法。与关闭和重新打开相比,保持Buffer打开并使用BufferedReadermark可以获得较小的加速。但是文件越大,相对而言加速越小。对于一个50GB的文件,我怀疑加速是微不足道的。

答案 1 :(得分:0)

是的,不关闭流可以提高理论性能,因为对象不会触发垃圾回收 假设您没有取消引用BufferedReader。此外,不需要的资源也不需要同步。请参阅类似的答案:Performance hit opening and closing filehandler?

但是,不关闭BufferedReader将导致memory leak and you'll see heap increase

我建议其他人在评论和答案中只是将文件读入内存并使用它。一个50MB的文件并没有那么多,再加上一次内存中字符串的性能读取将远远高于重新读取文件。