回顾总结16
2021/8/17 6:06:05
本文主要是介绍回顾总结16,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
IO流
- I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理数据传输,如读/写文件,网络通讯等
- Java程序中,对于数据的输入/输出操作以"流(Stream)"的方式进行
- java.io包下提供了各种"流"类和接口,用以获取不同种类的数据,并通过方法输入或输出数据
文件
文件是保存数据的地方
文字、声音、视频本质上没有差别
流
在程序中,数据被封装到文件当中,文件以流的形式进行传输
- 流:数据在数据源(文件)和程序(内存)之间经历的路径
- 输入流:数据从数据源(文件)到程序(内存)的路径
- 输出流:数据从程序(内存)到数据源(文件)的路径
文件是存放在磁盘当中的。文件与程序的交互相当于磁盘和内存的交互
特点
- 先进先出:最先写入输入流的数据最先被输入流读取到
- 顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据
- 只读或者只写:每个流只能是输入或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,输出流只能进行写操作,在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流
流的分类
(抽象基类) | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
-
Java的IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的
-
由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀
操作数据单位
-
字节流(8bit)(二进制文件)
- InputStream
- OutputStream
-
字符流(按字符,根据文件编码)(文本文件)、
(字节流+编码 = 字符流)-
Reader
-
Writer
-
数据流的流向
- 输入流
- 输出流
流的角色
-
节点流:可以从一个特定的数据源读写数据。(较为底层,跟数据源直接接触)
对文件、对数组、对管道、对字符串等数据源直接操作的流,如File操作的一系列流,FileInputStream、FileReader以及对应的输出流
-
处理流/包装流:是"连接"在已存在的流(节点流、处理流)之上,为程序提供更为强大的读写功能。更加灵活
通过对以上节点流进行包装处理过的流。BufferedReader、BufferedWriter可以装入任意一个对应的流作为属性
节点流和处理流
节点流:是底层流,直接跟数据源相接
处理流(包装流):包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法完成输入输出
处理流
处理流的包装,使用了修饰器设计模式,不会直接与数据源相连。
优点
- 性能的提高:主要以增加缓冲的方式来提高输入输出的效率
- 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便
序列化和反序列化
序列化:就是在保存数据的时候,保存数据的值和数据类型
反序列化:就是在恢复数据时,恢复数据的值和数据类型
需要将某个对象支持序列化机制,则必须要让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一
- Serializable:这是一个标记接口,空接口
- Externalizable
details
- 读写顺序要一致
- 要求实现序列化或反序列化对象,需要实现Serializable接口
- 序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性
- 序列化对象时,默认将里面所有属性都进行了序列化,但除了static或transient修饰的成员
- 序列化对象时,要求里面属性的类型也需要实现序列化接口
- 序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化
字节流和字符流
不要用字符流去读取二进制文件,会造成文件损坏
二进制文件有声音、视频、doc、pdf等等,基本单位是单个字节,使用字节流去读取
字符流也是二进制文件的一种,每个字符包含多个二进制
读取文件
字节流
- FileInputStream的无参read方法,一次只读一个字节
public void readFile1() throws IOException { String pathName = "e:\\study.txt"; int readData; FileInputStream fileInputStream = new FileInputStream(file); while((readData = fileInputStream.read()) != -1){//返回的是int类型,读取字符的数据,根据ASCII码转换 System.out.print((char)(readData) + " ");//read无参方法每次读取一个字节,将其转化成char字符就可输出 } fileInputStream.close(); }
- FileInputStream的参数为byte[]的read方法,一次读取byte[]个字节
//和无参read方法的差别是,多声明一个byte[],并且输出方法不一样 public void readFile2() throws IOException { String pathName = "e:\\study.txt"; byte[] bytes = new byte[8]; int len = 0; FileInputStream fileInputStream = new FileInputStream(file); while((len =fileInputStream.read(bytes)) != -1){//返回的是数组读取字节的个数,真正的数据在数组中 System.out.print(new String(bytes,0,len)+" ");//read带数组参数的方法,每次读取数组大小个字节,需要将其转化成String截取输出。 } fileInputStream.close(); }
- FileOutputStream的参数为byte[]的write方法,一次写入byte[]个字节
public static void main(String[] args) throws IOException { String pathName = "e:\\yy\\tt.txt"; String str = "hello,world.welcome to java"; //FileOutputStream fileOutputStream = new FileOutputStream(pathName,true);//此方法是追加在文件末尾写入 FileOutputStream fileOutputStream = new FileOutputStream(pathName);//此方法是覆盖的方式写入 //fileOutputStream.write(str.charAt(0));读写一个字节 fileOutputStream.write(str.getBytes());//读写一整个字符串 //fileOutputStream.write(str.getBytes(),0,12);读写字符串的[0,12)个字符串 fileOutputStream.close(); }
字符流
FileReader
FileWrite:使用完后一定要记得close或者flush,不然数据写不进去。
标准输入输出流
标准输入流
System类的public final static InputStream in
System.in的编译类型是:InputStream
运行类型是:BufferedInputStream
表示标准输入的是:键盘
标准输出流
System类的public final static PrintStream out
System.out的编译类型是:PrintStream
运行类型是:PrintStream
表示标准输出的是:显示器
打印流
打印流只有输出流,没有输入流
PrintStream
字节打印流
PrintStream out = System.out;
out.print("hello,java")
out.close
这个print的底层就是write方法
- 默认打印位置是System.out是显示器,我们可以修改它的打印输出位置,通过System.setOut(new PrintStream(路径名))或者,直接在System.out的位置修改成(路径名)
PrintWriter
字符打印流
PrintWriter printWriter = new PrintWriter(System.out);
printWriter.print("hello,java");
printWriter.close;
- 修改打印输出位置,System.out改成(路径名),或者调用System.setOut方法穿进去一个PrintStream
转换流
字节流 + 编码格式 = 字符流
InputStreamReader
Reader的子类,可以将InputStream字节流转换(包装)成Reader字符流
OutputStreamWriter
Writer的子类,可以将OutputStream字节流转换(包装)成Writer字符流
当处理存文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流
可以在使用时指定编码格式(utf-8,gbk,gb2312,ISO8859-1等)
总结
-
最底层是的字节流,传输二进制文件的流(以字节为单位读写)
-
为了能更好的更有效率的读写中文,我们把字节流按照一定编码规则(默认为utf-8)进行读写,称作字符流(以字符为单位读写)
-
这两个流属于底层流,称为节点流
-
再往上一层,有处理流(包装流)(以节点流为单位读写,本质上是操作节点流进行读写)
-
为了把已经有编码格式的字符流重新设置新的编码格式。我们需要把字符流中的字节流给取出来,然后使用InputStreamReader或者OutputStreamWriter,将该字节流加上编码格式转换成对应的新的字符流
-
如果有需要的话,就用处理流(包装流)将该字符流进行包装。使用处理流来读写数据。
Properties类
-
专门用于读写配置文件的集合类
配置文件的格式:键=值
-
注意:键值对不需要有空格,值不需要用引号引起来,默认类型是String
常用方法
- load:加载配置文件的键值对到Properties对象
- list:将数据显示到指定设备(流对象)
- getProperty(key):根据键获取值
- setProperty(key,value):设置键值对到Properties对象
- store:将Properties类中的键值对存储到配置文件,在idea中,保存信息到配置文件,如果含有中文,会存储为unicode码
如何读取mysql.properties文件
//创建一个Properties类对象 Properties properties = new Properties(); //加载指定配置文件。把想要的配置文件的内容加载到该类实例中 properties.load(new FileReader("src\\mysql.properties")); //把properties类实例的内容显示在控制台 properties.list(System.out);
总结
Properties类是用来和后缀为.properties的配置文件交互(读写)的
首先,我们Propertties类是会保存一份数据的。我们所有对Properties类的操作,数据都会保存在这个类中。
只有两条操作是跟后缀为.properties的配置文件交互的。
- load:它会将配置文件的数据传到Properties类中,然后进行操作。
- store:它会将Properties类中的数据,返回到配置文件当中。
没必要纠结参数的输入输出。以程序为主体,load就是读取(InputStream或者Reader),从外来文件到程序。store就是写入(OutputStream或者Writer),从程序写入到文件。
这篇关于回顾总结16的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-02springboot项目无法注册到nacos-icode9专业技术文章分享
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)