如何读取大文本文件并在Java中使用它

时间:2017-04-10 23:14:39

标签: java file

我有一个大文本文件,我想读它,当我尝试这样做没有任何操作,如从这个文件添加一些文本列出它读取文件最大到一分钟,但当我尝试添加一些文本到arrayList和接下来我想做一些操作太慢,你知道我怎么能读取这些数据并使用它? 这是我的代码:

public class ReaderTEst {
public static void main(String[] args) throws IOException {
    List<String> graphList = new ArrayList<>();
    List<String> edgeList = new ArrayList<>();
    FileInputStream inputStream = null;
    Scanner sc = null;
    try {
        inputStream = new FileInputStream("myText.txt");
        sc = new Scanner(inputStream, "UTF-8");
        while (sc.hasNextLine()) {
            String line = sc.nextLine();
            line = line.replace("\uFEFF", "");//i use UTF-8 file so I need delete unneeded character
            if (Character.isWhitespace(line.charAt(0))) {
                edgeList.add(line.trim());
            } else {
                graphList.add(line);
            }
        }
        if (sc.ioException() != null) {
            throw sc.ioException();
        }
    } finally {
        if (inputStream != null) {
            inputStream.close();
        }
        if (sc != null) {
            sc.close();
        }
    }
}

} 这需要很多时间,你知道它会更快吗?我有600 MB的文件txt 当我改变时:

List<Integer> graphList = new ArrayList<>(1);
int i = 0;
while (sc.hasNextLine()) {`String line = sc.nextLine();`
        line = line.replace("\uFEFF", "");//i use UTF-8 file so I need delete unneeded character

            graphList.add(i++);

    }

我工作,但是当我想要放字符串时需要很长时间

3 个答案:

答案 0 :(得分:1)

您应该使用BufferedReader.readLine()。你可以用每秒读取数百万行。 Scanner对你正在做的事情来说太过分了。

\uFEFF不是文字。这个真的是一个文本文件吗?这是BOM标记吗?在这种情况下,它只会在第一行的开头:不需要在每一行扫描它。

答案 1 :(得分:0)

您的主要问题如下:

List<String> graphList = new ArrayList<>();
List<String> edgeList = new ArrayList<>();

您应该使用初始容量初始化每个List,以便JVM不需要自动扩展后备阵列。

line = line.replace("\uFEFF", "");

这也会减慢您的计划速度。每行\uFEFF的频率是多少?在尝试替换之前,我会检查该行是否包含\uFEFF

除此之外,还有其他优化措施;也许你可以利用FileChannel来阅读文件,但这是关于它的。

答案 2 :(得分:0)

首先,由于架构特性,我建议使用List的LinkedList实现。因此,ArrayList是内置数组,LinkedList包含在节点上。 ArrayList创建新的更大的数组并将旧的数组复制到新数组,然后达到一些能力。 Oracle有关于此的完美文档,我向您推荐LinkedList ArrayList