Чтение из файла с DataInputStream очень медленно - PullRequest
3 голосов
/ 26 сентября 2010

У меня есть файл, содержащий большое количество чисел.

Я пытался использовать следующий код, чтобы прочитать его из файла, но он очень медленный, кто-нибудь может помочь сократить время?1003 *

Ниже приведен мой код для очень медленного чтения:

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();
    }
  }
}

Ответы [ 3 ]

5 голосов
/ 26 сентября 2010

Не используйте DataInputStream для чтения строк из файла. Вместо этого используйте BufferedReader, как в:

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

Javadoc на 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
  }
}

Это причудливое регулярное выражение делает так, чтобы символы новой строки между строками также отображались как токены для Scanner.

1 голос
/ 26 сентября 2010

На моей машине он работает намного быстрее с закомментированной печатью.Запись на экран сильно тормозит.И это не просто Java-вещь ... происходит в C / C ++ и на всех других языках, с которыми я работал.

0 голосов
/ 18 августа 2013
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;


public class file {
public static void main(String[] args){
    Scanner keyboard = new Scanner(System.in);
    String fname = "";
    System.out.print("File Name: ");
    fname = keyboard.next();

    try{
        Scanner file1 = new Scanner(new FileReader(fname));
        System.out.println("File Open Successful");
        int length = file1.nextInt();
        String[] content = new String[length];
        for (int i=0;i<length;i++){
            content[i] = file1.next();
        }
        for (int i=0;i<length;i++){
            System.out.println("["+i+"] "+content[i]);
        }
        System.out.println("End of file.");

    } catch (FileNotFoundException e){
        System.out.println("File Not Found!");
    }   


}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...