使用DataInputStream从文件读取非常慢

sta*_*ler 3 java file-io

我有一个包含大量数字的文件.

我曾尝试使用以下代码从文件中读取它,但它是超级慢任何人都可以帮助减少时间?

以下是我的代码以非常慢的方式阅读它:

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;

public class FileInput {

  public static void main(String[] args) {

    Scanner scan1 = new Scanner(System.in);
    String filename = scan1.nextLine();

    File file = new File(filename);
    FileInputStream fis = null;
    BufferedInputStream bis = null;
    DataInputStream dis = null;

    try {
          fis = new FileInputStream(file);

      bis = new BufferedInputStream(fis);
      dis = new DataInputStream(bis);

      while (dis.available() != 0) {

        System.out.println(dis.readLine());
      }

      fis.close();
      bis.close();
      dis.close();

    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*tin 5

不要使用a DataInputStream来读取文件中的行.相反,使用a BufferedReader,如:

fis = new FileInputStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
while ((String line = reader.readLine()) != null) {
  System.out.println(line);
}
Run Code Online (Sandbox Code Playgroud)

javadoc on DataInputStream.readLine告诉您不要使用该方法.(它已被弃用)

当然,当你真正开始阅读这些数字时,我会鼓励你忘记自己读行,然后让Scanner你为你读数字.如果您需要知道哪些数字在同一行,Scanner也可以为您做到:

Scanner fileScanner = new Scanner(file, "UTF-8").useDelimiter(" +| *(?=\\n)|(?<=\\n) *");
while (fileScanner.hasNext()) {
  List<Integer> numbersOnLine = new ArrayList<Integer>();
  while (fileScanner.hasNextInt()) {
    numbersOnLine.add(fileScanner.nextInt());
  }
  processLineOfNumbers(numbersOnLine);
  if (fileScanner.hasNext()) {
    fileScanner.next(); // clear the newline
  }
}
Run Code Online (Sandbox Code Playgroud)

那个花哨的正则表达式使得行之间的换行符也显示为令牌Scanner.

  • 这是事实,但我不明白为什么这会使应用程序变慢.不推荐使用该方法的原因是它不能正确地进行字节到字符的转换. (4认同)