在我提出问题之前,我完全清楚将输入流打开会导致内存泄漏,因此这样做是不好的做法。
考虑以下先决条件:
我要问的是,在我的测试自动化套件中,需要反复调用相同的文件来验证某些数据字段。
在当前状态下,数据读取器功能打开BufferedReader
流,读取/返回数据,然后关闭流。
但是,由于文件大小和文件读取的次数,我不知道是否打开流是有益的。如果我是诚实的,我不知道文件大小是否会影响流的开放。
那么总结一下,鉴于上面列出的前提条件,是否会打开一个BufferedReader
输入流来提高整体性能?内存泄漏仍然可能吗?
如果你有足够的记忆来做到这一点,那么你可能会通过将整个文件读入StringBuilder
,将其变成String
,然后通过String
重复读取StringReader
来获得最佳性能。
但是,您可能需要6倍或更多(可用)堆空间的字节数与文件的大小。
byte
- > char
扩展StringBuilder
缓冲区随着它的增长而扩展的方式。你可以通过将文件保存在内存中来保存空间,如字节(不是字符),并通过读入恰当大小的byte[]
。但是,每次从byte[]
读取时,您需要重复字节 - >字符解码。
如果您需要最终性能,您应该对备选方案进
看看使用Buffer
来减少复制。
你的想法。保持BufferedReader
打开并使用mark
和reset
与关闭和重新打开相比会给你一个小的加速。但是文件越大,相对而言加速越小。对于一个50GB的文件,我怀疑加速是微不足道的。
是的,不关闭流可以提高理论性能,因为假设您没有取消引用BufferedReader,对象将不会触发垃圾收集。此外,不需要的资源也不需要同步。看到类似的答案:Performance hit opening and closing filehandler?
但是,不关闭BufferedReader将导致memory leak and you'll see heap increase。
我建议其他人在评论和答案中只是将文件读入内存并使用它。一个50MB的文件并没有那么多,加上内存中一次性能的读取将远远高于重新读取文件。