Мне нужно прочитать файл строки за строкой, используя java nio
первая строка должна быть прочитана и должна произойти некоторая обработка
но nio не имеет метода, такого как readline(), чтобы прочитать строку на одном
просьба указать пример кода
Мне нужно прочитать файл строки за строкой, используя java nio
первая строка должна быть прочитана и должна произойти некоторая обработка
но nio не имеет метода, такого как readline(), чтобы прочитать строку на одном
просьба указать пример кода
NIO обычно используется как для прямого доступа к памяти, так и для передачи данных, передаваемых по блокам. Он выполняет другие функции, но другие функции больше связаны с блокировкой и неблокированием доступа к данным.
Таким образом, вы можете использовать NIO для быстрого доступа к данным (или неблокирующим образом); однако, если вы хотите "читать строки за строкой", вам лучше будет обслуживать, выполнив обнаружение линии после того, как NIO прочитает доступные данные. Это можно было бы легко реализовать, поставив фазу "чтение строки" над буфером, который только что прочитал NIO.
Я понимаю, что вы, ребята, не любите ограничений, но в случае, если один из них не имеет доступа к IO-пакету или ему не разрешено импортировать его по какой-либо причине, верхний ответ не помогает...
Два способа сделать это полностью IO бесплатно:
java.nio.file.Files.lines
,
Возвращает поток строк, который является частью пакета .util, а не .io-пакета, такого как bufferedReader.
java.nio.file.Files.readAllLines
,
Возвращает коллекцию строк, которая является итерируемой.
Продолжайте использовать iterator
или for each
для извлечения одной строки.
веселит
Почему? NIO не поддерживает строки чтения. Вы можете читать миллионы строк в секунду с помощью BufferedReader.readLine().
Я полагаю, что этого достаточно.
Oracle представляет пример в учебнике. https://docs.oracle.com/javase/tutorial/essential/io/file.html#streams
Path file = ...;
try (InputStream in = Files.newInputStream(file);
BufferedReader reader =
new BufferedReader(new InputStreamReader(in))) {
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException x) {
System.err.println(x);
}
Используя java.nio.file.Files
, вы можете сделать:
Path path = FileSystems.getDefault().getPath("/path/to", "file.txt");
Files.lines(path).forEach(line ->
// consume line
);
Поскольку метод lines(path)
возвращает Stream
, вы можете использовать любой другой метод Stream API, например, чтение только первой строки (если она существует) с помощью:
Optional<String> firstLine = Files.lines(path).findFirst();
В поддержку EJP и других выше вы можете ссылаться на эту статью: http://www.javaworld.com/article/2078654/java-se/java-se-five-ways-to-maximize-java-nio-and-nio-2.html
В частности: "В то время как NIO часто пропагандируется за свои преимущества в производительности, более точно сказать, что он очень отзывчив. В некоторых случаях NIO фактически хуже, чем базовый Java I/O. Для простых последовательных чтений и записи небольших файлов, например, простой реализация потоков может быть в два-три раза быстрее, чем соответствующая ориентированная на события кодировка на основе каналов. Кроме того, не мультиплексированные каналы, то есть каналы в отдельных потоках, могут быть намного медленнее, чем каналы, которые регистрируют свои селекторы в одном нить".
Я бы выделил утверждение, что NIO В некоторых случаях [...] выполняет хуже, чем базовый Java I/O. Далее автор приводит список вопросов для быстрого анализа того, является ли NIO правильным выбором. Если вы (или следующий человек, чтобы прийти) все еще решает преследовать NIO, есть хорошее объяснение его использования с примером кода.
Это работает для меня....
public static void main(String[] args) throws IOException
{
RandomAccessFile aFile = new RandomAccessFile
("F:\\DetailsMy1.txt", "r");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1);
StringBuffer line = new StringBuffer();
while(inChannel.read(buffer) > 0)
{
buffer.flip();
for (int i = 0; i < buffer.limit(); i++)
{
char ch = ((char) buffer.get());
if(ch=='\r'){
System.out.print(line+"[EOL]");
line=new StringBuffer();
}else{
line.append(ch);
}
}
buffer.clear(); // do something with the data and clear/compact it.
}
inChannel.close();
aFile.close();
}
1) Вы можете конвертировать BufferedReader в поток, используя метод линий
List<String> list = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
list = br.lines().collect(Collectors.toList());
}
2) Получите поток напрямую, используя метод Files.lines:
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
stream
.filter(s -> s.endswith("/"))
.map(String::toUpperCase)
.forEach(System.out::println);
}
Как указывает ДаниэльБраун в своем ответе, вы также можете использовать метод readAllLines вместо метода линий, отличаясь от документов:
В отличие от readAllLines, этот метод не читает все строки в список, но вместо этого заполняется лениво, поскольку поток потребляется.
Страница сводки из документации по Java дает хороший и краткий обзор потоков, а в этой статье также перечислены несколько других способов сделать это.
просто используйте: https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#lines-java.nio.file.Path-
РЕДАКТИРОВАТЬ (humanreadable translation, касается MeetTitan): Это означает: используйте java.nio.file.Files.lines(Path)
- он возвращает Stream<String>
, представляющий строки файла. Это метод, предоставляемый Java API. Можно было бы проконсультироваться с Джавадоком, чтобы увидеть подробности. Поэтому самая важная информация: Files.lines()
существует с Java 1.8. Используйте его.