为什么这需要这么长时间才能运行?

时间:2013-08-06 06:39:03

标签: java io

我是java的新手,而且我正在阅读一个~25 MB的文件,只需加载就可以永久...有没有其他方法可以让它更快?是扫描仪无法处理大文件吗?

String text = "";
Scanner sc = new Scanner(new File("text.txt"));
while(sc.hasNext()) {
text += sc.next();
}

3 个答案:

答案 0 :(得分:8)

每次迭代都会连接到文本,而Java中的字符串不可变。这意味着每次String被“修改”时,它会在内存中创建一个新的text对象,从而导致大文件的加载时间过长。当您不断更改StringBuilder时,总是尝试使用String

你可以这样做:

StringBuilder text = new StringBuilder();
Scanner sc = new Scanner(new File("text.txt");
while(sc.hasNext()) {
  text.append(sc.next());
}

如果要访问文字内容,可以拨打text.toString()

答案 1 :(得分:4)

它是String +=,每次都会创建一个不断增长的新String对象。 事实上,对于小于25 MB的人,可以做得更多(

StringBuilder sb = new StringBuilder();
BufferReader in = new BufferedReader(new InputStreamReader(
    new FileInputStream(new File("text.txt"), "UTF-8")));
for (;;) {
    String line = in.readLine();
    if (line == null)
        break;
    sb.append(line).append("\n");
}
in.close();
String text = sb.toString();

readLine产生直到换行符的行,不包括它们。

在Java 7中可以做到:

Path path = Paths.get("text.txt");
String text = new String(Files.readAllBytes(path), "UTF-8");

编码以UTF-8显式给出。 “Windows-1252”适用于Windows Latin-1等。

答案 2 :(得分:1)

尝试使用BufferedStreams,例如,BufferedInputStream, BufferedReader他们会加速它。有关BufferedStreams的更多信息,请查看此处; http://docs.oracle.com/javase/tutorial/essential/io/buffers.html

String代替StringBuilder使用String,因为JavaString中是不可变的,它会在{{1}的每次迭代中创建一个新的while循环