java nio逐行读取

我需要使用java nio逐行读取文件

必须阅读第一行,并且必须进行一些处理

但是nio没有像readline()这样的方法来读取一行

请提供示例代码

NIO通常用于执行直接内存访问或块介导的批量数据传输。 它确实做了其他事情,但其他function更多地与阻塞和非阻塞数据访问有关。

因此,您可能希望使用NIO快速获取数据(或以非阻塞方式); 但是,如果你想“逐行阅读”,那么在NIO读入可用数据后进行线路检测会更好。 这可以通过在NIO刚读取的缓冲区上放置“行读取”外观来轻松实现。

我知道你们不喜欢限制,但是如果一个人要求无法访问IO包或者由于某种原因不允许导入它,那么最佳答案是没有用的…

完全免IO的两种方法:

  1. java.nio.file.Files.lines ,返回一行行,它是.util包的一部分,而不是像bufferedReader那样的.io包。

  2. java.nio.file.Files.readAllLines ,返回可迭代的行集合。 继续使用iteratorfor each iterator提取单行。

干杯

为什么? NIO不支持阅读线。 您可以使用BufferedReader.readLine().每秒读取数百万行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 firstLine = Files.lines(path).findFirst(); 

这个对我有用….

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

只需使用: https : //docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#lines-java.nio.file.Path-

编辑(人类可读的翻译,关于MeetTitan的问题):这意味着:使用java.nio.file.Files.lines(Path) – 它返回表示文件行的Stream 。 这是Java API提供的方法。 可以咨询Javadoc以查看详细信息。 因此,最相关的信息是:自Java 1.8以来, Files.lines()存在。 用它。

为支持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,那么使用代码示例就可以很好地解释它的用法。