2010-05-19 6 views
8

Ho bisogno di leggere un file di testo riga per riga utilizzando Java. Io uso il metodo available() di FileInputStream per controllare e ripetere il loop del file. Ma durante la lettura, il ciclo termina dopo la linea prima dell'ultima. , ad esempio, se il file ha 10 righe, il ciclo legge solo le prime 9 righe. Snippet utilizzato:Leggere i dati da un file di testo utilizzando Java

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

si dovrebbe usare [BufferedReader] (http: // java.sun.com/j2se/1.5.0/docs/api/java/io/BufferedReader.html) per leggere un file riga per riga. – kgiannakakis

risposta

9

Come sull'utilizzo dello scanner? Penso che utilizzando Scanner è più 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

si- buono uno :) –

11

non si dovrebbe usare available(). Non dà garanzie che cosa mai. Dalla API docs of available():

restituisce un stimare del numero di byte che possono essere letti (o saltati) da questo flusso di input senza bloccare il successivo richiamo di un metodo per questo flusso di input.

si sarebbe probabilmente desidera utilizzare qualcosa come

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

(tratto da http://www.exampledepot.com/egs/java.io/ReadLinesFromFile.html)

+2

+1 a questo. Questo è anche il mio approccio preferito. Tuttavia, in.close() dovrebbe probabilmente risiedere in un blocco finally. –

+3

Lo so. Tuttavia, ciò richiede un altro 'try ... catch' poiché' close() 'stesso può passare attraverso' IOException'. Diventa un po 'brutto per un esempio minimo. – aioobe

+0

Sì. Stavo scrivendo una risposta a metà strada quando ho deciso di raschiare il try/catch (mi hai battuto sulla risposta). –

3

Se volete leggere riga per riga, utilizzare un BufferedReader. Ha un metodo readLine() che restituisce la riga come stringa, o null se è stata raggiunta la fine del file. Così si può fare qualcosa di simile:

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

(Si noti che questo codice non gestisce le eccezioni o chiudere il flusso, ecc)

0

Prova questa solo un po 'di ricerca in 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

Si prega di non utilizzare DataInputStream per leggere il testo. Sfortunatamente esempi come questo vengono copiati ancora e ancora, quindi puoi rimuoverlo dal tuo esempio. http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

0

Prova a utilizzare java.io.BufferedReader in questo modo.

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

Sì, il buffering dovrebbe essere utilizzato per migliorare le prestazioni. Utilizzare BufferedReader O byte [] per memorizzare i dati temporanei.

grazie.

2

Si può provare fileutils da org.apache.commons.io.FileUtils, try downloading jar from here

ed è possibile utilizzare il seguente metodo: FileUtils.readFileToString ("yourfilename");

Spero che ti aiuti ..

0

scanner utente dovrebbe funzionare

  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

semplice codice per la lettura di file in 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

Sarebbe fantastico se riuscissi a spiegare il tuo codice. Quindi più persone riceveranno beneficio. – jazzurro

+0

Sembra una copia/incolla della risposta di Ravindra Gullapalli. Tranne che ha usato un 'FileInputStream', ma hai usato un' FileReader' (come Aioobe). Che valore ha la tua copia/incolla risposta fornire circa 5 anni dopo? – jww

1

Il motivo per il codice saltato l'ultima riga è stato perché si mette fis.available() > 0 invece di fis.available() >= 0

1

In Java 8 si potrebbe facilmente trasformare il vostro file di testo in una lista di stringhe con i flussi utilizzando Files.lines e 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

Potresti elaborare? La risposta contiene il codice, per favore aggiungi alcune spiegazioni. Grazie. – 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); 
     } 




    } 
}