Java - Aus Datei lesen

Java - Aus Datei lesen

1. Überblick

In diesem Tutorial werden verschiedene Möglichkeiten fürread from a File in Java untersucht. Wir werdenBufferedReader,Scanner,StreamTokenizer,DataInputStream,SequenceInputStream undFileChannel verwenden.

Anschließend wird erläutert, wie eine UTF-8-codierte Datei gelesen und ein String aus dem Inhalt einer Datei erstellt wird.

Abschließend werden die neuen Techniken zum Lesen aus Dateien in Java 7 erläutert.

Dieser Artikel ist Teil vonthe “Java – Back to Basic” series hier am Beispiel.

2. Lesen Sie mitBufferedReader

Beginnen wir mit einer einfachen Methode zum Lesen aus einer Datei mitBufferedReader. Die Datei selbst enthält:

Hello world

Der folgende Code liest mitBufferedReader aus der Datei:

@Test
public void whenReadWithBufferedReader_thenCorrect()
  throws IOException {
     String expected_value = "Hello world";
     String file ="src/test/resources/test_read.txt";

     BufferedReader reader = new BufferedReader(new FileReader(file));
     String currentLine = reader.readLine();
     reader.close();

    assertEquals(expected_value, currentLine);
}

Beachten Sie, dassreadLine()null zurückgibt, wenn das Ende der Datei erreicht ist.

3. Lesen Sie mitScanner

Als nächstes verwenden wir einScanner, um aus der Datei zu lesen - die Datei enthält:

Hello world 1

Wir verwenden ein einfaches Leerzeichen als Trennzeichen:

@Test
public void whenReadWithScanner_thenCorrect()
  throws IOException {
    String file = "src/test/resources/test_read.txt";
    Scanner scanner = new Scanner(new File(file));
    scanner.useDelimiter(" ");

    assertTrue(scanner.hasNext());
    assertEquals("Hello", scanner.next());
    assertEquals("world", scanner.next());
    assertEquals(1, scanner.nextInt());

    scanner.close();
}

Beachten Sie, dass das Standardtrennzeichen das Leerzeichen ist, jedoch mehrere Trennzeichen mit einemScanner verwendet werden können.

4. Lesen Sie mitStreamTokenizer

Als nächstes lesen wir eine Textdatei mitStreamTokenizer in Token ein.

Der Tokenizer funktioniert wie folgt: Zuerst müssen wir herausfinden, was der nächste Token ist - Zeichenfolge oder Zahl; Wir tun dies, indem wir uns das Feldtokenizer.ttypeansehen.

Dann lesen wir das tatsächliche Token basierend auf diesem Typ:

  • tokenizer.nval - wenn der Typ eine Zahl war

  • tokenizer.sval - wenn der Typ ein String war

Die Datei enthält einfach:

Hello 1

Der folgende Code liest sowohl die Zeichenfolge als auch die Nummer aus der Datei:

@Test
public void whenReadWithStreamTokenizer_thenCorrectTokens()
  throws IOException {
    String file = "src/test/resources/test_read.txt";
   FileReader reader = new FileReader(file);
    StreamTokenizer tokenizer = new StreamTokenizer(reader);

    // token 1
    tokenizer.nextToken();
    assertEquals(StreamTokenizer.TT_WORD, tokenizer.ttype);
    assertEquals("Hello", tokenizer.sval);

    // token 2
    tokenizer.nextToken();
    assertEquals(StreamTokenizer.TT_NUMBER, tokenizer.ttype);
    assertEquals(1, tokenizer.nval, 0.0000001);

    // token 3
    tokenizer.nextToken();
    assertEquals(StreamTokenizer.TT_EOF, tokenizer.ttype);
    reader.close();
}

Beachten Sie, wie das Dateiende-Token am Ende verwendet wird.

5. Lesen Sie mitDataInputStream

Wir könnenDataInputStream verwenden, um den binären oder primitiven Datentyp aus der Datei zu lesen.

Beginnen wir mit der eigentlichen Datei:

Hello

Der folgende Test liest die Datei mitDataInputStream:

@Test
public void whenReadWithDataInputStream_thenCorrect()
  throws IOException {
    String expectedValue = "Hello";
    String file ="src/test/resources/test_read.txt";
    DataInputStream reader = new DataInputStream(new FileInputStream(file));
    String result = reader.readUTF();
    reader.close();

    assertEquals(expectedValue, result);
}

