Java - чтение из файла

Java - чтение из файла

1. обзор

В этом руководстве мы рассмотрим различные способыread from a File in Java; мы будем использоватьBufferedReader,Scanner,StreamTokenizer,DataInputStream,SequenceInputStream иFileChannel.

Затем мы обсудим, как прочитать файл в кодировке UTF-8 и как создать строку из содержимого файла.

Наконец, мы рассмотрим новые методы чтения из файла в Java 7.

Эта статья является частьюthe “Java – Back to Basic” series здесь для примера.

2. Читать сBufferedReader

Начнем с простого способа чтения из файла с помощьюBufferedReader; сам файл содержит:

Hello world

Следующий код читает из файла с использованиемBufferedReader:

@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);
}

Обратите внимание, чтоreadLine() вернетnull, когда будет достигнут конец файла.

3. Читать сScanner

Затем давайте воспользуемсяScanner для чтения из файла - файл содержит:

Hello world 1

В качестве разделителя мы будем использовать простой пробел:

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

Обратите внимание, что разделителем по умолчанию является пробел, но можно использовать несколько разделителей сScanner.

4. Читать сStreamTokenizer

Затем давайте прочитаем текстовый файл в токены, используяStreamTokenizer.

Токенизатор работает следующим образом: сначала нам нужно выяснить, какой будет следующий токен - строка или число; мы делаем это, глядя на полеtokenizer.ttype.

Затем мы прочитаем фактический токен на основе этого типа:

  • tokenizer.nval - если тип был числом

  • tokenizer.sval - если тип был String

Файл просто содержит:

Hello 1

Следующий код читает из файла и строку, и число:

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

Обратите внимание, как маркер конца файла используется в конце.

5. Читать сDataInputStream

Мы можем использоватьDataInputStream для чтения двоичного или примитивного типа данных из файла.

Начнем с самого файла:

Hello

Следующий тест читает файл с использованиемDataInputStream:

@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. Читать сFileChannel

Если мы читаем большой файл,FileChannel может быть быстрее, чем стандартный ввод-вывод.

Содержание файла:

 Hello world

Следующий код считывает байты данных из файла, используяFileChannel иRandomAccessFile:

@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

Теперь давайте посмотрим, как читать файл в кодировке UTF-8, используяBufferedReader:

@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. Прочитать файл в строку

Мы можем эффективно использовать отStringBuilder доread the entire contents of a file into a String. Начнем с файла:

Hello world

Test line

Следующий код добавляет данные, считанные из файла, вStringBuilder построчно:

@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. Чтение из файла с помощью Java 7

Java 7 представляет новый способ работы с файлами и файловой системой - давайте воспользуемся им для чтения файлов.

9.1. Прочтите небольшой файл с помощью Java 7

Содержимое файла:

 Hello world

Следующий код показывает, как читать небольшой файл с помощью нового классаFiles:

@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);
}

Обратите внимание, что вы также можете использовать методreadAllBytes(), если вам нужны двоичные данные.

9.2. Прочтите большой файл с помощью Java 7

Если мы хотим прочитать большой файл с классомFiles, мы можем использоватьBufferedReader.

Содержимое файла:

 Hello world

Следующий код читает файл, используя новый классFiles иBufferedReader:

@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. Заключение

Как видите, существует много возможностей для чтения данных из файла с использованием простой Java. Вы можете выбратьBufferedReader для чтения построчно,Scanner для чтения с использованием разных разделителей,StreamTokenizer для чтения файла в токены,DataInputStream для чтения двоичных данных и примитивных данных типы,SequenceInput Stream для связывания нескольких файлов в один поток,FileChannel для более быстрого чтения из больших файлов и т. д.