IO流
输入:从磁盘到内存(当 read() 返回的 -1 代表文件已经读到末尾)
输出:从内存到磁盘
在流的处理过程中,要想把磁盘上一个文件从一个地方写入到另一个地方,需要保证写入的文件目录存在
分类:
字节流
FileInputStream:
字节输入流,继承 InputStream 抽象类,主要方法 read() 把磁盘文件内容读取到内存
read():表示每次读取一个字节并返回该字节代表的 Ascii 码(0~127)
read(byte[] byte):表示返回每次读取 byte 长度的字节并存入 byte 数组,且返回数组长度
FileOutputStream:
字节输出流,继承 OutputStream 抽象类,主要方法 write() 把内存的文件写入到磁盘
write(int Ascii):表示每次写入一个字节 Ascii 码所对应的字符
write(byte[] byte):表示将 byte 数组中的内容一次性写入到磁盘
字符流
FileReader:
字符输入流:继承 InputStreamReader(字节输入流转字符输入流的桥梁),主要方法 read()
read():读一个字符到内存(运行内存 DDR3 or 4),返回其 Ascii 码
read(char[] ch):返回每次读取 char 数组长度的字符并存入 char 数组,返回数组长度
FileWriter:
字符输出流:继承 OutputStreamWriter(字符输出流转字节输出流),主要方法 write()
write(int Ascii):写一个 Ascii 码所代表的字符到磁盘
write(char[] ch):表示将字符数组中的内容一次性写入磁盘
缓冲流
与字符输入输出流相比,多了一块缓冲区,减少磁盘与内存的交换,进而提高 cpu 效率
BufferedReader:
字符输入缓冲流:继承抽象类 Reader,新增 readLine() 读文件中的一行数据
BufferedWriter:
字符输出缓冲流:继承抽象类 Writer,每次将字符写入磁盘,现存入缓冲区,当调用 flush() 方法 或 关闭流时缓冲区的内容才会写入到磁盘
转换流
字节流与字符流之间的相互转换
InputStreamReader:
字节输入流转字符输入流
/**
* 字节输入流转字符输入流
*/
// 字节输入流对象
FileInputStream inputStream = new FileInputStream("hello");
// 字符输入流对象
InputStreamReader streamReader = new InputStreamReader(inputStream);
// operate
// System.out.println((char)streamReader.read());// A
int len;
char[] cs = new char[5];
while ((len=streamReader.read(cs)) != -1) {
System.out.print(new String(cs, 0, len));
}
streamReader.close();
inputStream.close();
OutputStreamWriter:
字符输出流转字节输出流
OutputStream out = new FileOutputStream("hello", true);
/**
* 字符输出流转字节输出流
*/
OutputStreamWriter writer = new OutputStreamWriter(out);
String s = "\n人生路漫漫";
writer.write(s);
// 刷新,从缓冲区存入磁盘
writer.flush();
writer.close();
编码集
- Ascii 码:0 ~ 127 代表字符,符号
- GBK:两个字节代表一个汉字,英文占据一个字节
- UTF-8:1 ~ 4 个字节代表一个符号,一个汉字占据三个字节,英文占据三个字节
编码与节码不一致将产生乱码
String s = "山海经";
// getBytes() 转换为默认字符节码,这里为 utf-8,一个字符转三个字节
byte[] utf8 = s.getBytes();
// [-27, -79, -79, -26, -75, -73, -25, -69, -113]
System.out.println(Arrays.toString(utf8));
// gbk 每个字符用两个 byte 来表示
byte[] gbk = s.getBytes("gbk");
// [-55, -67, -70, -93, -66, -83]
System.out.println(Arrays.toString(gbk));
FileOutputStream stream = new FileOutputStream("hello", true);
stream.write(gbk);// 我的 eclipse 设置默认 utf-8编码集,写入 gbk 将是乱码
stream.close();
JDK 1.7 IO异常处理
try ( 需要关闭得流资源 ) {
可能出现异常得代码;
} catch ( 异常类型 对象 ) {
}
随机访问文件 RandomAccessFile
较其他流主要新增(详情查阅 API):
void seek(long pos):设置文本指针偏移量,从文本的偏移量位置开始读取或写入