2010-05-19 20 views
8

J'ai besoin de lire un fichier texte ligne par ligne en Java. J'utilise la méthode available() de FileInputStream pour vérifier et faire une boucle sur le fichier. Mais en lisant, la boucle se termine après la ligne avant la dernière. , c'est-à-dire, si le fichier contient 10 lignes, la boucle lit uniquement les 9 premières lignes. Snippet utilisé:Lire les données d'un fichier texte en utilisant Java

while(fis.available() > 0) 
{ 
    char c = (char)fis.read(); 
    ..... 
    ..... 
} 
+0

Vous devez utiliser [BufferedReader] (http: // java.sun.com/j2se/1.5.0/docs/api/java/io/BufferedReader.html) pour lire un fichier ligne par ligne. – kgiannakakis

Répondre

9

Que diriez-vous à l'aide du scanner? Je pense que l'utilisation du scanner est plus facile

 private static void readFile(String fileName) { 
     try { 
     File file = new File(fileName); 
     Scanner scanner = new Scanner(file); 
     while (scanner.hasNextLine()) { 
      System.out.println(scanner.nextLine()); 
     } 
     scanner.close(); 
     } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     } 
    } 

Read more about Java IO here

+0

oui- un bon :) –

11

Vous ne devriez pas utiliser available(). Cela ne donne aucune garantie quoi que ce soit. De l'API docs of available():

Renvoie une estimer du nombre d'octets qui peuvent être lus (ou sautée) de ce flux d'entrée sans bloquer la prochaine invocation d'une méthode pour ce flux d'entrée.

Vous auriez probablement eu envie d'utiliser quelque chose comme

try { 
    BufferedReader in = new BufferedReader(new FileReader("infilename")); 
    String str; 
    while ((str = in.readLine()) != null) 
     process(str); 
    in.close(); 
} catch (IOException e) { 
} 

(prise de http://www.exampledepot.com/egs/java.io/ReadLinesFromFile.html)

+2

+1 à cela. C'est mon approche préférée aussi. Cependant, in.close() devrait probablement résider dans un bloc finally. –

+3

Je sais. Cela nécessite cependant un autre 'try ... catch' puisque' close() 'lui-même peut passer par' IOException'. Devient sorte de laid pour un exemple minimal. – aioobe

+0

Oui. Je tapais une réponse à mi-chemin quand j'ai décidé de gratter le try/catch (vous me battre à la réponse si). –

3

Si vous voulez lire ligne par ligne, utilisez un BufferedReader. Il a une méthode readLine() qui renvoie la ligne sous forme de chaîne, ou null si la fin du fichier a été atteinte. Ainsi, vous pouvez faire quelque chose comme:

BufferedReader reader = new BufferedReader(new InputStreamReader(fis)); 
String line; 
while ((line = reader.readLine()) != null) { 
// Do something with line 
}

(Notez que ce code ne traite pas des exceptions ou fermer le flux, etc.)

0

Essayez ce juste une petite recherche dans Google

import java.io.*; 
class FileRead 
{ 
    public static void main(String args[]) 
    { 
     try{ 
    // Open the file that is the first 
    // command line parameter 
    FileInputStream fstream = new FileInputStream("textfile.txt"); 
    // Get the object of DataInputStream 
    DataInputStream in = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
    String strLine; 
    //Read File Line By Line 
    while ((strLine = br.readLine()) != null) { 
     // Print the content on the console 
     System.out.println (strLine); 
    } 
    //Close the input stream 
    in.close(); 
    }catch (Exception e){//Catch exception if any 
     System.err.println("Error: " + e.getMessage()); 
    } 
    } 
} 
+1

Veuillez ne pas utiliser DataInputStream pour lire du texte. Malheureusement, des exemples comme celui-ci sont copiés encore et encore afin que vous puissiez le retirer de votre exemple. http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

0

Essayez d'utiliser java.io.BufferedReader comme ceci.

java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(fileName))); 
String line = null; 
while ((line = br.readLine()) != null){ 
//Process the line 
} 
br.close(); 
3
String file = "/path/to/your/file.txt"; 

