1. Reader
字符输入流
read(0:读取单个字符返回
read(char[]):将数据读到数组中,返回读取的个数
2. Writer
字符输入流
已知子类:
- BufferedWriter:高效
- CharArrayWriter:写入内存缓冲区,不是写入文件
- PrintWriter:打印流,提供自动刷新,自动换行等功能
写的位置不同,所以write()未实现,所以Writer为抽象类。起到规范的作用。
3. 编码
3.1 常见的编码
GBK
最常用的中文码表,用2个字节表示(第一个字节开头为1,第二个字节开头为0)
unicode
国际标准码,2个字节存储。
Java中char类型用此表,char c='a';占用两个字节
Java中字符串按系统默认表解析,简体中文版,字符串默认码表是GBK。
UTF-8
基于unicode,一个字节存储,更标准化,在每一个字节头加了编码信息。
3.2 可识别中文的码表
GBK,UTF-8
3.3 编码和解码
1、编码:文字----->(数字),"abc".getBytes()----->byte[]
2、解码:(数字)----->文字,byte[] b={97,98,99}; new String(b);
4. FileReader
java.io.FileReader;
读取字符流
继承了InputStreamReader--->Reader
BufferedReader也继承了Reader.
4.1 构造方法
假定默认字符编码和默认自己缓冲区大小都适当
FileWriter(String fileName);
FileWriter(String fileName,boolean append):是否追加
4.2 读数据步骤
- 创建输入流对象
- 调用输入流对象的读数据方法
- 释放资源
import java.io.FileReader;
import java.io.IOException;
public class Test{
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("a.txt");
int ch=0;
while((ch=fr.read())!=-1){
//输出字符对应的编码值
System.out.println(ch);
//输出字符本身
System.out.println((char)ch);
}
fr.close();
}
}
运行结果:
4.2.1 分析
FileReader fr=new FileReader("a.txt"):文件a.txt必须存在,否则抛出java.io.FileNotFoundException异常。
int read():一次读取一个字符。
- int ch=fr.read();
- 若文件a.txt中有换行,read()也会读到
int read(char[] chs):返回的是实际读取的个数
- char[] chs=new char[5];
- int len=fr.read(chs); //len=5
- chs; //chs={'h','e','l','l','o'}
- len=fr.read(chs); //len=5
- chs; //chs={'\r','\n','w','o','r'}
- len=fr.read(chs); //len=4
- chs; //chs={'l','d','\r','\n','r'}------上一次读取的r,此次未覆盖
说明len读取长度,不是实际chs的长度————最后显示数据时,格式为:System.out.println(new String(chs,0,len));只转实际读取的长度,排除了前面情况中的'r'。
当实际读取长度为-1时,说明无数据可读了,可作为循环判断条件。
5. FileWriter
java.io.FileWriter;
会抛出IO异常
5.1 构造函数
FileWriter(String FileName);
FileWriter(String FileName,boolean append);是否追加
5.2 写数据步骤
- 创建输出流对象
- 调用输出流对象的写数据方法
- 释放资源
import java.io.FileWriter;
import java.io.IOException;
public class Test{
public static void main(String[] args) throws IOException {
FileWriter fw=new FileWriter("a.txt");
fw.write("你好!");
fw.flush();
fw.close();
}
}
运行结果:
5.2.1 分析
- FileWriter fw=new FileWriter("a.txt");----做的事情包括:
- 创建一个a.txt文件,
- 创建一个输出流对象fw
- 将输出流对象指向文件
- write(String str):调用fw.write("IO流")时,并未将IO流写入文件,而是写入了内存缓冲区,需调用fw.flush()将缓冲区的数据刷新到文件中(硬盘存储基本单位是字节,此处是字符串,需刷)
- 不释放资源时,当程序未结束时,不可删除文件a.txt,因为正在被Java程序使用。
- 当调用fw.close()后,即使Java程序未结束,也可删除a.txt。
- 若未写fw.flush()而直接写了fw.close()则也会将内容刷新到文件中。因为close()会在关闭前检查缓冲区,若有内容,先fluse()再close(),释放资源。
- close()之后,流对象fw不可再使用。
5.2.2 write方法
write(String str):写一个字符串数据
write(String str,int index,int len):一部分
write(int ch):写一个字符数据,‘a’,97都可以
write(char[] chs):写一个字符数组
write(char[] cha,int index,int len):一部分
5.2.3 实现数据的换行
fw.write("\n");
但用记事本打开无换行,因为Windows识别的换行是“\r\n”
- Windows:\r\n
- Linux:\n
- mac:\r
5.2.4 数据的追加写入
用构造函数:FileWriter(String FileName,boolean append);设置append为true,默认是false。
5.3 复制文件
数据源:a.txt
读数据:FileReader
目的地:b.txt
写数据:FileWriter
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test{
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("a.txt");
FileWriter fw=new FileWriter("e:\\b.txt");
int ch=0;
while((ch=fr.read())!=-1)
fw.write(ch);
fw.flush();
fw.close();
fr.close();
}
}
运行结果;