JAVA基础整合——IO流技术
2021/9/4 17:07:23
本文主要是介绍JAVA基础整合——IO流技术,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
IO流技术
什么是IO流???I 表示input输入(读),O 表示output输出(写)。这里的输入输出表示JAVA程序和外部磁盘文件或者服务器之间的数据交互。输入表示外部文件往JAVA程序输入,输出表示JAVA程序向外输出。
1.流的分类
- 从流的方向分为:输入流和输出流
- 从流中传输的数据的单位来分:字节流和字符流
- 流的构造来说分为基本流和包装流
2.我们需要掌握的流
这里我针对字节流和字符流画了一个图,标红的是我们需要掌握其原理的。
- 字节流如下:
- 字符流如下:
- 这里我把图上几个掌握的流列出来:
FileInputStream,FileOutputStream (这俩为基本流)
BufferedInputStream,BufferedOutputStream
ObjectInputerStream,ObjectOutputStream
FileReader,FileWriter(这俩为基本流)
InputStreamReader,OutputStreamWriter(转换流,也是字符流)
BufferedReader,BufferedWriter
规律:
1.名字中带有input或者reader都是用来做输入(读),凡是名字中带有output或者Writer都是用来输出(写)。
2.类名中带有Stream都是字节流,带有reader或者writer都是字符流。
3.包装流是不能直接使用的,需要以基本流作为基础进行包装之后才能进行使用。
3.字节流
3.1 FileInputStream 和FileOutputStream
这两个流属于字节流,以字节为单位获取一个文件的内容。
文件流使用过后一定要进行手动的关闭,所有的流对象统一实现了Closeable的接口。为了保证流的关闭代码一定执行,我们将关闭的代码写在finally块中。
案例:使用字节输入输出流完成一个图片文件的复制操作(时间不要太长)。
public static void main(String[] args) { FileInputStream fis =null; FileOutputStream fio = null; try { fis = new FileInputStream("D:\\zzz\\test.png"); fio = new FileOutputStream("D:\\bbb\\test.png"); byte[] buffer = new byte[1024]; int r; while((r=fis.read())!=-1) { fio.write(buffer,0,r); } fio.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(fis!=null) { try { fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(fio!=null) { try { fio.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
- 提出一个装饰器模式概念:对原有类的功能进行某些方面的增强。例如BufferedInputStream类中其实定义了一个InputStream类型的属性,并且要求构造的时候传入一个基本流,在用户调用流对象的read方法是其实还是调用基本流的reaad方法,只是在读取文件的过程中进行缓冲的增强,提升了文件读取效率。
3.2 BufferedInputStream 和 BufferedOutputStream
- 带有缓冲的字节输入输出流,是一种包装流。
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("d:\\zz.txt")) BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("D:\\a.txt")) int r; while((r=bis.read())!=-1) { bos.wriite(r); } //异常没有处理
3.3 ObjectInputerStream 和 ObjectOutputStream
- 对象输入输出流:将一个JAVA对象转成一个字节序列的过程称为“对象的序列化”,目的是实现对象在磁盘上的保存或者网络的传输。在JAVA中是通过对象的输入和输出流来实现对象的序列化和反序列化操作的。
1.序列化: 将JAVA对象转成字节序列,要进行输出操作时序列化JAVA对象。
2.反序列化: 将字节序列还原为一个JAVA对象,要进行字节序列的输入。
注意: 需要被序列化的类一定要实现Serializable接口,这个接口为一个空接口,这个接口的作用主要时用来进行标记的。在实现了Serializable接口的同时建议在当前类中提供一个常量:
private static final long serialVersionUID = -3308982073920623004L;表示序
列化的版本号
如果我们不希望对象的某个属性参与序列化和反序列化的过程,可以使用transient关键字对该属性进行修饰。
//序列化(输出,写) Person person=new Person("张三",18,"male"); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\person.data")); oos.writeObject(person); oos.flush(); //反序列化(输入,读) ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\person.data")); //ois.readObject是一个Object类型需要向下转型为子类类型Person Person person =(Person)ois.readObject(); //异常没有处理
4.字符流
当我们在读取一个文本信息的时候采用字节的方式读取显然是不太合适的,因为有些字符在存储的时候不是占一个字节的空间,因此Java中为了更加方便读取文本信息内容为我们提供了一个流:字符输入输出流。
4.1 FileReader 和 FileWriter
这两个为基本流。
FileReader reader=new FileReader("D:\\aaa.txt"); //缓冲数组 char[] arr = new char[3]; reader.read(arr); System.out.println(new String(arr));
4.2 BufferedReader 和BufferedWriter
- 自带缓冲区的字符输入输出流,属于包装流BufferedReader不仅可以提交读取的效率,同时也非常方便,该流对象提供给我们一个以行为单位进行文本文件的读取readLine()
BufferedReader reader=new BufferedReader(new FileReader("D:\\TestFileOutputStream.java")); StringBuffer sb=new StringBuffer(""); String line=null; while((line=reader.readLine())!=null) { //一行一行的读取文本文件的内容 sb.append(line + "\r\n"); }
BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\test.txt")); String[] arr=new String[] {"你好","晚上吃什么","吃完去干什么"}; for (String s : arr) { bw.write(s); bw.newLine();//创建一个新的行 } bw.flush();
4.3 InputStreamReader 和 OutputStreamWriter
-
这两个是一个包装流,也是一个转换流。
小芝士: 一切乱码的根源在于信息编码与解码的格式不一致。 -
字符流在构建的时候是无法指定编码和解码的方式,只有字节流在创建的过程中才能指定字符集。
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("D:\TestFileOutputStream.java"),"utf-8"));
这篇关于JAVA基础整合——IO流技术的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南
- 2024-09-30Dnd-Kit学习:新手快速入门指南