字符流也是一种能读取和写入的流。只不过它专门处理字符,不处理字节
字符流有Writer和Reader两个抽象类。我们常用的字符流就是其下的FileWriter和FileReader来对文件内容进行读取和写入。
1,字符输入流FileReader读取文本文件
目录结构如下
首先创建一个FileReader对象并令其获取这个pro.txt的File对象
File file = new File("F:/java/pro.txt");
Reader reader = new FileReader(file);
这样一个FileReader就创建完成。接着使用相应方法来进行文件内容的读取。
read();//读取下一个字符,返回一个字符码值,如果没有内容即读到了末尾,返回-1
read(char[] char);//读取char.length位字符,并把值从char[0]开始存取。如果没有内容返回-1
read(char[] char,int off,int len);//从char[off]开始存取数据,从0开始读取,读len位。如果没有内容返回-1
File file = new File("F:/java/pro.txt");
Reader reader = new FileReader(file);
//读取下一个位数,如果有字符返回该字符的编码,否则返回-1
//reader.read();
char[] chars = new char[10];
//读取10位,把读取到的数据从chars[0]开始存取.len不能>chars.length-off
reader.read(chars,0,10);
int len = 0;
//读取chars.length位长度,并将对应的字符编码数据存到chars中,返回读取到的实际位数.
while ((len=reader.read(chars))!=-1){
System.out.println(new String(chars,0,len));
}
运行结果如下:
会发现同样在读取"UTF-8"格式的文档时第一行开头多出个符号或乱码。这个应该是个BUG,只能说根据具体情况具体处理了。或者有能力的话可以自己去修复这个JAVABUG。。
2,字符输出流FileWriter写文本文件
目录如下,目标就是用字符输入流把内容写到pro里面
首先创建一个FileWriter对象并令其获取pro的File对象
File file = new File("F:/java/pro.txt");
Writer writer = new FileWriter(file);
这样就可以往pro里面编辑了。
write(String str);//写入一串字符串,参数是String
write(char[] c);//写入一串字符,用char[]数组
write(String str,inf off,int len);//写入一串字符串,从String字符串第off位开始取数据并写入到文本中,写len长度,len不能>str.length()-off
write((char[] c,inf off,int len);//写入一串字符,用char数组,从char[off]位开始拿数据并写入到文本中,写len长度,len不能>char.length-off
flush();//刷新缓冲区,字符流会使用缓冲区。需要调用此方法才能把数据真正的写入到文本中。也可以直接调用close();方法,这个方法包含了flush()的功能
File file = new File("F:/java/pro.txt");
Writer writer = new FileWriter(file);
//往pro.txt写入"你好啊"
writer.write("你好啊");
//往pro.txt写入"好啊"
writer.write("你好啊",1,2);
//字符流会使用缓冲区.需要刷新缓存才能把写入的数据填写到文本中
writer.flush();
//当然可以直接调用close(),close()里面包含了刷新缓存功能
writer.close();
运行结果如下:
字符流会使用缓冲流,需要调用flush()方法才会把数据写到文本中。也可以直接调用close()方法。close()方法包含了flush()的功能
3,字节流和字符流的区别
(1)代码上的区别。
字节流使用OutputStream和InputStream。且读取和写入的是byte
字符流使用Writer和Reader。读取和写入的是字符即String,char
(2)字符流会使用缓冲。字节流默认不会使用缓冲
(3)数据处理的区别。字节流能处理任何文件。字符流只能处理文本。
首先文本文件不用说都能处理。下面来让两种流分别读取一张图片看看效果会如何
看下图,这是一张图片。
分别用字节流和字符流读取看看结果。
字符流是一堆乱码,字节流则是编码。原因是图片里面保存的是二进制数据,而字节流操作的是字节就是二进制数据,字符流操作的是Unicode码元。每个字母,都有对应的编码元存在。字符流能方便的直接操作这些编码。但字节流不行。