目录
1.缓冲流
a.字节缓冲流
1.构造方法
2.常见方法
3.底层原理
b.字符缓冲流
1.构造方法
2.特有方法
2.转换流
a.概述
b.编码问题
c.InputStreamReader类
1.概述
2.构造方法
d.OutputStreamWrite类
1.概述
2.构造方法
3.序列化流
a.概述
b.ObjectOutputStream类
1.概述
2.构造方法
3.序列化操作
c.ObjectInputStream流
1.概述
2.构造方法
3.反序列化操作
4.打印流
a.概述
b.字节打印流
1.构造方法
2.常用方法
c.字符打印流
1.构造方法
2.常用方法
5.压缩流/解压缩流
a.概述
b.解压缩流
c.压缩流
1.创建File对象表示要压缩的文件夹和压缩包的位置
2.创建压缩流关联压缩包
3.定义一个方法用来文件夹压缩
6.Commons-io工具包
a.概述
b.使用方式
c.常见方法
7.Hutool工具包
a.概述
b.使用方法
c.常见方法
1.缓冲流
a.字节缓冲流
1.构造方法
字节缓冲输入流的构造方法:
字节缓冲输出流构造方法:
2.常见方法
一次读取一个字节:
一次读取一个字节数组:
一次写入一个字节:
一次写入一个字节数组:
关闭流:
3.底层原理
b.字符缓冲流
1.构造方法
字符缓冲输入流的构造方法:
字符缓冲输出流构造方法:
2.特有方法
字符缓冲输入流特有方法:
字符缓冲输出流特有方法:
关闭字符缓冲流:
2.转换流
a.概述
是字符流和字节流之间的桥梁
b.编码问题
在IDEA中,使用FileReader 读取项目中的文本文件。由于IDEA的设置,都是默认的UTF-8编码,所以没有任何问题。但是,当读取Windows系统中创建的文本文件时,由于Windows系统的默认是GBK编码,就会出现乱码。
案例:
import java.io.*;class Main{public static void main(String[] args) throws IOException {FileReader fileReader = new FileReader("D:\\bbbb\\转化之后.txt");int ch;while ((ch=fileReader.read())!=-1){System.out.print((char)ch);}fileReader.close();}
}
运行结果:
c.InputStreamReader类
注意:这种做法是JDK11之前的,JDK11及之后使用FileReader指定字符集。
1.概述
转换流java.io.InputStreamReader,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。
2.构造方法
创建一个使用默认字符集的字符流:
创建一个指定字符集的字符流:
d.OutputStreamWrite类
1.概述
转换流java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。
2.构造方法
创建一个使用默认字符集的字符流:
创建一个指定字符集的字符流:
3.序列化流
a.概述
Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据、对象的类型和对象中存储的数据信息,都可以用来在内存中创建对象。
b.ObjectOutputStream类
1.概述
java.io.ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。
2.构造方法
OutputStream 将基本流变成高级流
3.序列化操作
一个对象要想序列化,必须满足两个条件:
1.该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。
2.该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。
实例:
import java.io.Serializable;public class Student implements Serializable {private int id;private String name;private int age;public Student() {}public Student(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}/*** 获取* @return id*/public int getId() {return id;}/*** 设置* @param id*/public void setId(int id) {this.id = id;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{id = " + id + ", name = " + name + ", age = " + age + "}";}
}
写出对象方法:
c.ObjectInputStream流
1.概述
可以把序列化到本地文件中的对象,读取到程序中来
2.构造方法
3.反序列化操作
注意:当修改了JavaBean类时,程序在反序列化时就会报错。原因是序列化时生成的版本号(serialVersionUID)与反序列化时的版本号不一致。
transient(瞬态关键字·):当字段被transient修饰,不会把当前属性序列化到本地文件中
4.打印流
只有写,没有读
a.概述
当修改了JavaBean类时,程序在反序列化时就会报错。原因是序列化时生成的版本号(serialVersionUID)与反序列化时的版本号不一致。
b.字节打印流
1.构造方法
关联字节输出流/文件/文件路径:
指定字符编码:
自动刷新:
指定字符编码且自动刷新:
2.常用方法
指定字节输出:
打印任意数据,自动刷新,自动换行:
打印任意数据,不换行:
带有占位符的打印语语句,不换行:
c.字符打印流
1.构造方法
关联字节输出流/文件/文件路径:
指定字符编码:
自动刷新:
指定字符编码且自动刷新:
2.常用方法
指定字节输出:
打印任意数据,自动刷新,自动换行:
打印任意数据,不换行:
带有占位符的打印语语句,不换行:
5.压缩流/解压缩流
a.概述
压缩是一种通过特定算法来减少数据文件占用存储空间的技术啦。它可以把原本很大的文件变得很小,这样存储和传输起来就更方便啦。
b.解压缩流
如果想要解压,在电脑中首先要有一个压缩包,这个压缩包需要是 zip 作为后缀的,因为Java中只能识别这个格式的。
压缩包里面的每一个文件 在Java中都是一个 ZipEntry对象。
因此解压的本质:把每一个 ZipEntry 按照层级拷贝到本地另一个文件夹中。
解压缩流的名字叫做 ZipInputStream,Zip 是它的作用,表示跟压缩包是有关系的;InputStream 表示它是用来读取的。
案例1:
Count.zip:
新建文件夹:
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;class Main{public static void main(String[] args) throws IOException {File src = new File("D:\\aaaa\\Count.zip");File dest = new File("D:\\aaaa");unzip(src,dest);}private static void unzip(File src, File dest) throws IOException {ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(src));for (int i = 0; i < 20; i++) {ZipEntry nextEntry = zipInputStream.getNextEntry();System.out.println(nextEntry);}zipInputStream.close();}}
运行结果:
结论:当我们将压缩包里面的所有文件和文件夹都获取完毕了,这个时候再强行获取,就会返回 null。
实例:
Count.zip:
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;class Main{public static void main(String[] args) throws IOException {//压缩文件对象File src = new File("D:\\aaaa\\Count.zip");//解压缩文件对像File dest = new File("D:\\aaaa");unzip(src,dest);}private static void unzip(File src, File dest) throws IOException {//创建文件解压流ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(src));ZipEntry zipEntry;while ((zipEntry=zipInputStream.getNextEntry())!=null){//文件为文件夹if(zipEntry.isDirectory()){//创建一个文件名与解压缩文件相同的文件File file = new File(dest, zipEntry.getName());//创建文件夹file.mkdirs();}//文件不为文件夹else {//接收文件File file = new File(dest, zipEntry.getName());//输出文件流FileOutputStream fileOutputStream = new FileOutputStream(file);//接收数据int b;while ((b=zipInputStream.read())!=-1){//写入解压出来的数据fileOutputStream.write(b);}//关闭输出流fileOutputStream.close();//压缩包中的一个文件处理完毕,需调用closeEntry()zipInputStream.closeEntry();}}//关闭解压缩流zipInputStream.close();}}
运行结果:
c.压缩流
1.创建File对象表示要压缩的文件夹和压缩包的位置
//创建文件File src = new File("D:\\aaaa\\Count");//创建压缩包的文件File parentFile = src.getParentFile();File dest = new File(parentFile, src.getName() + ".zip");
2.创建压缩流关联压缩包
//创建压缩流关联压缩包ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(dest));
3.定义一个方法用来文件夹压缩
作用:获取src里面的每一个文件,变成ZipEntry对象,放入到压缩包中
参数一:数据源
参数二:压缩流
参数三:压缩包内部路径
private static void decompression(File src,ZipOutputStream zipOutputStream,String name)
a.进入src文件夹,遍历数组
//进入src文件夹,取出所有文件/文件夹放入数组中File[] files = src.listFiles();//遍历数组for (File file : files) {}
b.判断数组中的每一个元素,如果为文件,变成ZipEntry对象,放入到压缩包当中(这里相当于搭框架),同时读取文件中的数据,写到压缩包(这里为填充数据),如果是文件夹,则继续递归。
注意: ZipEntry entry = new ZipEntry() 代表的是在压缩包内部的路径
//遍历数组for (File file : files) {//file为文件if(file.isFile()){//创建zipEntry对象ZipEntry zipEntry = new ZipEntry(name + "\\" + file.getName());//将zipEntry对象放入到压缩包中zipOutputStream.putNextEntry(zipEntry);//创建字节输出流对象FileInputStream fileInputStream = new FileInputStream(file);int b;while ((b=fileInputStream.read())!=-1){//向压缩包写入数据zipOutputStream.write(b);}fileInputStream.close();zipOutputStream.closeEntry();}//file为文件夹else {//递归decompression(file,zipOutputStream,name+"//"+file.getName());}}
完整代码:
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;class Main{public static void main(String[] args) throws IOException {//创建文件File src = new File("D:\\aaaa\\Count");//创建压缩包的文件File parentFile = src.getParentFile();File dest = new File(parentFile, src.getName() + ".zip");//创建压缩流关联压缩包ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(dest));decompression(src,zipOutputStream,src.getName());zipOutputStream.close();}private static void decompression(File src,ZipOutputStream zipOutputStream,String name) throws IOException {//进入src文件夹,取出所有文件/文件夹放入数组中File[] files = src.listFiles();//遍历数组for (File file : files) {//file为文件if(file.isFile()){//创建zipEntry对象ZipEntry zipEntry = new ZipEntry(name + "\\" + file.getName());//将zipEntry对象放入到压缩包中zipOutputStream.putNextEntry(zipEntry);//创建字节输出流对象FileInputStream fileInputStream = new FileInputStream(file);int b;while ((b=fileInputStream.read())!=-1){//向压缩包写入数据zipOutputStream.write(b);}fileInputStream.close();zipOutputStream.closeEntry();}//file为文件夹else {//递归decompression(file,zipOutputStream,name+"//"+file.getName());}}}}
6.Commons-io工具包
a.概述
Commons是apache开源基金组织提供的工具包,里面有很多帮助我们提高开发效率的API,比如:
StringUtils:字符串工具类
NumberUtils:数字工具类
ArrayUtils:数组工具类
RandomUtils:随机数工具类
DateUtils:日期工具类
StopWatch:秒表工具类
ClassUtils:反射工具类
SystemUtils:系统工具类
MapUtils:集合工具类
Beanutils:bean工具类
Commons-io:io的工具类
其中Commons-io是apache开源基金组织提供的一组有关IO操作的开源工具包,用于提高IO流的开发效率。
b.使用方式
1.新建lib文件夹
2.把第三方jar包粘贴到文件夹中
3.右键点击add as a library
关联成功标志:
c.常见方法
FileUtils类static void copyFile(File srcFile, File destFile) 复制文件static void copyDirectory(File srcDir, File destDir) 复制文件夹static void copyDirectoryToDirectory(File srcDir, File destDir) 复制文件夹static void deleteDirectory(File directory) 删除文件夹static void cleanDirectory(File directory) 清空文件夹static String readFileToString(File file, Charset encoding) 读取文件中的数据变成成字符串static void write(File file, CharSequence data, String encoding) 写出数据IOUtils类public static int copy(InputStream input, OutputStream output) 复制文件public static int copyLarge(Reader input, Writer output) 复制大文件public static String readLines(Reader input) 读取数据public static void write(String data, OutputStream output) 写出数据
7.Hutool工具包
官网:https://hutool.cn/
API文档:https://plus.hutool.cn/apidocs/
中文使用文档:https://doc.hutool.cn/pages/index/
a.概述
Commons是国人开发的开源工具包,里面有很多帮助我们提高开发效率的API,比如:
DateUtil:日期时间工具类
TimeInterval:计时器工具类
StrUtil:字符串工具类
HexUtil:16进制工具类
HashUtil:Hash算法类
ObjectUtil:对象工具类
ReflectUtil:反射工具类
TypeUtil:泛型类型工具类
PageUtil:分页工具类
NumberUtil:数字工具类
b.使用方法
1.新建lib文件夹
2.把第三方jar包粘贴到文件夹中
3.右键点击add as a library
关联成功标志:
c.常见方法
根据参数创建一个file对象:
根据参数创建文件(父级路径可以不存在):
把集合中的数据写出到文件中,覆盖模式:
把集合中的数据写出到文件中,续写模式:
指定字符编码,把文件中的数据,读到集合中: