上一篇博客已经给大家介绍过什么是IO流,其中也提到了关于IO流的分类 点击链接查看博客--------> 什么是IO流
这篇博客主要了解关于Java标准库提供的最基本的输入输出流: InputStream 、 OutputStream
一、InputStream:
是Java提供的最基本的输入流,这个并不是一个接口而是一个抽象类,
这个类中最重要的方法就是 int read() : 读取输入流的下一个字节,并且返回字节表示的int值,返回-1表示到末尾不能继续读取了
😎 InputStream的基本用法:
1.//读取一个字节并以整数的形式返回(0~255),如果返回-1说明已经到输入流的末尾无法继续读取
int read() throws IOException
2.读取一系列字节,并存储到一个数组buffer中, 返回实际读取的字节数,如果读取前已经到输入流的末尾返回-1
int read(byte[] buffer) throws IOException
3.读取length个字节,并存储到一个字节数组buffer,从length位置开始,返回实际读取的字节数
int read(byte[] buffer,int offset, int length) throws IOException
4.关闭流释放内存资源
void close() throws IOException
😎 inputStream中最常用的一个子类: FileInputStream
顾名思义FileInputStream就是从文件流中读取数据,我们通过一个例子来延时如何完整的读取一个File的所有字节
public void readFile() throws IOException {
//创建一个FileInputStream 对象
InputStream input = new FileInputStream("src/readme.txt");
for(;;){
int n=input.read();//反复调用read()方法,直到返回-1
if(n == -1){
break;
}
System.out.println(n);//打印byte的值
}
input.close()//关闭流
}
//修改后的写法:因为上面的方法当出现异常的时候无法执行close
public void readFile() throws IOException {
InputStream input = null;
try {
input = new FileInputStream("src/readme.txt");
int n;
while ((n = input.read()) != -1) { // 利用while同时读取并判断
System.out.println(n);
}
} finally {
if (input != null) { input.close(); }
}
}
通过例子我们发现最后使用了 input.close 来关闭流,为什么要关闭流?
应用程序在运行的过程中,如果打开了一个文件进行读写,完成后要及时地关闭,以便让操作系统把资源释放掉,否则,应用程序占用的资源会越来越多,不但白白占用内存,还会影响其他应用程序的运行。
😎 缓冲区:
我们上面读取流的时候,每次只能读取一个字节,这样的效率很低。
我们可以利用InputStream提供的两个重载方法来支持读取多个字节:
int read(byte[] b); //读取若干字节并填充到byte[]数组,返回读取的字节数
int read(byte[] b, int off, int len); //指定byte[] 数组的偏移量 和最大填充数
例子:
public void readFile() throws IOException {
try (InputStream input = new FileInputStream("src/readme.txt")) {
// 定义1000个字节大小的缓冲区:
byte[] buffer = new byte[1000];
int n;
while ((n = input.read(buffer)) != -1) { // 读取到缓冲区
System.out.println("read " + n + " bytes.");
}
}
}
二、OutputStream 输出流
🍁 OutputStream的重要方法:
public abstract void write(int b) throws IOException
局限性: 这个方法会写入一个字节到输入流。
对于close的用法 OutputStream和InputStream的用法一样
特别注意:OutputStream提供了一个flush()方法,目的是将缓冲区的内容真正的输出到目的地
其中OutputStream中的子类 FileOutputStream
🍁FileOutputStream的基本用法:
FileOutputStream的例子:将若干字节写入文件流
public void writeFile() throws IOException{
OutputStream output = new FileOutputStream("out/readme.txt");
output.write(72); //H
output.write(101);//e
output.write(108);//I
output.close();
}
但是每次只能写入一个字节,太麻烦了,我们有一个好的重载方法
void Write(byte[]) ;
public void writeFile() throws IOException {
try (OutputStream output = new FileOutputStream("out/readme.txt")) {
output.write("Hello".getBytes("UTF-8")); // Hello
} // 编译器在此自动为我们写入finally并调用close()
}