为什么会出现字符流?
由于字节流操作中文不是特别的方便,通过上篇博客我们可以知道字节流操作下的中文我们是看不懂的,所以Java就提供了字符流
什么是字符流?
字符流=字节流+编码表
编码表如下
用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行
字节拼接成中文,如何识别中文的呢?
汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数,所以当我们看到第一个字节为负数的时候就知道这是中文。
下面我们讨论字符流中都有哪些基础知识:
编码与解码
String s ="中国";
//编码
byte[] bys=s.getBytes();
//解码
String ss = new String (bys);
//输出
System.out.println("编码:"+bys);
System.out.println("解码:"+ss);
字符流写数据的五种方式
//创建一个使用默认字符编码的OutputStreamWrite并创建一个文件输出流文件用于写数据
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("itheima\\osw.txt"));
//写一个字符
osw.write("97");
//写一个字符数组
char[] chs = {'a', 'b', 'c', 'd'};
osw.write(chs);
//写字符数组的一部分
osw.write(chs, 0, chs.length);
osw.write(chs, 1, 3);
//写一个字符串
osw.write("abcde");
//写一个字符串的一部分
osw.write("abcde", 0, "abcde".length());
//刷新流
osw.flush();
//释放流
osw.close();
flush()刷新提交没有提交的数据
close()每次释放流之前都会进行一次刷新来避免没有提交的数据
所以上面的代码中就可以省略刷新流
字符流读数据的两种方式
//创建一个使用默认字符集的InputStreamReader并指定一个输入字符流文件用于读数据
InputStreamReader isr =new InputStreamReader(new FileInputStream("itheima\\isr.txt"));
//一次读一个字符数据
int ch
while((ch=isr.read())!=-1){
System.out.print((char) ch);
}
//一次读一个字符数组数据
char[]chs=new char[1024];
int len;
while((len=isr.read(chs))!=-1){
System.out.println(new String(chs,0,len));
}
//释放资源
isr.close();
字符流复制文件
//创建一个使用默认字符编码的OutputStreamWrite并创建一个txt文件用于写数据
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("itheima\\osw.txt"));
//创建一个使用默认字符集的InputStreamReader并指定一个输入字符流文件用于读数据
InputStreamReader isr = new InputStreamReader(new FileInputStream("itheima\\isr.txt"));
//字符流复制文件
char[] chs =new char[1024];
int len ;
while((len=isr.read(chs))!=-1){
osw.write(chs,0,len);
}
数据源和目的地的分析
数据源:myCharStream\\ConversionStreamDemo.java--读数据--Reader--InputStreamReader--FileReader
目的地:myCharStream\\Copy.java--写数据--Writer--OutputStreamWriter--FileWriter
强调:为了简化书写,我们用了转换流的具体的直接子类(FileReader\FileWriter),但是字符流中如果涉及编码和解码问题还得使用转换流InputStreamReader和OutputStreamWriter
字符缓冲流
//创建字符缓冲输出流
BufferedWriterbw=newBufferedWriter(newFileWriter("idea_test\\bw.txt"));
//写数据三步骤
for(inti=0;i<10;i++){
bw.write("hello"+i);
bw.write("\r\n");
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
//创建字符缓冲输入流
BufferedReaderbr=newBufferedReader(newFileReader("idea_test\\br.txt"));
Stringline;
while((line=br.readLine())!=null){
System.out.println(line);
}
//释放资源
br.close();
字符缓冲流特有功能:
newLine();行分隔符,由系统属性定义
readLine();读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null。
IO流小结