I/O流之 各类流的特性及使用解析 |
---|
一、I/O的文件和文件流体系总览
(一)File类
1、对文件的解析描述
【引入】
<1>程序中的数据都是 存储在内存中, 集合、数组、变量 ,缺点:程序一关,数据丢失
永久性存储数据:
1、数据存到文件(磁盘)
2、数据存储在数据库
……
2、File类的常见方法
<1>、特点:
程序中一个File实例对应 磁盘中的一个文件或目录
<2>、创建对象三种方式如下:
File file =new File(文件或目录的路径名);
File file =new File(父级目录,子级名);
1> File file = new File("src/stu.txt");
2> File file = new File(File parent,String child);
3> Filefile=new File(String parent,String child);
<3>、常用方法:
获取文件本身信息
getName
getParent
getPath
getAbsolutePath
length
判断文件信息
isFile
isDirectory
exists
isHidden
创建、删除、重命名
创建一级目录mkdir
创建多级目录mkdirs
立即删除 delete
程序退出删除 deleteOnExit
重命名 rename
list 列出当前目录下 的子级目录或文件,返回类型String[]
listFiles列出当前目录下的字节目录或文件,返回类型File[]
重写Object类的方法
equals
toString
3、使用举例(见I/O流使用代码实践示例)
1.先判断有没有此目录,如有删除,没有创建,并在里面创建文件,然后获取文件信息
2.列出 指定目录下 的所有的子级目录或文件名
(三)、I/O文件流
<1>相关概念:
IO:
Input/Output 输入输出
流:
数据 在程序 和 节点之间的传输
节点:
源节点
文件、网络、键盘
目标节点
文件、网络、控制台
输入:
数据 从源节点到 程序
输出:
数据从程序到目标节点
<2>分类
按传输方向不同:
<1>输入流
<2>输出流
按传输单位不同
字节流
字符流
按流的功能不同
基础流
包装流(增强流/过滤流)
按传输单位不同
字节流
字符流
按流的功能不同
基础流
包装流(增强流/过滤流)
《二》框架体系:
(一)各种常见流的框架示例
<1>InputStream字节输入流
FileInputStream文件字节输入流
创建对象:
通过构造,指向一个文件或路径
方法:
read
close
BufferedInputStream字节缓冲流
创建对象:
通过构造,指向一个InputStream对象
方法:
read
close
ObjectInputStream反序列化流
创建对象:
通过构造,指向一个InputStream对象
方法:
readXX()
读取基本类型
readObject()
读取对象
close()
<2>OutputStream字节输出流
FileOutputStream文件字节输出流
创建对象:
通过构造,指向一个文件或路径,还可以设置一个boolean值,代表是否追加内容
方法:
write(char)
write(byte[])
write(byte[],int offset,int len)
close()
BufferedOutputStream 字节缓冲流
创建对象:
通过构造,指向一个OutputStream对象
方法:
write(char)
write(byte[])
write(byte[],int offset,int len)
close()
ObjectOutputStream序列化流
创建对象:
通过构造,指向一个OutputStream对象
方法:
writerXX
写入基本类型
writeObject
写对象
close()
<3>Reader字符读取流
FileReader文件字符读取流
同 FileInputStream的使用,只是 byte换成了 char
BufferedReader字符缓冲流
同BufferedInputStream的使用
多出来的方法
readLine
<4>Writer字符写入流
FileWriter文件字符写入流
同 FileOutputStream的使用,只是 byte换成了char
多出来的方法
write(string)
write(string,int offset,int len)
BufferedWriter字符缓冲流
同BufferedOutputStream的使用
多出来的方法
newLine()
<5>其他小流
①标准输入、输出
System.in标准输入,类型: InputStream
System.out标准输出,类型 :PrintStream
System.err 标准错误,类型:PrintStream
重定向
System.setIn();
System.setOut();
System.setErr();
②打印流
1.打印流 只有 PrintStream和PrintWriter
2.只有输出,没有输入
3.里面提供了一系列 打印方法print、println、printf方法,而且可以直接打印基本数据类型
4.永远不会抛出异常,除了 构造方法
5.有自动刷新功能,但是必须 在换行结束后 才有
③转换流
1.转换流只有 InputStreamReader和OutputStreamWriter
2.将字节流转换成字符流,如果读写的文件中只有字符,用转换流转换后效率会高一些
④数据流
1、数据流 只有 DataOutputStream和DataInputStream
2、数据流和对象流 都实现了 同样的接口,DataInput和DataOutput,都 具备读写基本类型的方法
3、读写顺序要一致
⑤随机访问流
1、只有一个 RandomAccessFile
2、既可以读,又可以写
3、自带指针,每次读写,指针自动后移指定读写数据的字节数
4、可以通过 seek方法,自由移动指针,也可以通过getFilePointer获取指针位置
⑥字节数组流
ByteArrayOutputStream和ByteArrayInputStream
特点:可以直接使用 toByteArray() 和 toString() 获取数据。
(二)使用步骤
1、创建流对象(选择哪个流)
2、调用读取或写入
3、关闭流
四、IO流的几种不同流类如下:
字节输入流
InputStream
FileInputStream 文件字节输入流
BufferedInputStream 字节缓冲输入流(增强流)
ObjectInputStream 对象输入流
DataInputStream 数据输入流
字节输出流
OutputStream
FileOutputStream 文件字节输出流
BufferedOutputStream 字节缓冲输出流(增强流)
ObjectOutputStream 对象输出流
DataOutputStream 数据输出流
字符读取流(输入流)
Reader
FileReader
BufferedReader
InputStreamReader
字符写入流(输出流)
Writer
FileWriter
BufferedWriter
OutputStreamWriter
了解:
PrintStream,PrintWriter
RandomAccessFile 随机访问流
FileInputStream和FileOutputStream
文件字节流
(1)、FileInputStream 文件字节输入流
创建对象:
FileInputStream fis = new FileInputStream(string path);
FileInputStream fis = new FileInputStream(new File(path));
方法:
read() 读取单个字节,返回该字节的 整数形式,,如果到文件末尾返回-1
read(byte[] ) 读取 多个字节到数组中,返回读取的长度,如果到文件末尾返回-1
read(byte[] ,int offset,int len) 读取 多个字节到 指定范围的数组中,返回读取的长度,如果到文件末尾返回-1
close 关闭流
(2)、FileOutputStream 文件字节输出流
创建对象:
FileOutputStream fos = new FileOutputStream(string path);
FileOutputStream fos = new FileOutputStream(string path,boolean f);
FileOutputStream fos = new FileOutputStream(File path);
FileOutputStream fos = new FileOutputStream(File path,boolean f);
方法:
write(char) 写入单个字节
write(byte[]) 写入整个字节数组
write(byte[],int offset,int len) 写入 字节数组的一部分
close 关闭流
其它相关的API:
String str = new String(byte[]); 将字节数组转换成字符串
String str = new String(byte[],int offset,int len); 将字节数组的一部分转换成字符串
String str = new String(char[]); 将字符数组转换成字符串
String str = new String(char[],int offset,int len); 将字符数组的一部分转换成字符串
字符串.getBytes() 将字符串转换成byte[]
字符串.toCharArray() 将字符串转换成char[]
(3)、缓冲流
功能:提高 被包装流类的 效率
1.BufferedInputStream
用于增强 InputStream派系的类
构造: 参数为InputStream
方法: 同FileInputStream
2.BufferedOutputStream
用于增强 OutputStream派系的类
构造: 参数为OutputputStream
方法: 同FileOutputStream
3.BufferedReader
用于增强 Reader派系的类
构造: 参数为Reader
方法: 多了 readLine
4.BufferedWriter
用于增强 Writer派系的类
构造: 参数为Writer
方法: 多了 newLine
(4)对象流
属于包装流,包装 字节输入流和字节输出流
功能:读写基本数据类型 和对象类型
特点:
ObjectOutputStream : 对象写入流(序列化流)
writeObject:序列化对象的方法
ObjectInputStream:对象读取流(反序列化流)
readObject:反序列化对象的方法
序列化:
对象 持久化到 磁盘文件或网络,保证 存储和读取 的对象是同一个
反序列化:
将磁盘文件或网络中的对象 读取到内存,保证 存储和读取 的对象是同一个
1、ObjectOutputStream
构造:
参数: OutputStream
方法:
writeInt
writeChar
writeDouble
writeUTF
writeObject
2、ObjectInputStream
构造:
参数: InputStream
方法:
readInt
readChar
readDouble
readUTF
readObject
注意:
1、 读写 顺序要一致!!!
2、 读写的对象要实现序列化接口
Serializable
(5)、标准输入输出流
System.in 类型 为 InputStream
System.out 类型 为 PrintStream
System.err类型为PrintStream
重定向输入输出:
System.setIn();
System.setOut();
System.setErr();
(6)、打印流
* 1、 提供了非常便利的 print、println、printf方法,可以直接打印 各种类型 的字符串形式
*
* 2、 调用打印或写入方法时,不会抛出IOException, (构造方法除外)
*
* 3、 打印流有自动刷新功能,但是必须 在 换行标记之后
*
* 4、直接可以应用在标准输出流中
*
* System.out 的类型 就是 PrintStream
*
* System.out得到一个PrintStream对象,可以直接调用 里面的一系列方法
*
* 5、没有输入,只有输出
*
* 打印流:PrintStream和PrintWriter
*
*
* 6、可以在构造方法 中指定编码格式
7、转换流
1、功能:转换流提供了在字节流和字符流之间的转换
2、InputStreamReader和OutputStreamWriter
3、好处:字节流中的数据都是字符时,转成字符流操作更高效。
还可以使用字符流的一些特有的方法
8、随机访问流
1、既可以读,又可以写
2、自带指针,可以自由移动指针 ,通过 seek方法,设置读写 指定位置的 数据,正向反向皆可
*
3、默认 的,最开始 指针是在文件头,每调用一次read/write,按读取/写入的字节 ,指针往前移动
9、数据流
数据流:DataInputStream和DataOutputStream
* 可以 读写 基本数据类型和 String
*
* 注意读写顺序一致
* 和对象流 一样都实现了DataInput和Output
五、字符编码
1、常见的编码表
ASCII:美国标准信息交换码。0-255
用一个字节的7位可以表示。
ISO8859-1:拉丁码表。欧洲码表 。比较适合处理英文
用一个字节的8位表示。
GB2312:中国的中文编码表。 Gbk>gb2312
GBK:中国的中文编码表升级,融合了更多的中文文字符号。
Unicode:国际标准码,融合了多种文字。 固定长度的编码
所有文字都用两个字节来表示,Java语言使用的就是unicode
UTF-8:最多用三个字节来表示一个字符。
2、关于乱码
解码和编码时 使用的编码表不一致造成的!!
或
读写数据时 使用的编码表不一致造成的!!
解决:
读和写的时候 ,要统一编码
★★★★★
1、按 指定的字符集格式,将字符串(编码)转换成字节数组
//str.getBytes(“字符集”);
2、按指定的字符集格式,将 字节数组(解码)转换成 字符串
//String str = new String(byte[],"字符集");