一、I/O简介
IO即Input和Output,即输入和输出。这里的输入和输出都是相对于内存来说的,具体见下图。
InputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。
字节是计算机存储容量的基本单位(Byte),1B=8b,二进制中占8位。
字符是文字或符号的统称。
字节流什么类型的文件都可以读取,字符流只能读取纯文本文件。
二、字节流
1、InputStream && OutputStream
InputStream 类图如下:
OutputStream类图如下:
从jdk8文档中,InputStream 方法如下:
OutputStream方法如下:
从 Java 9 开始,InputStream 新增加了多个实用的方法:
readAllBytes():读取输入流中的所有字节,返回字节数组。
readNBytes(byte[] b, int off, int len):阻塞直到读取 len 个字节。
transferTo(OutputStream out):将所有字节从一个输入流传递到一个输出流。
2、FileInputStream && FileOutputStream
我们日常使用的话,比较常见的就是FileInputStream了,其可直接指定文件路径,可以直接读取单字节数据,也可以读取至字节数组中。
FileInputStream 示例代码如下:
public static void main(String[] args) {
try {
FileInputStream fileInputStream = new FileInputStream("inputTest.txt");
//1、返回从该输入流中可以读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。
int available = fileInputStream.available();
System.out.println("available:" + available);
//2、跳过并丢弃来自此输入流的 2字节数据。
long skip = fileInputStream.skip(2);
System.out.println("skip:" + skip);
//3、读取文件内容,为了减少IO,我们创建一个Byte数组作为接收缓冲区
byte[] bytes = new byte[4];
int read;
//4、从输入流读取一些字节数,并将它们存储到缓冲区 b 。
while ((read = fileInputStream.read(bytes)) != -1) {
// 把byte数组转换成字符串
System.out.print(new String(bytes, 0, read));
}
if (fileInputStream != null) {
fileInputStream.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace(