先赞后看,Java进阶一大半
南哥在国外 stackoverflow 看到13年前的这么一个问题:如何使用 Java 逐行读取大型文本文件。大家有什么思路吗?评论区一起讨论讨论。
I need to read a large text file of around 5-6 GB line by line using Java.
How can I do this quickly?
最高赞的回答是名为Peter Lawrey的老哥回答的。

我是南哥,相信对你通关面试、拿下Offer有所帮助。
敲黑板:本文总结了Java I/O流、Java NIO常见的面试题!
⭐⭐⭐收录在《Java学习/进阶/面试指南》:https://github/JavaSouth
1. I/O流
1.1 I/O的理解
面试官:你说下对Java IO的理解?
Java I/O有两个参与对象,一个是I/O源端,一个是想要和I/O源端通信的各种接收端,比如程序控制IDEA控制台输出、读取文件A写入文件B等,我们程序要保证的就是IO流的顺利读取和顺利写入。JDK把对Java IO的支持都放在了package java.io包下,南哥数了数,一个有86个类和接口。
我们看下package java.io包最常用的Reader和Writer接口,他们的作者都是Mark Reinhold。这位老哥是谁?他是Oracle Java平台组的首席架构师,也是字符流读取器和写入器的首席工程师。这么有来头,看来Java I/O的程序设计不简单,我们可以从中学到不少好用的东西。
/**
* @author Mark Reinhold
* @since JDK1.1
*/
public abstract class Reader implements Readable, Closeable {
}
public abstract class Writer implements Appendable, Closeable, Flushable {
}
1.2 字节输入流抽象基类
面试官:那要怎么读取字节流?
我们先讲输入流,后面再讲下输出流。输入流又分为字节流和字符流,顾名思义,字节流按字节来读取,操作的数据单元是8位的字节;而字符流按字符来读取,操作的数据单元是16位的字符。
读取字节的抽象基类是InputStream,这个基类提供了3个方法给我们来读取字节流。
-
从输入流读取下一个数据字节,值字节以0到255范围内的
int返回。public abstract int read() throws IOException -
从输入流读取一定数量的字节并将它们存储到缓冲区数组
b中。public int read(byte b[]) throws IOException -
从输入流读取最多
len个字节的数据到字节数组中。public int read(byte b[], int off, int len) throws IOException
大家注意以上方法的返回参数都是int类型,当正常读取时,int返回的是读取的字节个数;而当int返回-1,就表明输入流到达了末尾。
1.3 字节输入流读取
面试官:你说的这些不是实例,我要的是能真正读取的?
上文的是抽象的接口,本身并不具备实际的功能。真正能够读取文件的是InputStream抽象基类的子类实现,例如文件流FileInputStream,有了他,我们读取音频、视频、gif等等都不是问题。
// 文件流读取文件
FileInputStream stream = new FileInputStream(SOURCE_PATH);
我们还可以在外面加一层缓存字节流来提高读取效率,在外层套上BufferedInputStream对象,为什么可以提高读取效率我下文会讲到。
BufferedInputStream stream = new BufferedInputStream(new FileInputStream(SOURCE_PATH));

最低0.47元/天 解锁文章
529

被折叠的 条评论
为什么被折叠?