6. Lesen Sie mitFileChannel

Wenn wir eine große Datei lesen, kannFileChannel schneller sein als Standard-E / A.

Der Inhalt der Datei:

 Hello world

Der folgende Code liest Datenbytes mitFileChannel undRandomAccessFile aus der Datei:

@Test
public void whenReadWithFileChannel_thenCorrect()
  throws IOException {
    String expected_value = "Hello world";
    String file = "src/test/resources/test_read.txt";
    RandomAccessFile reader = new RandomAccessFile(file, "r");
    FileChannel channel = reader.getChannel();

    int bufferSize = 1024;
    if (bufferSize > channel.size()) {
        bufferSize = (int) channel.size();
    }
    ByteBuffer buff = ByteBuffer.allocate(bufferSize);
    channel.read(buff);
    buff.flip();

    assertEquals(expected_value, new String(buff.array()));
    channel.close();
    reader.close();
}

7. UTF-8-codierte Datei lesen

Lassen Sie uns nun sehen, wie Sie eine UTF-8-codierte Datei mitBufferedReader lesen:

@Test
public void whenReadUTFEncodedFile_thenCorrect()
  throws IOException {
    String expected_value = "青空";
    String file = "src/test/resources/test_read.txt";
    BufferedReader reader = new BufferedReader
      (new InputStreamReader(new FileInputStream(file), "UTF-8"));
    String currentLine = reader.readLine();
    reader.close();

    assertEquals(expected_value, currentLine);
}

8. Lesen Sie eine Datei in einen String

Wir könnenStringBuilder bisread the entire contents of a file into a String gut nutzen. Beginnen wir mit der Datei:

Hello world

Test line

Mit dem folgenden Code werden aus der Datei gelesene Daten zeilenweise inStringBuilder angehängt:

@Test
public void whenReadFileContentsIntoString_thenCorrect()
  throws IOException {
    String expected_value = "Hello world n Test line n";
    String file = "src/test/resources/test_read.txt";
    BufferedReader reader = new BufferedReader(new FileReader(file));
    StringBuilder builder = new StringBuilder();
    String currentLine = reader.readLine();
    while (currentLine != null) {
        builder.append(currentLine);
        builder.append("n");
        currentLine = reader.readLine();
    }

    reader.close();
    assertEquals(expected_value, builder.toString());
}

9. Lesen aus der Datei mit Java 7

Java 7 führt eine neue Art der Arbeit mit Dateien und dem Dateisystem ein - nutzen wir diese zum Lesen von Dateien.

9.1. Lesen Sie eine kleine Datei mit Java 7

Der Inhalt der Datei:

 Hello world

Der folgende Code zeigt, wie kleine Dateien mit der neuen KlasseFilesgelesen werden:

@Test
public void whenReadSmallFileJava7_thenCorrect()
  throws IOException {
    String expected_value = "Hello world";

    Path path = Paths.get("src/test/resources/test_read.txt");

    String read = Files.readAllLines(path).get(0);
    assertEquals(expected_value, read);
}

Beachten Sie, dass Sie auch die MethodereadAllBytes()verwenden können, wenn Sie Binärdaten benötigen.

9.2. Lesen Sie eine große Datei mit Java 7

Wenn wir eine große Datei mit der KlasseFileslesen möchten, können wirBufferedReaderverwenden.

Der Inhalt der Datei:

 Hello world

Der folgende Code liest die Datei mit den neuen KlassenFiles undBufferedReader:

@Test
public void whenReadLargeFileJava7_thenCorrect()
  throws IOException {
    String expected_value = "Hello world";

    Path path = Paths.get("src/test/resources/test_read.txt");

    BufferedReader reader = Files.newBufferedReader(path);
    String line = reader.readLine();
    assertEquals(expected_value, line);
}

10. Fazit

Wie Sie sehen, gibt es viele Möglichkeiten, Daten mit Java aus einer Datei zu lesen. Sie könnenBufferedReader zeilenweise lesen,Scanner mit verschiedenen Trennzeichen lesen,StreamTokenizer eine Datei in Token einlesen,DataInputStream Binärdaten und primitive Daten lesen Typen,SequenceInput Stream zum Verknüpfen mehrerer Dateien zu einem Stream,FileChannel zum schnelleren Lesen aus großen Dateien usw.