«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, поэтому его должно быть легко импортировать и запускать как есть.