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 для более быстрого чтения из больших файлов и т. д.