«1. Обзор

В этом уроке мы узнаем, как записывать в файл, а затем читать из файла с помощью Guava IO. Мы обсудим, как писать в файл.

2. Запись с использованием файлов

Давайте начнем с простого примера записи строки в файл с помощью файлов:

@Test
public void whenWriteUsingFiles_thenWritten() throws IOException {
    String expectedValue = "Hello world";
    File file = new File("test.txt");
    Files.write(expectedValue, file, Charsets.UTF_8);
    String result = Files.toString(file, Charsets.UTF_8);
    assertEquals(expectedValue, result);
}

Обратите внимание, что мы также можем добавить в существующий файл, используя Files.append() API.

3. Запись в файл с помощью CharSink

Далее — давайте посмотрим, как записать строку в файл с помощью CharSink. В следующем примере мы получаем CharSink из файла с помощью Files.asCharSink(), а затем используем его для записи:

@Test
public void whenWriteUsingCharSink_thenWritten() throws IOException {
    String expectedValue = "Hello world";
    File file = new File("test.txt");
    CharSink sink = Files.asCharSink(file, Charsets.UTF_8);
    sink.write(expectedValue);

    String result = Files.toString(file, Charsets.UTF_8);
    assertEquals(expectedValue, result);
}

Мы также можем использовать CharSink для записи нескольких строк в файл. В следующем примере мы пишем список имен и используем пробел в качестве разделителя строк:

@Test
public void whenWriteMultipleLinesUsingCharSink_thenWritten() throws IOException {
    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
    File file = new File("test.txt");
    CharSink sink = Files.asCharSink(file, Charsets.UTF_8);
    sink.writeLines(names, " ");

    String result = Files.toString(file, Charsets.UTF_8);
    String expectedValue = Joiner.on(" ").join(names);
    assertEquals(expectedValue, result.trim());
}

4. Запись в файл с использованием ByteSink

Мы также можем записывать необработанные байты с помощью ByteSink. В следующем примере мы получаем ByteSink из файла с помощью Files.asByteSink(), а затем используем его для записи:

@Test
public void whenWriteUsingByteSink_thenWritten() throws IOException {
    String expectedValue = "Hello world";
    File file = new File("test.txt");
    ByteSink sink = Files.asByteSink(file);
    sink.write(expectedValue.getBytes());

    String result = Files.toString(file, Charsets.UTF_8);
    assertEquals(expectedValue, result);
}

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

5. Чтение из файла с помощью файлов

Далее — давайте обсудим, как читать из файла с помощью файлов.

В следующем примере мы читаем все содержимое файла с помощью простой функции Files.toString():

@Test
public void whenReadUsingFiles_thenRead() throws IOException {
    String expectedValue = "Hello world";
    File file = new File("test.txt");
    String result = Files.toString(file, Charsets.UTF_8);

    assertEquals(expectedValue, result);
}

Мы также можем прочитать файл в список строк, как в следующем примере:

@Test
public void whenReadMultipleLinesUsingFiles_thenRead() throws IOException {
    File file = new File("test.txt");
    List<String> result = Files.readLines(file, Charsets.UTF_8);

    assertThat(result, contains("John", "Jane", "Adam", "Tom"));
}

Обратите внимание, что мы можем использовать Files.readFirstLine() для чтения только первой строки файла.

6. Чтение из файла с помощью CharSource

Далее — давайте посмотрим, как читать из файла с помощью CharSource.

В следующем примере мы получаем CharSource из файла с помощью Files.asCharSource(), а затем используем его для чтения всего содержимого файла с помощью read():

@Test
public void whenReadUsingCharSource_thenRead() throws IOException {
    String expectedValue = "Hello world";
    File file = new File("test.txt");
    CharSource source = Files.asCharSource(file, Charsets.UTF_8);

    String result = source.read();
    assertEquals(expectedValue, result);
}

Мы также можем объединить два CharSource и используйте их как один CharSource.

В следующем примере мы читаем два файла, первый из которых содержит «Hello world», а другой — «Test»:

@Test
public void whenReadMultipleCharSources_thenRead() throws IOException {
    String expectedValue = "Hello worldTest";
    File file1 = new File("test1.txt");
    File file2 = new File("test2.txt");

    CharSource source1 = Files.asCharSource(file1, Charsets.UTF_8);
    CharSource source2 = Files.asCharSource(file2, Charsets.UTF_8);
    CharSource source = CharSource.concat(source1, source2);

    String result = source.read();
    assertEquals(expectedValue, result);
}

7. Чтение из файла с использованием CharStreams

Теперь давайте посмотрим, как прочитать содержимое файла в строку, используя CharStreams, через посредника FileReader:

@Test
public void whenReadUsingCharStream_thenRead() throws IOException {
    String expectedValue = "Hello world";
    FileReader reader = new FileReader("test.txt");
    String result = CharStreams.toString(reader);

    assertEquals(expectedValue, result);
    reader.close();
}

8. Чтение из файла с помощью ByteSource

Мы можем использовать ByteSource для содержимого файла в необработанный формат байта — как в следующем примере:

@Test
public void whenReadUsingByteSource_thenRead() throws IOException {
    String expectedValue = "Hello world";
    File file = new File("test.txt");
    ByteSource source = Files.asByteSource(file);

    byte[] result = source.read();
    assertEquals(expectedValue, new String(result));
}

Мы также можем начать чтение байтов после определенного смещения, используя slice(), как в следующем примере:

@Test
public void whenReadAfterOffsetUsingByteSource_thenRead() throws IOException {
    String expectedValue = "lo world";
    File file = new File("test.txt");
    long offset = 3;
    long len = 1000;

    ByteSource source = Files.asByteSource(file).slice(offset, len);
    byte[] result = source.read();
    assertEquals(expectedValue, new String(result));
}

Обратите внимание, что мы можем использовать byteSource. asCharSource(), чтобы получить представление CharSource этого ByteSource.

9. Чтение из файла с помощью ByteStreams

Далее — давайте посмотрим, как читать содержимое файла в необработанный массив байтов с помощью ByteStreams; мы будем использовать промежуточный FileInputStream для выполнения преобразования:

@Test
public void whenReadUsingByteStream_thenRead() throws IOException {
    String expectedValue = "Hello world";
    FileInputStream reader = new FileInputStream("test.txt");
    byte[] result = ByteStreams.toByteArray(reader);
    reader.close();

    assertEquals(expectedValue, new String(result));
}

10. Чтение с использованием ресурсов

Наконец — давайте посмотрим, как читать файлы, которые существуют в пути к классам — используя утилиту Resources, как в следующий пример:

@Test
public void whenReadUsingResources_thenRead() throws IOException {
    String expectedValue = "Hello world";
    URL url = Resources.getResource("test.txt");
    String result = Resources.toString(url, Charsets.UTF_8);

    assertEquals(expectedValue, result);
}

11. Заключение

В этом кратком руководстве мы проиллюстрировали различные способы чтения и записи файлов с использованием поддержки ввода-вывода Guava и утилит.

Реализацию всех этих примеров и фрагментов кода можно найти в моем проекте Guava на github — это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть.