文章目录
IO流概述
- 什么是IO流
I:input
O:output
通过IO就可以完成硬盘文件的读和写
硬盘中的文件加载到内存就是输入(Input)、
内存将使用或者修改过的文件再返回给硬盘就是输出(Output) - IO流分类?
有两种划分方式,一种是按照流的方向进行划分:
输入流:以内存为参照物,往内存中去,叫输入(Input
),或者叫做读(Read
)
输出流:以内存为参照物,从内存中出,叫输出(Output
),或者叫做写(Write
)
另一种方式是按照字符读取数据方式的不同进行分类:
字节流:按照字节的方式读取数据,一次读取1个字节byte
就是一次读取8个二进制,这种流非常万能,能读取任何类型的文件.包括:文本文件,图片,声音文件等…
字符流:按照字符方式进行读取数据的,一次读取一个字符,这种流是为了方便读取普通文本文件而存在的,这种流不能读取:图片、声音、视频等文件。只能读取纯文本文件,连word文件都无法读取.
Java是站在了前人的肩膀上向前眺望.更多的是应用层面的,对底层的东西了解的不多.可能C++多一些
Java中提供了哪些流?每个流的特点是什么?每个流对象上的常用方法有哪些??
- java IO流的四大家族:
四个家族首领:
java.io.InputStream 字节输入流
java.io.OutputStream 字节输出流
java.io.Reader 字符输入流
java.io.Writer 字符输出流
以Stream结尾都是字节流,以Reader/Wrider结尾都是字符流.
这四个首领全是抽象类(abstract class) - 所有流都实现了java.io.Closeable接口,都是可关闭的.
都有close方法
流就像是内存和硬盘之间的管道,用完之后一定要关闭,不然会耗费(占用)很多的资源.用完流之后一定要关闭 - 所有的输出流都实现了java.io.Flushable接口,都是可刷新的,都有flush()方法.
输出流在最终输出之后,必须刷新一下。
这个刷新就是将通道/管道当中剩余未输出的数据强行输出完(清空管道)
如果没有flush()可能会导致丢失数据。 - java.io包下需要掌握的16个流总结(部分了解即可):
文件专属:
java.io.FileInputStream(重点
)
java.io.FileOutputStream(重点
)
java.io.FileReader
java.io.FileWriter
转换流:(将字节流转换成字符流)
java.io.InputStreamReader
java.io.OutputStreamWriter
缓冲流专属:
java.io.BufferedReader
java.io.BufferedWriter
java.io.BufferedInputStream
java.io.BufferedOutputStream
数据流专属:
java.io.DataInputStream
java.io.DataOutputStream
标准输出流:
java.io.PrintWriter
java.io.PrintStream (重点
)
对象专属流:
java.io.ObjectInputStream (重点
)
java.io.ObjectOutputStream (重点
)
利用FileInputStream读取文件
- FileInputStream是文件字节输入流,万能,任何类型的文件都可以采用这个流来读
- 字节的方式,完成输入操作,完成读取操作(硬盘–>文件)
逐个字节读取
public static void main(String[] args)throws Exception{
FileInputStream file = new FileInputStream("C:\\Test\\temp");
int readData=file.read();
System.out.println(readData);//第一次读取到第一个字节
readData=file.read();
System.out.println(readData);//第二次读取到第二个字节
readData=file.read();
System.out.println(readData);//没有内容会读取到-1
}
直接将异常在main方法中抛出非常不规范,一般是try catch,如下面
public static void main(String[] args){
//如果在main方法中有编译异常,一般会try catch 不会throws抛出
//创建文件字节输入流对象
FileInputStream file= null;//文件路径在写入时,IDEA会自动把\变成\\
try {
file = new FileInputStream("C:\\Test\\temp");//我们在temp文件中提前写入内容:两个字母ab
//开始读取数据
int readData=file.read();//这个方法的返回值是:读取到的“字节”本身
System.out.println(readData);
readData=file.read();
System.out.println(readData);
//当读取到文件的末尾时,没有数据了会返回-1 继续读 还是返回-1
readData=file.read();
System.out.println(readData);
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}finally{
//在finally语句块中确保流一定关闭
if (file != null) {
//关闭流的前提是,流不是空,流是null没必要关闭
try {
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
用循环逐个读
public static void main(String[] args) throws Exception {
FileInputStream file=new FileInputStream("C:\\Test\\temp");
int readData=0;
while((readData=file.read())!=-1){
System.out.println(readData);
}
file.close();<