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