9.字节缓冲流(输出流)
基本思路: 1.了解 BufferedOutputStream 字节输出流 2.先创建文件输出流 3.然后创建文件缓冲输出流,并且把文件加载到缓冲流 4.通过缓冲流写文件的时候, 一定一定要进行 flush(); 否则不能显示. 5.写入文件的时候,可以不用创建文件的名字,函数会帮助我们自动创造一个文件。 但是读取文件的名字的时候,我们一定要一个确定的名字
import java.io.BufferedOutputStream; import java.io.FileOutputStream; public class Demo5 { public static void main(String[] args) throws Exception{ //1.创建物件输出 FileOutputStream fileOutputStream=new FileOutputStream("e://1234.txt"); //2.创建文件缓冲 BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(fileOutputStream); //3.写入文件 for (int i = 0; i <10 ; i++) { bufferedOutputStream.write("hello world".getBytes()); //首先写入缓冲区 bufferedOutputStream.flush(); //刷新硬盘 } bufferedOutputStream.close(); fileOutputStream.close(); } }
(四)、对象流(ObjectInputStream)
10.对象流
1.对象流: ObjectOutputStream/ObjectInputStream 2.增强了缓冲区的功能 3.增强了读写8种基本数据类型和字符串功能 4.增强了读写对象的功能: readObject() 从流种读取一个对象 writeObject()向流中写入一个对象. 5.内存写入硬盘中 这叫做序列化 6.硬盘读取到内存中 这叫做反序列化.
在这里插入代码片
11.ObjectOutputStream (序列化 Serializable)
基本思路: 1.首先我们要创造一个文件输出流 2.再创建一个对象输出流,并且把文件放入到对象输出流中去 3.利用文件输出流的 writeObject() 把对象写进去 4.进行刷新硬盘的操作 5.如果要对一个对象进行序列化的操作 必须要实现一个接口 Serializable
import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.nio.charset.StandardCharsets; public class Demo6 { public static void main(String[] args) throws Exception { //1.创建文件的输出流 FileOutputStream fileOutputStream=new FileOutputStream("e://2022.bin"); //2.创建对象流 ObjectOutputStream objectOutputStream=new ObjectOutputStream(fileOutputStream); //3.开始序列化的操作 Student student=new Student("张三",20); objectOutputStream.writeObject(student); //4.刷新 objectOutputStream.flush(); //5.关闭的草走 objectOutputStream.close(); fileOutputStream.close(); } }
import java.io.Serializable; public class Student implements Serializable { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } }
12.ObjectInputStream (反序列化)
基本思路: 1.了解ObjectInputStream 2.需要强制转换文件的类型
import java.io.FileInputStream; import java.io.ObjectInputStream; public class Demo6 { public static void main(String[] args) throws Exception { //1.创建文件的输入流 FileInputStream fileInputStream=new FileInputStream("e:\\2022.bin"); //2.创建对象流 ObjectInputStream objectInputStream=new ObjectInputStream(fileInputStream); //3.读取文件 Student student=(Student) objectInputStream.readObject(); //4.关闭文件 fileInputStream.close(); objectInputStream.close(); System.out.println(student.toString()); } }
import java.io.Serializable; public class Student implements Serializable { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } }
13.序列化与反序列化的注意事项
(1).序列化类必须实现 Serializable 接口 (2).序列化类中的对象属性实现 Serializable 接口 eg: Address address; 这个也要实现接口 (3).序列化版本ID,保证序列化的类和反序列化的类是同一个类 (4).使用transient(瞬间的,瞬时的),修饰的属性,那么这个属性不能进行序列化(5).静态属性也不能进行序列化. (6).可以序列化多个对象.
(五)、字符编码
14.字符编码
1.ISO-8859-1 收录除Ascll外,还包西欧。希腊语。台语、阿拉伯语、希伯来语对应的文字符号 2.UTF-8 针对UNicode码表的可变长度字符编码 3.GB2312 简体中文 4.GBK 简体中文扩充 5.BIG5 台湾,繁体中文 当编码方式和解码方式不一致的时候,会出现乱码.
15.字符流抽象类
1.字符码:是char类型的. 2.字符流的父类:(抽象类) (1).Reader: 字符输入流 public int read(){} (2).Writer:字符输出流 public void write(){}
import java.io.FileInputStream; public class Demo7 { public static void main(String[] args) throws Exception { //1.创建文件的输入操作 FileInputStream fileInputStream=new FileInputStream("e:\\123.txt"); //2.进行读写的操作 int date=0; while ((date=fileInputStream.read())!=-1){ System.out.print((char)date); } fileInputStream.close(); } }
假如说文本文档存的是汉字,那么将会输出乱码
(六)、文件字符流(FileReader和FileWriter)
16.文件字符流
文件字符流属于自动匹配类型 不用考虑文件的字符编码 FileReader: public int read(char[] c) //从流中读取多个字符,将读到内容存入c数组,返回 实际读到的字符数;如果达到文件的尾部,就返回-1; FileWriter: public void write(String str) //一次写多个字符,将b数组种所有字符,写入输出流
17.文件字符输入流
基本思路: 1.首先创建一个文件字符输入流 2.读取文件
import java.io.FileReader; public class Demo8 { public static void main(String[] args) throws Exception{ //1.创建FilerReader 文件字符输入流 FileReader fileReader=new FileReader("e:\\123.txt"); //2.读取,单个字符读取 int date=0; while ((date=fileReader.read())!=-1){ //这个就是读取文中的一个字符 (3个字节) System.out.println((char)date); } System.out.println(date); /* char[]buf=new char[1024]; int count=0; while ((count=fileReader.read(buf))!=-1){ //读取完毕之后放入到 字符数组中 System.out.println(new String(buf,0,count)); //目的是为了截取有效的参数 } */ //3.关闭 fileReader.close(); } }
18.文件字符输出流
基本思路: 1.
import java.io.FileOutputStream; import java.io.FileWriter; public class Demo9 { public static void main(String[] args) throws Exception{ //设置文件输出流 FileWriter fileWriter=new FileWriter("e:\\789"); //2.开始写入信息 fileWriter.write("java"); //3.关闭 fileWriter.close(); System.out.println("项目执行完毕!"); } }
19.文件字符流复制文件
只能复制文本文档 ,不能复制图片、声音、视频 基本思路: 1.创建文件的读; 2.创建文件的写 3.边读边写 4.刷新
import java.io.FileReader; import java.io.FileWriter; public class Demo10 { public static void main(String[] args) throws Exception{ //1.文件字符读取 FileReader fileReader=new FileReader("e:\\123.txt"); //2.文件字符写入 FileWriter fileWriter=new FileWriter("e:\\1217.txt"); int count=0; while ((count=fileReader.read())!=-1){ fileWriter.write((char)count); fileWriter.flush(); } System.out.println("复制完毕!!"); } }