Подтвердить что ты не робот

Java nio читается по строкам

Мне нужно прочитать файл строки за строкой, используя java nio

первая строка должна быть прочитана и должна произойти некоторая обработка

но nio не имеет метода, такого как readline(), чтобы прочитать строку на одном

просьба указать пример кода

4b9b3361

Ответ 1

NIO обычно используется как для прямого доступа к памяти, так и для передачи данных, передаваемых по блокам. Он выполняет другие функции, но другие функции больше связаны с блокировкой и неблокированием доступа к данным.

Таким образом, вы можете использовать NIO для быстрого доступа к данным (или неблокирующим образом); однако, если вы хотите "читать строки за строкой", вам лучше будет обслуживать, выполнив обнаружение линии после того, как NIO прочитает доступные данные. Это можно было бы легко реализовать, поставив фазу "чтение строки" над буфером, который только что прочитал NIO.

Ответ 2

Я понимаю, что вы, ребята, не любите ограничений, но в случае, если один из них не имеет доступа к IO-пакету или ему не разрешено импортировать его по какой-либо причине, верхний ответ не помогает...

Два способа сделать это полностью IO бесплатно:

  • java.nio.file.Files.lines, Возвращает поток строк, который является частью пакета .util, а не .io-пакета, такого как bufferedReader.

  • java.nio.file.Files.readAllLines, Возвращает коллекцию строк, которая является итерируемой. Продолжайте использовать iterator или for each для извлечения одной строки.

веселит

Ответ 3

Почему? NIO не поддерживает строки чтения. Вы можете читать миллионы строк в секунду с помощью BufferedReader.readLine(). Я полагаю, что этого достаточно.

Ответ 4

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

Ответ 5

Используя 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();

Ответ 6

В поддержку 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, есть хорошее объяснение его использования с примером кода.

Ответ 7

Это работает для меня....

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

Ответ 8

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

Ответ 9

просто используйте:  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. Используйте его.