转换流
是字符流和字节流之间的桥梁
转换输入流 InputSteamReader
转换输出流 OutputStreamWriter
作用1:指定字符集读写(JDK 11之后淘汰)
JDK11之后可直接用字节流的构造方法//指定GBK的编码 读取数据 FileReader fr= new FileReader(File fileName , Charset.forName ("GBK")); //指定GBK的编码 写入数据 FileWriter fr= new FileWriter(File fileName , Charset.forName("GBK"));
作用2:字节流想要使用字符流中的方法
序列流和反序列化流
序列化流/对象操作输出流: 可以将java中的对象写到本地文件中
//构造方法 将基本流包装为高级流
public ObjectOutputStream (OutputStream out)
//常用成员方法 将对象序列化(写出)到文件中去
public final void writeObject (Object obj)
Tips:使用对象输出流将对象保存在本地文件时会出现 NotSerializableException 异常,此时需要让JavaBean类实现 Serializable 接口
Serializable 接口里面没有抽象方法,是一个标记型接口,一旦实现了这个接口,就表示当前JavaBean类可以被序列化
序列化之后的文件不可更改,否则反序列化时,代码会报错
若是对象的成员变量中有不想被序列化的成员属性,可以使用 transient 关键字修饰
反序列化流/对象操作输入流:可以把序列化到本地文件中的对象,读取到程序中来
//构造方法 将基本流包装为高级流
public ObjectInputStream (InputStream out)
//常用成员方法 将序列化到本地文件中的对象,读取到程序中来
public final void readObject (Object obj)
为了防止序列化对象之后,修改JavaBean类造成反序列化代码和已经序列化写入文件中的原代码不符,造成的UID不符。可以给JavaBean类添加一个 serialVersinUID
private static final long serialVersionUID=xxxxxL;
serialVersinUID 尽量在所有成员属性及方法写完之后再写
在序列化对象过程中,为了防止不知道到底序列化里几个,可以将所有将要序列化的对象放在一个集合中,因为集合实现了 Serializable 接口,可以直接被序列化到文件中
反序化时可以用相应泛型的集合接受反序列化的对象,之后增强for循环输出
打印流
打印流没有输入流,只有输出流
分类:打印流一般是指 PrintStream(字节打印流),Printwriter(字符打印流)两个类
特点1:打印流之操作文件目的地,不操作数据源
特点2:特有的写出方法,可以实现,数据原样写出
特点3:特有的写出方法,可以实现自动换行,自动刷新
//字节打印流/字符打印流 构造方法
//关联字节输出流/文件/文件路径
public PrintStream(OutoutStream/File/Striing)
//指定字符编码
public PrintStream(Striing fileName, Charset charset)
//自动刷新
public PrintStream(OutoutStream out, boolean antoFlush)
//指定字符编码且自动刷新
public PrintStream(OutoutStream out, boolean antoFlush,String encoding)
//字节打印流/字符打印流 常用成员方法
//常规方法:将指定字节写出
public void write(int b)
//特有方法:打印任意数据,自动刷新,自动换行
public void println(xxx xxx)
//特有方法:打印任意数据,不换行
public void print(xxx xxx)
//特有方法:带有占位符的打印语句,不换行(类似于C语言的输出语句)
public void printf(String format, Object...args)
由于字节打印流没有缓冲区,所以自动刷新开不开都一样,但字符打印流有缓冲区,如果需要自动刷新,一定要自己手动开启
System.out,println()
特殊的打印流:系统的标准输出流,此打印流在虚拟机启动的时候,由虚拟机创建,默认指向控制台,不能关闭,在系统中是 唯一的
解压缩流/压缩流
压缩流是ZipOutputStream
解压缩流是ZipInputStream
在Java中 压缩包中每一个文件都是一个ZipEntry对象,Java中也只能识别.zip后缀的压缩包
在Java中解压的本质 就是把每一个ZipEntry按照层级拷贝到本地的另一个文件夹中
ZipEntry的操作有点像迭代器
先通过ZipInputStream打开文件
ZipInputStream zip=new ZipInputStream(InputStream in);
之后操作 ZipEntry 的 getNextEntry() (读取下一个 ZIP 文件条目并将流定位到该条目数据的开始处)方法进行判断,是文件夹还是文件,按照层级结构一个一个拷贝要先有文件夹,才可以创建文件夹中的文件
在解压缩过程中间注意读入文件的编码与当前默认的编码是否一致,还要注意压缩包中文件夹不要为中文命名,否则会有报错
在Java中压缩的本质 就是把每一个(文件/文件夹)看成ZipEntry对象放到压缩包中
先创建压缩流关联压缩包注意文件路径格式
ZipOutoutStream zos=new ZipOutputStream(new FileOutputStream(new File(String 父级路径,String 子级路径)));
之后创建ZipEntry表示压缩包中每一个文件和文件夹并放入压缩包中
ZipEntry entry=new ZipEntry(File file); zos.putNextEntry(entry);
最后通过字节输出流,将原文件中数据写到压缩包中,之后执行 closeEntry()方法结束当前文件的拷贝并接着循环判断 getNextEntry()方法接着压缩,结束时释放资源