有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么运行这么长时间?

我是一个java新手,我正在阅读一个~25MB的文件,只需加载一个文件就可以了。。。有没有其他方法可以加快速度?是扫描仪不能处理大文件吗

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

共 (3) 个答案

  1. # 1 楼答案

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

    由于StringJava中是不可变的,因此它将在while循环的每个迭代中创建一个新的String

  2. # 2 楼答案

    它是String +=,每次创建一个不断增长的新字符串对象。 事实上,对于小于25 MB的内存,您可以执行以下操作(低于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拉丁语-1等

  3. # 3 楼答案

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

    你可以做:

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

    当您想要访问文本的内容时,可以调用text.toString()