目录
一、字符的概述
使用字节流完成文件拷贝,看起来是一个普通程序,但是它使用的是一种低级的IO。
如果针对的内容由字符组成,最好使用字符流,字节流只适用于最为原始的IO。
java平台使用Unicode来存储字符。
字符流自动在本地字符集和Unicode这种国际通用格式之间转换。
例如在西方国家,本地字符集通常是ASCII,在应对国际化的时候,程序员不用做额外的处理。
二、Reader
Reader是抽象类,常用实现类FileReader。
1、常用方法
int read() 读取一个字符,-1表示读到文件的末尾。 |
int read(char[] cbuf) 将字符读入数组,返回值表示读到了多少个字符。 |
close()关闭流 |
案例:读取文件中全部内容,输出到控制台。
public static void main(String[] args) throws Exception{
Reader reader = new FileReader("c:/abcd/test.txt");
// 用字符流读一个文本文件时,要注意编码的统一。
// 如果 txt文件 编码设置成UTF-8,系统会自动为这个文件在开头处添加一个空白的字符
int a = reader.read(); //一次读到一个字符
System.out.println((char)a);
int b = reader.read();
System.out.println((char)b);
int c = reader.read();
System.out.println((char)c);
int d = reader.read();
System.out.println((char)d);
int e = reader.read();
System.out.println((char)e);
int f = reader.read();
System.out.println((char)f);
int g = reader.read();
System.out.println((char)g);
int h = reader.read();
System.out.println(h); // -1表示读到文件末尾
reader.close();
}
使用循环读取文件内容
Reader reader = new FileReader("c:/abcd/test.txt");
int x = 0;
while((x=reader.read())!=-1){
System.out.println((char)x);
}
reader.close();
使用字符数组缓冲区
Reader reader = new FileReader("c:/abcd/test.txt");
char[] cs = new char[10]; // 字符数组缓冲区
reader.read(cs);
for(char c:cs){
System.out.println(c);
}
Reader reader = new FileReader("c:/abcd/test.txt");
char[] cs = new char[10]; // 字符数组缓冲区
reader.read(cs,2, 3);
for(char c:cs){
System.out.println(c);
}
三、Writer
Writer是抽象类,常用实现类FileWriter
1、常见的方法
write(ch): 将一个字符写入到流中。 |
write(char[]): 将一个字符数组写入到流中。 |
write(String): 将一个字符串写入到流中。 |
flush():刷新流,将流中的数据刷新到目的地中,流还存在。 |
close():关闭资源:在关闭前会先调用flush(),刷新流中的数据去目的地,然后流关闭。 |
发现基本方法和OutputStream 类似,有write方法,功能更多一些。可以接收字符串。
同样道理Writer是抽象类无法创建对象。查阅API文档,找到了Writer的子类FileWriter。
案例:将文本内容写到文件中(写一个字符,写一个字符数组,写一个字符串)
Writer writer = new FileWriter("c:/abcd/test.txt");
writer.write(65);
char[] c = {'中','a','#'};
writer.write(c);
writer.write("HelloWorld");
writer.close();
追加文件:
默认的FileWriter方法新值会覆盖旧值,想要实现追加功能需要
使用如下构造函数创建输出流 append值为true即可。
FileWriter(String fileName, boolean append)
FileWriter(File file, boolean append)
四、使用字符流完成文件拷贝。
public class Demo11_字符流文件拷贝 {
public static void main(String[] args) {
Reader r = null;
Writer w = null;
try{
/* r = new FileReader("F:\\ddd.txt");
w = new FileWriter("F:\\xyz.txt");*/
r = new FileReader("F:\\qqq.docx");
w = new FileWriter("F:\\ttt.docx");
char[] c = new char[100];
int len = 0;
while((len=r.read(c))!=-1){
w.write(c, 0, len);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(r!=null){
try {
r.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(w!=null){
try {
w.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
}
字节流可以拷贝视频和音频等文件,那么字符流可以拷贝这些吗?
经过验证拷贝图片是不行的。发现丢失了信息,为什么呢?计算机中的所有信息都是以二进制形式进行的存储(1010)图片中的也都是二进制在读取文件的时候字符流自动对这些二进制按照码表进行
了编码处理,但是图片本来就是二进制文件,不需要进行编码。有一些巧合在码表中有对应,就可以处理,并不是所有的二进制都可以找到对应的。信息就会丢失。所以字符流只能拷贝以字符为单位的文
本文件(以ASCII码为例是127个,并不是所有的二进制都可以找到对应的ASCII,有些对不上的,就会丢失信息。)