按传输数据类型分 字节流 每次读取一字节 和 字符流 每次读取两个字节
Unicode 是2个字节表示一个字符
UTF-8 是Unicode升级版,会
1.字节流 Input就是读进内存,Output就是写进硬盘
- 输入流 InputStream 抽象类
- 输出流 OutputStream 抽象类
- 对文件的读写功能主要分为三阶段
- 建立输入流/输出流
- 对流的操作
- 关闭流
输入流
graph TD
a[InputStream抽象类]-->b[FileInputStream]
FileInputStream fs = new FileInputStream(String PathName); //通过完整文件路径创建流对象
FileInputStream fs = new FileInputStream(File FileObj); //通过File对象创建流对象
close() //关闭流
read() //读取一个字节
read(byte[] b) //读取b.length长度个字节,在某些输入可用之前此方法将阻塞
available() //下次将不受阻塞的读取剩余字节或b.length个字节
输出流
graph TD
a[OutputStream抽象类]-->b[FileInputStream]
//通过完整文件路径创建流对象
FileOutputStream fs = new FileOutputStream(String PathName);
//通过完整文件路径创建流对象,是否追加写入
FileOutputStream fs = new FileOutputStream(String PathName,boolean append);
//通过File对象创建流对象
FileOutputStream fs = new FileOutputStream(File FileObj);
//通过File对象创建流对象,是否追加写入
FileOutputStream fs = new FileOutputStream(File FileObj);
flush() //强制写出所有缓冲区的字节
close() //关闭流
write(int b) //将指定字节写入文件
write(byte[] b) //将b.length个字节从b中写入文件
2.字符流
主要操作文本文件,
graph TD
a[Reader抽象类]-->b[InputStreamReader]
b-->d[FileStream]
read(char[] c) //读取c.length长度的字符流对象
graph LR
A[字符流]-->B[OutputStreamWriter]
B-->C[字节流]
graph RL
A[字节流]-->B[InputStreamReader]
B-->C[字符流]
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputStream out,Charset cs) //创建指定编码的处理流
InputStreamReader(InputStream in)
InputStreamReader(InputStream in,Charset cs) //创建指定编码的处理流
- 应为这两个流为处理流所以必需建立在 节点流 之上
BufferedReader 和 BufferedWriter
graph LR
A[BufferedWriter]-->B[OutputStreamWriter]
B-->C[FileOutputStream]
graph RL
A[FileInputStream]-->B[InputStreamReader]
B-->C[BufferedReader]
BufferedReader(Reader in)
BufferedReader(Reader in,int sz) //创建一个指定大小的缓冲区,存储字符流
这是一个处理流,必须依赖节点流 readLine() 读取一行
BufferedWriter(Writer out)
BufferedWriter(Writer out,int sz) //创建一个指定大小的缓冲区,存储字符流
这是一个处理流,必须依赖节点流 newLine() 另起一行
DataInputStream 和 DataOutputStream 都是处理流
分别实现了DataInput 和 DataOutput 接口
着两个接口分别声明了,获取字节并转化为基本数据类型和按照规定把基本数据类型转化为字节
ObjectInputStream 和 ObjectOutputStream 处理流
ObjectOutputStream //把对象直接转化为字节对象,称为序列化
- 被序列化的类必须实现 Serializable接口
- 设置一个
private static final long serialVersionUID = 一大串数字 ;
//因为不设置这个的话,那么每次序列化jvm都会自动生成一个,
//那么从同一个文件读取对象时因为serialVersionUID的不同,抛出一个 InvalidClassException异常
readObject();读取对象
ObjectInputStream //把字节转化直接转化为对象,称为反序列化
writeObject(); //写入对象
标准流
是位于java.lang包
- 标准输入流 System.in
- 标准输出流 System.out
- 标准错误输出流 System.err
//获取键盘上的输入并输出屏幕
InputStream worldByte = System.in; //通过InputStream接受键盘输入的字节数据
//把字节数据转换为字符数据
InputStreamReader world = new InputStreamReader(worldByte);
//把字符数据储存在字符缓冲池
BufferedReader worlds = new BufferedReader(world);
try{
System.out.println(worlds.readLine()); //读取一行
}catch(IOException e){ //可能抛出IOException
e.printStackTrace();
}
Scanner scan = new Scanner(new InputStreamReader(System.in));
Scan.next();
其他流
RandomAccessFile 对磁盘文件进行随机访问
这个又有点类似于python的open函数
- 没有继承InputStream 和 OutputStream
- 实现了DataInput和DataOutput接口
- 同时拥有读写文件的操作
- 只支持文件类型的定位访问,不支持内存网络等数据流的搜索
public RandomAccessFile(String name,STring mode) //指定文件,和打开方式
public RandomAccessFile(File file,STring mode) //通过File对象指定文件,和打开方式
PrintWriter 处理流
- 主要用于向文本输出流打印对象的格式化表示
// 演示了利用PrintWriter进行的文件复制功能
public void demo(){
BufferedReader buffRead = null;
BufferedWriter buffWrite = null;
try{
buffRead = new BufferedReader(new FileReader("s.txt"));
buffWrite = new BufferedWriter(new FileWriter("333333.txt"));
PrintWriter pw = new PrintWriter(buffWrite);
String s = null;
while ((s = buffRead.readLine()) != null){
pw.println(s);
pw.flush();
}
System.out.print("复制完成");
}catch(Exception e){
e.printStackTrace();
}
}
内存流
-
ByteArrayInputStream
-
ByteArrayOutputStream
- 速度快
- 主要是针对内存缓冲区的操作,先在内部创建一个byte数组然后向数组内读取或写入
- 数据缓冲区会随着数据而不断增大
线程流
- PipeInputStream
- PipeOutputStream
-
主要用于两个独立线程之间的通信
压缩流 处理流
-
ZipInputStream
-
ZipOutputStream
-
GZIPInputStream
-
GZIPOutputStream
-
CheckedOutputStream 冗余验证流 CRC方式
Zip 和 GZIP 只是算法的不同
FileOutputStream fos = new FileOutputStream("路径");
CheckedOutputStream check = new CheckedOutputStream(fos,new CRC32());
ZipOutputStream zos = new ZipOutputStream(check);
zos.putNextEntry(new ZipEntry("ff.txt"));
String text = "被写数据";
zos.write(text.getBytes());