2010-05-19 17 views
8

Ich muss eine Textdatei Zeile für Zeile mit Java lesen. Ich verwende available() Methode von FileInputStream, um die Datei zu überprüfen und zu durchlaufen. Während des Lesens endet die Schleife jedoch nach der Zeile vor der letzten Zeile. , d. H., wenn die Datei 10 Zeilen enthält, liest die Schleife nur die ersten 9 Zeilen. Snippet verwendet:Lesen von Daten aus einer Textdatei mit Java

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

Sie verwenden sollten: // java.sun.com/j2se/1.5.0/docs/api/java/io/BufferedReader.html), um eine Datei zeilenweise zu lesen. – kgiannakakis

Antwort

9

Wie wäre Scanner verwenden? Ich denke, Scanner mit einfacher

 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

ja- gut eins :) –

11

Sie nicht available() verwenden sollten. Es gibt keine Garantien was auch immer. Vom API docs of available():

Liefert ein schätzen der Anzahl von Bytes, die (oder übersprungen) aus diesem Eingangsstrom durch den nächsten Aufruf einer Methode für diesen Eingangsstrom gelesen werden können, ohne zu blockieren.

Sie würden wahrscheinlich wollen etwas verwenden, wie

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

(entnommen aus http://www.exampledepot.com/egs/java.io/ReadLinesFromFile.html)

+2

+1 zu diesem. Dies ist meine bevorzugte Vorgehensweise. Das in.close() sollte sich jedoch wahrscheinlich in einem finally-Block befinden. –

+3

Ich weiß. Das erfordert jedoch einen anderen "try ... catch", da 'close()' sich selbst durch "IOException" ausdrücken kann. Wird für ein minimales Beispiel etwas hässlich. – aioobe

+0

Ja. Ich tippte eine Antwort auf halbem Wege selbst, als ich beschloss, den Versuch/Fang zu kratzen (Sie schlugen mich jedoch auf die Antwort). –

3

Wenn Sie Zeile-für-Zeile lesen möchten, eine BufferedReader verwenden. Es hat eine readLine() Methode, die die Zeile als String zurückgibt, oder null, wenn das Ende der Datei erreicht wurde. So können Sie etwas tun:

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

(Beachten Sie, dass dieser Code nicht verarbeitet Ausnahmen oder den Stream schließen, usw.)

0

Versuchen Sie, diese nur ein wenig Suche 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

Bitte verwenden Sie DataInputStream nicht zum Lesen von Text. Leider werden solche Beispiele immer wieder kopiert und Sie können sie aus Ihrem Beispiel entfernen. http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

0

Versuchen Sie, java.io.BufferedReader so zu verwenden.

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

Ja, sollte Pufferung für eine bessere Leistung verwendet werden. Verwenden Sie BufferedReader OR byte [], um Ihre temporären Daten zu speichern.

danke.

2

können Sie versuchen, FileUtils von org.apache.commons.io.FileUtils, try downloading jar from here

und Sie können die folgende Methode verwenden: FileUtils.readFileToString ("yourFileName");

Hoffe es hilft dir ..

0

Benutzer Scanner sollte es

  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

Einfache Code arbeiten Datei in JAVA für das Lesen:

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

Es wäre toll, wenn Sie Ihren Code erklären können. Dann werden mehr Menschen profitieren. – jazzurro

+0

Dies sieht aus wie eine Kopie/Paste von Ravindra Gullapalli's Antwort. Außer dass er einen 'FileInputStream' verwendet hat, aber Sie haben einen' FileReader' (wie Aioobe) benutzt. Welchen Wert liefert Ihre Copy/Paste-Antwort fast 5 Jahre später? – jww

1

Der Grund Code die letzte Zeile übersprungen wurde, weil Sie setzen fis.available() > 0 anstelle von fis.available() >= 0

1

In Java 8 Sie könnten leicht Ihren Text-Datei in eine Liste von Strings mit Strömen drehen, indem Sie Files.lines und collect: [BufferedReader] (http

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

Könnten Sie das näher erläutern? Die Antwort enthält Code, bitte fügen Sie einige Erklärungen hinzu. Vielen Dank. – 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); 
     } 




    } 
} 
Verwandte Themen