JavaSe-2023-2-06 IO流、输出、输入、字符流、字节流、序列化和反序列化、RandomAccessFile类
每日一句: 每个人都有梦想。但不同的是:有的人只梦,有的人敢想
学习内容:IO流、输出、输入、字符流、字节流、序列化和反序列化、RandomAccessFile类
-
IO流
- I :input 输入 O: Output 输出
- 通过IO流可以完成对硬盘的读写操作
- IO流的分类:
- 以内存为参照物
- 往内存中去叫做输入,或者叫读
- 从内存中出来叫做输出,或者叫写
- 有的流是按照字节的方式读取数据,一次读取一个字节byte,等同于读取8个二进制位,这种流是万能的,什么类型都可以读取,包括文本、图片、视频、声音文件
- 以内存为参照物
- 流的四大家族
- java.io.InputStream 字节输入流
- java.io.OutputStream 字节输出流
- java.io.Reader 字符输入流
- java.io.Writer 字符输出流
- 注意:在java中以Stream结尾的都是字节流 、 以"Reader/Writer"结尾的都是字符流
- 所有的流都实现了Closeable接口都可以关闭的 close()
- 所有的流都实现了Flushable接口,都可刷新的 flush()
-
字节流
-
输入流
-
FileInputStream类主要用于从输入流中以字节流的方式读取图像数据等
-
new FileInputStream(File)
-
new FileInputStream(String path)
-
以单个字节为单位进行拷贝,也就是每次读取一个字节后再写入一个字节
- 缺点:文件稍大时,拷贝的效率很低
-
准备一个和文件大小一样的缓冲区,一次性将文件中的所有内容取出到缓冲区然后一次性写入进去
- 缺点:若文件过大时,无法申请和文件大小一样的缓冲区,真实物理内存不足。
-
准备一个相对适当的缓冲区,分多次将文件拷贝完成
-
FileInputStream fis = new FileInputStream("resource\\day02.txt"); FileOutputStream fos = new FileOutputStream("resource\\day02_copy.txt"); int len = 0; byte[] data = new byte[10*1024]; long start = System.currentTimeMillis(); while((len = fis.read(data)) != -1){ System.out.println(len); //按照实际的长度去写入 fos.write(data,0,len); } long end = System.currentTimeMillis(); System.out.println(start - end); // 关闭流 fos.close(); fis.close();
-
-
-
-
输出流
- FileOutputStream 类主要用于将图像数据之类的原始字节流写入到输出流中
- new FileOutputStream(File,boolean append)
- new FileOutputStream(String path,boolean append)
- FileOutputStream 类主要用于将图像数据之类的原始字节流写入到输出流中
-
-
字符流
-
输入流
-
FileReader:不能指定编码 类主要用于从文本文件读取文本数据内容
- new FileReader(File)
- new FileReader(String path);
-
InputStreamReader类主要用于实现从字节流到字符流的转换 转换流
-
new InputStreamReader(InputStream in)
-
new InputStreamReader(InputStream,String charsetName))
-
//如果遇到需要指定编码集 //使用InputStreamReader // FileReader fr = new FileReader();//只能按照平台编码集读取 FileInputStream fis = new FileInputStream("resource\\abc.txt"); InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
-
-
BufferedReader类主要用于从输入流中读取单个字符、字符数组以及字符串 提高文本读取效率
-
new BUfferedReader(FileReader/InputStreamReader)
-
public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new FileReader("resource\\abc.txt")); String line; while((line = reader.readLine()) != null){ System.out.println(line); } reader.close(); }
-
-
-
输出流
- FileWriter类主要是用于将文本内容写入到文本文件
- new FileWriter(File)
- new FileWriter(String path)
- OutputStreamWriter类主要用于实现从字符流到字节流的转换 转换流
- new OutputStreamWriter(OutputStream in)
- new OutputStreamWriter(OutputStream in,String charsetName));
- FileWriter类主要是用于将文本内容写入到文本文件
-
缓冲流
- BufferedWriter类主要用于写入单个字符,字符数组以及字符串到输出流中
- new BufferedWriter(Writer in)
- BufferedWriter类主要用于写入单个字符,字符数组以及字符串到输出流中
-
特定功能流
-
读写二进制
-
DataInputStream(FIS)类主要用于从输出流中读取基本数据类型的数据
-
DataOutputStream(FOS)类主要用于以适当的方式将基本数据类型写入输出流中
-
DataInputStream dis = new DataInputStream(new FileInputStream("E:\\cj.png")); DataOutputStream dos = new DataOutputStream(new FileOutputStream("D:\\cj_copy.png")); int len; while((len = dis.read()) != -1){ dos.write(len); } dos.close(); dis.close();
-
-
-
-
序列化和反序列化
- 序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialUID与本地相应实体类的serialUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidCastException)
- ObjectOutputStream(FOS)类主要用于将一个对象的所有内容整体写入到输出流中
- ObjectInputStream(FIS)类主要用于从输入流中一次性将对象整体读取出来
-
RandomAccessFile类
-
RandomAccessFile类主要支持对随机访问文件的读写操作
-
方法声明 功能介绍 RandomAccessFile(String name , String mode) 根据参数指定的名称和模式构造对象
r:以只读的方式打开
rw:打开以便读取和写入
rwd:打开以便读取和写入,同步文件内容的更新
rws:打开以便读取和写入,同步文件内容和元数据的更新int read() 读取单个字节的数据 void seek(long pos) 用于设置从此文件的开头开始测量的文件指针偏移量 void write(int b) 将参数指定的单个字节写入 void close() 用于关闭流并释放有关的资源
-
-
新手上路,以上内容仅供参考,如有不对的地方,望指出!
-
gitee代码仓库地址:https://gitee.com/Zhengsenbing/java-se-basic