Java开发重点:IO流
本文章是我学习IO的时候整理的一些笔记,案例啥的就没有整理了,有兴趣的可以去看看我用IO实现的英汉词典
链接: https://blog.youkuaiyun.com/zxwwantlearnjava/article/details/105648033
一、流的概念和分类
1.概念
概念: 流就是内存与存储设备之间传输数据的通道、管道
流对象:用来传输数据的对象
2.流的分类:
(1)流的方向(以JVM内存为参照物): 输入流/输出流
输入流:将存储设备中的数据读入到JVM内存中
输出流:将JVM内存中的数据写入到存储设备中
(2)数据单位:字节流/字符流
字节流:以字节为单位 处理任意类型的文件
字符流:以字符为单位 处理文本类型的文件
注意:文本类型的文件:能以记事本打开而且不乱码的文件
例如: .txt /.html /.java /.xml /.c是文本文件
.class /.world /.ppt /.map4是非文本文件
(3)流的功能:节点流/过滤流
节点流:只具有基本的读写功能
过滤流:为节点流增强功能
3.字节输入/输出流(抽象、父类)
(1)InputStream(字节输入流)
(2)OutputStream(字节输出流)
4.文件字节输入/输出流(子类)
(1)FileInputStream(文件字节输入流)
常用构造方法:
FileInputStream fis = new FileInputStream(“E:/text/a.txt”);
和下面的区别就是 文件必须存在 否则报错 java.io.FileNotFoundException
(2)FileOutputStream(文件字节输出流)
常用构造方法:
(1)FileOutputStream fos = new FileOutputStream(“E:/text/a.txt”);
a.参数代表: 文件的路径及文件名: 例如:E:/text/a.txt或是E:\text\a.txt
如果指定文件不存在,则JVM会自动创建文件,但是如果指定文件夹不存在,
则jvm报错,错误信息为: java.io.FileNotFoundException(系统找不到指定路径)
b.绝对路径: 带有盘符的路径.
盘符:/文件夹/文件(2)FileOutputStream fos = new FileOutputStream(“a.txt”);
默认在当前项目的根目录下查找所需要的文件,如果有,直接使用,如果没有,JVM自动创建(3)FileOutputStream fos = new FileOutputStream(“file/a.txt”);
开发时,通常在项目的根目录下创建一个文件夹,用于存储项目中操作的文件,便于管理(4)FileOutputStream fos = new FileOutputStream(“file/a.txt,true”);
参数说明:
第一个参数: 指定操作的文件路径及文件名
第二个参数: boolean 是否在原有内容进行追加
5.字节过滤流
(1)BufferedOutputStream/BufferedInputStream
a.缓冲流,提高IO读写效率,减少访问磁盘次数
b.数据存储在缓冲区,可以通过flush方法或是close方法
将缓冲区内容一次性写入到文件中,并清空缓冲区
1.flush方法只是清空缓冲区同时将缓冲区的内容一次性
写入到文件中,但是流还是可以继续使用
2.close方法关闭流的同时清空缓冲区,将缓冲区的内容
一次性写入到文件中,流一旦关闭不能再继续使用
注意: 缓冲区满时,将缓冲区的内容一次性写入到文件中,同时清空缓冲区
(2)PrintStream(输出流)
a.缓冲流,提高IO写的效率 b.增强了操作基本数据类型的方法,同时还可以操作字符串
print(int n)/print(long l)/print(boolean b)/print(double /d)/print(String str)–>不自动换行
println(int n)/println(long l)/println(boolean b)/println(double /d)/println(String str)–>自动换行
(3)ObjectOutputStream/ObjectInputStream(重点:对象序列化):
a.增强缓冲区,提高IO读写效率 b.增强了8种基本数据类型方法 c.对象序列化:
①概念:对象放在流上进行传输的过程
②参与对象序列化的要求:参与对象序列化的对象对应的类型必须实现java.io.Serializable
③对象的读写操作:
void writeObject(Object obj):将指定的对象写入到文件
Object readObject();从文件中读取对象
④文件达到尾部的标记:java.io.EOFException
⑤如果对象的某一个属性不想参与对象序列化,则对象前面用transient修饰
⑥如果参与对象序列化的对象中有自定义类型的属性,该属性也必须实现java.io.Serializable
否则运行报错:java.io.NotSerializableException(不可序列化异常)
write(‘A’); 可以传入一个字节大小的字符
// JDK7.0的语法: try- with - resources
try(定义资源 实现了Autocloseable接口){
// 代码
}catch(Exception e){
e.printStackTrack();
}
6.File类
java.io.File
File对象代表磁盘上的一个文件或目录
creatNewFile();创建新文件
mkdir(): 创建新目录
delete(): 删除文件/文件夹
注意: 如果删除文件夹,则该文件夹必须为空,否则删除失败
如果删除文件,不管有没有数据,都会删除成功
常用方法
exists(): 文件对象所代表的文件(或目录)是否存在
getName(): 获取文件名,带有后缀(文件类型,扩展名)
isDirectory(): 判断文件对象所代表的是否是目录
isFile(): 判断文件对象所代表的是否是文件
getAbsolutePath(): 获取绝对路径
listFiles(): 列出一个目录下的所有文件和子目录
listFiles(FileFilter f): 文件过滤器 实现FileFilter接口
数据过滤流
DataInputStream/DataOutputStream
直接读取8种基本数据类型和String readUTF()/writeUTF();
PipedInputStream/PipedOutputStream 管道流 用来在线程间交换数据
RandomAccessFile: 随机访问文件
字符的编解码
当字符编码和字符的接码不一致时,就会出现乱码
7.Reader/Writer 字符流的父类
FileReader/FileWriter 文件字符流 节点流
BufferedReader/BufferedWriter 缓冲流 过滤流
PrintWriter作用和BufferedWriter一样 但是更方便
桥转换流: InputStreamReader / OutputStreamWriter