Java基础—Day21
在使用输出流的过程中,为了保证流中的数据能够刷写到目的地,最好调用一次 flush
在使用流的过程中,注意步骤的规范性!!!!!
FileInputStream/FileOutputStream
构造方法小结:
FileInputSteam
- FileInputStream(String name) :直接传一个文件名的路径
- FileInputStream(File file) :传一个file对象,感觉比上面的要麻烦一步
- FileInputStream(FileDescriptor fdObj) :这个没怎么用过
FileOutputSteam
注意:
- 输入流的文件必须存在,否则会抛出文件找不到异常
- 在关闭流的时候,要判空,防止出现空指针异常
- 关闭的顺序,有这么一个原则:先用的后关
- 在使用缓冲数组的时候,一定要注意:缓冲数组中保存数据采用的是覆盖策略,而不是清空策略!!!若文件的字符数正好是缓冲数组长度整数倍,就用这种方式 String str = new String(buf); 也ok,否则数据会出问题 -----》 所以,我们应该用缓冲数组保存的真实有效的数据格式,即这种写法:String str = new String(buf,0,realLen)
- 我们的缓冲数组的大小,根据文件大小去设定,若文件比较大,通常设置为1024的整数倍!!
- 输出流,文件若不存在,它会自动创建!!!
FileReader和FileWriter
使用try-with-resource块时,资源会自动关闭。作为此过程的一部分,它还将自动调用flush。
FileWrirter
的写数据方法
练习:
使用两个SB中任意一个去拼接字符串,然后实现字符串的替换,将替换后的结果,保存到文件中
* 源文件:你是{name},年龄{age} ----> 你是{张三},年龄{20},将这个结果写出去!!!
缓冲流 BufffferedXxx
BufferedXX ,缓冲流,就类似粗水管,只不过, 我们创建对象的时候,需要以前面的流作为参数, 即粗水管里面包了一层细水管!!!
缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO 次数,从而提高读写的效率。
BufferedInputStream 和 BufferedOutputStream
1.
构造方法
BufferReader 和BufferWriter
BufferWrirte
中有一个新的玩意:
newLine()
【可以换行】
![](https://img-blog.csdnimg.cn/20210608173432728.png)
BufferReader 有特有的方法: br.readLine() ; 【可以读取到一行,返回的就是一个字符串】
![](https://img-blog.csdnimg.cn/20210608173106956.png)
转换流 InputStreamReader 和 OuputStreamWriter
读取包含中文的文本文件时,可能出现中文乱码,怎么办?
InputStreamReader fr=new InputStreamReader(fis,"UTF-8");
OutputStreamWriter(OutputStream out,String charsetName);
读写二进制文件 DataInputStream 和 DataOutputStream
可以看成是对 InputStream 的包装
DataInputStream
- FileInputStream的子类
- 与FileInputStream类结合使用读取二进制文件
DataOutputStream
-
FileOutputStream的子类
-
与FileOutputStream类结合使用写二进制文件
练习:使用这个流完成图片的复制
![](https://img-blog.csdnimg.cn/20210608182312343.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODIyODI4OA==,size_16,color_FFFFFF,t_70)
打印流 PrintStream
了解 PrintStream
行号读取 LineNumberReader
LineNumberReader
两个方法:
String readLine()
、
int getLineNumber()
![](https://img-blog.csdnimg.cn/20210608182936715.png)
对象流 ObjectInputStream 和 ObjectOutputStream
序列化需求
场景一:内存对象需要在其它环境下使用
- 两个进程间进行网络通信时,无论是发送何种类型的数据,均需以二进制序列形式进行传送
发送方必须将数据对象(比如Java对象)转化为字节序列
接收方则需要将接收到的字节序列再还原成Java对象
场景二:内存对象需要在将来某个时间使用
- 将内存中的数据对象永久存储在磁盘中(持久化)
常用序列化方案
protobuf
:序列化的框架!!!
序列化和反序列化过程
尖叫提示:先写的先读
序列化:将内存中的对象写出到文件中
反序列化:将文件中的对象读取出来
![](https://img-blog.csdnimg.cn/20210608183943626.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODIyODI4OA==,size_16,color_FFFFFF,t_70)
实现步骤
![](https://img-blog.csdnimg.cn/20210608184253849.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODIyODI4OA==,size_16,color_FFFFFF,t_70)
作业
1.缓冲流的使用
2.对象流的使用
将上题中的集合,通过对象流写入到二进制文件中,然后读取出来并打印输出
3.文本排序
![](https://img-blog.csdnimg.cn/20210608184635217.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODIyODI4OA==,size_16,color_FFFFFF,t_70)
需求:读取上述文本信息,按照前面的序号进行排序!!
![](https://img-blog.csdnimg.cn/20210608235444614.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODIyODI4OA==,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210608235451568.png)
4.使用转换流完成编码格式转换
GB2312/GBK
编码格式的文件,转换成
UTF-8
格式!!!保证直接用工具打开或者流读取,中文不乱码即可!!!