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