预先知识:
在学习字符流之前先复习下之前的编码知识:
Java的文本(char)是16位无符号证书,是字符的Unicode编码(双字节编码)
文件是byte、byte、byte...的数据序列。
文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk)序列化为byte的存储数据。
字符流
字符流顾名思义是字符的处理,一次处理一个字符,字符的底层任然是基本的字节序列(操作的是文本,文本文件)
InputStreamReader 完成byte流解析为char流,按照编码解析
OutputStreamWriter 完成char流到byte流,按照编码处理
示例代码:
public class IsrAndOswDemo {
public static void main(String[] args)throws IOException {
FileInputStream in = new FileInputStream("e:\\jun.txt");
InputStreamReader isr = new InputStreamReader(in,"utf-8");//默认项目的编码,操作的时候,要写文件本身的编码格式
FileOutputStream out = new FileOutputStream("e:\\yang.txt");//无法指定编码
OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
// int b ; 单个字符读取
// int a=0;
// while((b = isr.read())!=-1){
// a++;
// System.out.print((char)b);
// }
// System.out.println(a);
char[] buffer = new char[8*1024];
int c;
/*批量读取,放入buffer这个字符数组,从第0个位置开始放置,最多放buffer.length个
返回的是读到的字符的个数
*/
while(( c = isr.read(buffer,0,buffer.length))!=-1){
System.out.println(" c的值为:"+c+" buffer.length="+buffer.length);
String s = new String(buffer,0,c);
System.out.print(s);
osw.write(buffer,0,c);
osw.flush();
}
isr.close();
osw.close();
}
}
为了更便捷,此外由此衍生出了字符流的:FileReader FileWriter
示例代码:
public class FrAndFwDemo {
public static void main(String[] args) throws IOException{
FileReader fr = new FileReader("e:\\javaio\\imooc.txt");
FileWriter fw = new FileWriter("e:\\javaio\\imooc2.txt");
//FileWriter fw = new FileWriter("e:\\javaio\\imooc2.txt",true);
//true为append参数,表示往源文件内追加内容
char[] buffer = new char[2056];
int c ;
while((c = fr.read(buffer,0,buffer.length))!=-1){
fw.write(buffer,0,c);
fw.flush();
}
fr.close();
fw.close();
}
}
便捷的字符流过滤器:
BufferedReader ---->readLine 一次读一行
BufferedWriter/PrintWriter---->一次写一行
public class IsrAndOswDemo {
public static void main(String[] args) throws IOException{
//对文件进行读写操作
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream("e:jun.txt"),"utf-8"));
/*BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("e:\\javaio\\imooc3.txt")));*/
PrintWriter pw = new PrintWriter("e:imooc4.txt");
//PrintWriter pw1 = new PrintWriter(outputStream,boolean autoFlush);
String line ;
while((line = br.readLine())!=null){
System.out.println(line);//一次读一行,并不能识别换行
/*bw.write(line);
//单独写出换行操作
bw.newLine();//换行操作
bw.flush();*/
pw.println(line);
pw.flush();
}
br.close();
//bw.close();
pw.close();
}}
网友评论