字符流 概述以及基本使用
字符流 :数据流格式的一种,能有效避免字符流引起的中文乱码的问题
通常使用的类 FileWriter(字符输出流) FileReader(字符输入流)
这2个类都有各自的构造方法,大致相同
比如FileWriter 常用的构造方法
-
FileWriter (String filename, boolean append)
filename: 是指定好目标文件地址
append :是指 是否要在原有数据的基础上追加,true:追加。false:覆盖 -
FileWriter (File file,boolean append)
file: 是指定好文件对象
利用字符流复制文件
1、创建两个对象,一个是输入,一个输出,在构造方法中绑定写入数据的目的地
2、利用输入的read方法读取,输出的write方法(字符转换为字节的过程)写入
3、若不关闭流文件,要flush方法才能把内存缓存区的内容刷新到文件中
3、释放资源(会先刷新,再关闭文件)
代码:
//1、创建两个对象,一个是输入,一个输出
FileReader fread = new FileReader("C:\\abc.txt");
FileWriter fwri = new FileWriter("C:\\aaa.txt");
int len;//读取的有效个数
char[] cc = new char[1024];//读取的缓存数组
//2、利用输入的read方法读取,输出的write方法写入
while((len = fread.read(cc)!=-1)){
fwri.writer(cc,0,len);
}
//3、释放资源
fwri.close();
fread.close();
flush 和 close方法的区别
flush方法 :把Buff刷新到写入数据的文件中,流文件还能继续使用。
close方法:先刷新Bufff写入,再通知系统释放资源,关闭流文件。
FileWriter fw = new FileWriter("C:\\aaa.txt");
fw.writer(97); //写入一个字节 97的编码
fw.flush(); //从buff中刷新到文件中,此时能在文件中查看到 97编码的数值
fw.writer(56); //流对象还存在,再写入一个字节,存放在buff区中
fw.close(); //流对象关闭,第二次写入的56编码 此时能在文件中查看
fw.writer(98); //报错,提示文件流已关闭
字符流写入数据的四种方法
write(char[] cbuf)
write(char[] cbuf, int off, int len)
write(String str) 可以通过字符串写入
write(String str, int off, int len) 可以指定字符串的范围
续写 和 换行
续写和换行都跟字节流的差不多
-
开启续写: 通过 FileWriter(File file, boolean append) 构造方法里的append赋值:true即可
-
换行 根据系统系统的不同
windows :\r\n
mac:\r
linux:\n
使用try catch 语句处理异常
try{
// 可能会触发异常的语句
}catch(//声明扑捉异常的类型){
// 扑捉异常进行处理
}finally{
//一定会执行的语句
比如释放资源
}
//在此处声明 字符流对象 并且要初始化为 null
try{
// 可能会触发异常的语句
FileReader fread = new FileReader("C:\\abc.txt"); //如果在此处声明变量,那finally的变量将会报错 ,所有必须提升变量的作用域
FileWriter fwri = new FileWriter("C:\\aaa.txt");
int len;//读取的有效个数
char[] cc = new char[1024];//读取的缓存数组
//2、利用输入的read方法读取,输出的write方法写入
while((len = fread.read(cc)!=-1)){
fwri.writer(cc,0,len);
}
}catch(IOException e){
// 扑捉异常进行处理
System.out.print(e);
}finally{//一定会执行的语句
//3、释放资源
fwri.close(); //由于变量声明为 null ,触发了nullpointerException 异常,再同try 语句处理
fread.close(); //并且要进行判断 流对象是否为空。
}
jdk7针对异常的优化
// try语句中增加了小括号的初始化,起到提升变量作用,而且还能自动释放流对象
// 不用手动close,释放资源 节省了 finally语句,使得代码简洁明了
try**()**{
// 可能会触发异常的语句
}catch(//声明扑捉异常的类型){
// 扑捉异常进行处理
}finally{
//一定会执行的语句
比如释放资源
}
//jdk 7 优化之后的代码
try(FileReader fread = new FileReader("C:\\abc.txt"); //如果在此处声明变量,那finally的变量将会报错 ,所有必须提升变量的作用域
FileWriter fwri = new FileWriter("C:\\aaa.txt");
){
int len; //读取的有效个数
char[] cc = new char[1024]; //读取的缓存数组
//2、利用输入的read方法读取,输出的write方法写入
while((len = fread.read(cc)!=-1)){
fwri.writer(cc,0,len);
}
}catch(IOException e){
// 扑捉异常进行处理
System.out.print(e);
}