我需要使用java nio
逐行读取文件必须阅读第一行,并且必须进行一些处理
但是nio没有类似readline()的方法来读取一行
请提供示例代码
答案 0 :(得分:13)
我知道你们不喜欢限制,但是如果一个人要求无法访问IO包或者由于某种原因不允许导入它,那么最佳答案是没有用的......
完全免IO的两种方法:
AWSLambdaRole
,
返回一行行,它是.util包的一部分,而不是像bufferedReader那样的.io包。
java.nio.file.Files.lines
,
返回可迭代的行集合。
继续使用java.nio.file.Files.readAllLines
或iterator
提取单行。
欢呼声
答案 1 :(得分:6)
为什么呢? NIO不支持阅读线。 1}}你可以每秒读取数百万行。我建议这已经足够了。
答案 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中逐行读取文件的其他几种方式。