Java 中的文本文件解析

2022-09-03 09:47:08

我正在读取文本文件,使用将文件内容放入字节数组中。然后,我使用新的字符串(字节)将字节数组转换为字符串。FileInputStream

一旦我有了字符串,我就会用它来将文件拆分为一个 String 数组,然后获取该字符串数组并通过执行解析它,并将内容保存在 Arraylist 中。String.split("\n")String.split(",")

我有一个200MB +的文件,当我用1GB内存启动JVM时,它的内存不足。我知道我一定在某个地方正确地做了一些事情,我只是不确定我解析的方式是否不正确,或者我正在使用的数据结构。

解析文件也花费了我大约12秒,这似乎需要花费很多时间。任何人都可以指出我可能正在做的事情导致我内存不足,以及可能导致我的程序运行缓慢的原因?

文件的内容如下所示:

"12334", "100", "1.233", "TEST", "TEXT", "1234"
"12334", "100", "1.233", "TEST", "TEXT", "1234"
.
.
.
"12334", "100", "1.233", "TEST", "TEXT", "1234"

谢谢


答案 1

我不确定它在内存方面的效率如何,但我的第一种方法是使用扫描仪,因为它非常易于使用:

File file = new File("/path/to/my/file.txt");
Scanner input = new Scanner(file);

while(input.hasNext()) {
    String nextToken = input.next();
    //or to process line by line
    String nextLine = input.nextLine();
}

input.close();

检查 API,了解如何更改用于拆分令牌的分隔符。


答案 2

这听起来像是你对我做错了什么 - 一整个lotta对象创建正在进行中。

这个“测试”文件的代表性如何?您真正在用这些数据做什么?如果这是你真正拥有的典型特征,我会说这些数据中有很多重复。

如果无论如何都要在字符串中,请从缓冲阅读器开始读取每行。将该列表预先分配到接近所需大小的大小,这样您就不会浪费每次都添加到其中的资源。在逗号处拆分每一行;请务必去掉双引号。

您可能想问自己:“为什么我需要同时将整个文件全部保存在内存中?你能读一点,处理一点,从来没有把整个事情同时记在脑子里吗?只有你足够了解你的问题才能回答。

也许你可以启动jvisualvm,如果你有JDK 6,看看内存发生了什么。这将是一个很好的线索。