Перейти к основному содержимому

Гуава — запись в файл, чтение из файла

· 5 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Обзор

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

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

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

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

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

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.asCharSink() .

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 IO.

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