2010-09-25 5 views
3

J'ai un fichier contenant un grand nombre de nombres.Lecture à partir d'un fichier avec DataInputStream est très lent

J'ai essayé d'utiliser le code suivant pour le lire à partir du fichier, mais il est super lent tout le monde peut aider à réduire le temps?

Ce qui suit est mon code pour le lire d'une manière très lente:

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

Peut-être parce que les chiffres sont en cours d'impression à l'écran? Commentez cette ligne juste pour un test. – dgnorton

+0

alors que j'ai essayé de ne pas les imprimer, mais le temps est encore trop long – starcaller

+1

Combien de temps est-il trop long? Aussi, que comptez-vous en faire? Cela change la stratégie de codage. –

Répondre

5

Ne pas utiliser un DataInputStream pour lire les lignes d'un fichier. Au lieu de cela, utilisez un BufferedReader, comme dans:

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

Le javadoc sur DataInputStream.readLine vous dit de ne pas utiliser cette méthode. (il a été abandonné)

Bien sûr, lorsque vous lisez les chiffres, je vous encourage à oublier de lire les lignes vous-même, et laissez simplement Scanner lire les chiffres pour vous. Si vous avez besoin de savoir quels numéros étaient sur la même ligne, Scanner peut le faire pour vous aussi:

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 
    } 
} 

Cette fantaisie regex fait en sorte que les sauts de ligne entre les lignes apparaissent également sous forme de jetons à la Scanner.

+0

Plus vite que moi! –

+4

C'est vrai, mais je ne vois pas pourquoi cela ralentirait l'application. La raison pour laquelle la méthode est déconseillée est qu'elle ne fait pas correctement la conversion de byte en char. –

+0

Merci pour la réponse, mais je suis un peu confus par le code du scanner, pouvez-vous me montrer le code entier pour lire le numéro dans le fichier en utilisant le scanner s'il vous plaît? – starcaller

1

Il fonctionne beaucoup plus vite sur ma machine avec le println est commenté. Écrire à l'écran ralentit beaucoup les choses. Et ce n'est pas seulement une chose java ... qui se passe en C/C++ et dans tous les autres langages avec lesquels j'ai travaillé.

+0

tout en essayant de ne pas les imprimer, mais le temps est encore trop longtemps – starcaller

+3

Combien de temps cela prend-il pour le fichier 2MB? – dgnorton

+0

J'ai changé le lecteur en lecteur tampon, et maintenant il peut être fait en 32ms – starcaller

0
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!"); 
    } 


} 

}

+0

éviter de poster juste du code, toujours essayer d'expliquer et de détailler votre réponse –

+0

Ok, je vais essayer de le faire dans d'autres posts.Je vous remercie. –