java nio逐行读取

时间:2012-07-26 07:26:35

标签: java file nio

我需要使用java nio

逐行读取文件

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

但是nio没有类似readline()的方法来读取一行

请提供示例代码

9 个答案:

答案 0 :(得分:13)

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

完全免IO的两种方法:

  1. AWSLambdaRole, 返回一行行,它是.util包的一部分,而不是像bufferedReader那样的.io包。

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

  3. 欢呼声

答案 1 :(得分:6)

为什么呢? NIO不支持阅读线。

答案 2 :(得分: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);
}

答案 3 :(得分:3)

使用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();

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

它对我有用....

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

答案 6 :(得分:0)

只需使用:  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<String>。这是Java API提供的方法。可以咨询Javadoc以查看详细信息。因此,最相关的信息是:自Java 1.8以来存在Files.lines()。使用它。

答案 7 :(得分:0)

为支持上述EJP及其他内容,您可以参考以下文章:http://www.javaworld.com/article/2078654/java-se/java-se-five-ways-to-maximize-java-nio-and-nio-2.html

特别是: &#34;虽然NIO经常因其性能优势而受到提升,但更准确的说它是高度响应的。在某些情况下,NIO实际上比基本的Java I / O表现更差。例如,对于小文件的简单顺序读取和写入,直接流实现可能比相应的面向事件的基于通道的编码快两到三倍。此外,非多路复用通道(即单独线程中的通道)可能比在单个线程中注册其选择器的通道慢得多。&#34;

我要强调NIO 在某些情况下表现比基本Java I / O 差的说法。作者跟进了一系列问题,以便快速分析NIO是否是正确的选择。如果您(或下一个人)仍然决定继续使用NIO,那么使用代码示例就可以很好地解释它的使用。

答案 8 :(得分:0)

1)您可以使用lines方法将BufferedReader转换为Stream

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

正如DanielBraun在回答中指出的那样,您还可以使用readAllLines方法而不是lines方法,区别是直接来自文档:

  

与readAllLines不同,此方法不会将所有行读入List,   但是随着流的消耗而懒散地填充。

Java文档的package summary页提供了关于Streams的简洁明了的概述,并且此article还列出了Java中逐行读取文件的其他几种方式。