try { 

    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 
    String line; 
    // Uncomment the line below if you want to skip the fist line (e.g if headers) 
    // line = br.readLine(); 

    while ((line = br.readLine()) != null) { 

     // do something with line 

    } 
    br.close(); 

} catch (IOException e) { 
    System.out.println("ERROR: unable to read file " + file); 
    e.printStackTrace(); 
} 
0

Oui, mise en mémoire tampon doit être utilisé pour de meilleures performances. Utilisez BufferedReader OU octet [] pour stocker vos données temporaires.

merci.

2

Vous pouvez FileUtils de org.apache.commons.io.FileUtils, try downloading jar from here

et vous pouvez utiliser la méthode suivante: FileUtils.readFileToString ("yourFileName");

J'espère que ça vous aide ..

0

scanner utilisateur, il devrait fonctionner

  Scanner scanner = new Scanner(file); 
     while (scanner.hasNextLine()) { 
      System.out.println(scanner.nextLine()); 
     } 
     scanner.close(); 
0
public class ReadFileUsingFileInputStream { 

/** 
* @param args 
*/ 
static int ch; 

public static void main(String[] args) { 
    File file = new File("C://text.txt"); 
    StringBuffer stringBuffer = new StringBuffer(""); 
    try { 
     FileInputStream fileInputStream = new FileInputStream(file); 
     try { 
      while((ch = fileInputStream.read())!= -1){ 
       stringBuffer.append((char)ch); 
      } 
     } 
     catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println("File contents :"); 
    System.out.println(stringBuffer); 
    } 
} 
-3

Code simple pour lire le fichier en JAVA:

import java.io.*; 

class ReadData 
{ 
    public static void main(String args[]) 
    { 
     FileReader fr = new FileReader(new File("<put your file path here>")); 
     while(true) 
     { 
      int n=fr.read(); 
      if(n>-1) 
      { 
       char ch=(char)fr.read(); 
       System.out.print(ch); 
      } 
     } 
    } 
} 
-2
BufferedReader br = new BufferedReader(new FileReader(file)); 
String line; 
while ((line = br.readLine()) != null) { 
// process the line. 
} 
br.close(); // close bufferreader after use 
+0

Ce serait génial si vous pouvez expliquer votre code. Ensuite, plus de gens recevront des prestations. – jazzurro

+0

Cela ressemble à un copier/coller de la réponse de Ravindra Gullapalli. Sauf qu'il a utilisé un 'FileInputStream', mais vous avez utilisé un' FileReader' (comme Aioobe). Quelle valeur votre réponse copier/coller fournit-elle près de 5 ans plus tard? – jww

1

La raison pour laquelle votre code sauté la dernière ligne a été parce que vous mettez fis.available() > 0 au lieu de fis.available() >= 0

1

En Java 8 vous pouvez facilement transformer votre fichier texte dans une liste de chaînes avec des flux en utilisant Files.lines et collect:

private List<String> loadFile() { 
    URI uri = null; 
    try { 
     uri = ClassLoader.getSystemResource("example.txt").toURI(); 
    } catch (URISyntaxException e) { 
     LOGGER.error("Failed to load file.", e); 
    } 
    List<String> list = null; 
    try (Stream<String> lines = Files.lines(Paths.get(uri))) { 
     list = lines.collect(Collectors.toList()); 
    } catch (IOException e) { 
     LOGGER.error("Failed to load file.", e); 
    } 
    return list; 
} 
0
public class FilesStrings { 

public static void main(String[] args) throws FileNotFoundException, IOException { 
    FileInputStream fis = new FileInputStream("input.txt"); 
    InputStreamReader input = new InputStreamReader(fis); 
    BufferedReader br = new BufferedReader(input); 
    String data; 
    String result = new String(); 

    while ((data = br.readLine()) != null) { 
     result = result.concat(data + " "); 
    } 

    System.out.println(result); 
+1

Pourriez-vous élaborer? La réponse contient du code, veuillez ajouter quelques explications. Merci. – galath

1
//The way that I read integer numbers from a file is... 

import java.util.*; 
import java.io.*; 

public class Practice 
{ 
    public static void main(String [] args) throws IOException 
    { 
     Scanner input = new Scanner(new File("cards.txt")); 

     int times = input.nextInt(); 

     for(int i = 0; i < times; i++) 
     { 
      int numbersFromFile = input.nextInt(); 
      System.out.println(numbersFromFile); 
     } 




    } 
}