java转换流:
由于java中一个中文字符是由两个字节组成,在控制台显示文件时如果使用单字节显示则会出现乱码的情况,所以java提供了转换流。
字符流=字节流+编码表
编码表:
由现实世界的字符和对应的数值组成的一张表。(如下图)
下面我们结合代码来看字符流的具体应用:
OutputStreamWriter
OutputStreamWriter一共有五个写入方法
/*
* OutputStreamWriter的方法:
* public void write(int c):写一个字符
* public void write(char[] cbuf):写一个字符数组
* public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
* public void write(String str):写一个字符串
* public void write(String str,int off,int len):写一个字符串的一部分
*
*/
package com.lj.iodemo;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class IODemo7 {
public static void main(String[] args) throws IOException {
// 构造方法
// OutputStreamWriter(OutputStream out) 创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("osw.txt"));
// public void write(int c):写一个字符
outputStreamWriter.write('a');
outputStreamWriter.write(97);
// void close() 关闭此流,但要先刷新它。
outputStreamWriter.flush();
// public void write(int c):写一个字符数组
char[] cs = { 'a', 'b', 'c', 'd', 'e' };
outputStreamWriter.write(cs);
outputStreamWriter.flush();
// public void write(char[] cbuf):写一个字符数组的一部分
char[] cs2 = { 'q', 'w', 'e', 'r', 't' };
outputStreamWriter.write(cs2, 1, 2);
outputStreamWriter.flush();
// public void write(String str):写一个字符串
String s = "我是中文";
outputStreamWriter.write(s);
outputStreamWriter.flush();
// public void write(String str,int off,int len):写一个字符串的一部分
String s2 = "黑色看起来顺眼多了";
outputStreamWriter.write(s2, 0, 2);
outputStreamWriter.flush();
outputStreamWriter.close();
}
}
上面代码需要我们注意的是
close()和flush()的区别?
A:close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。
B:flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。
OutputStreamWriter
/*
* InputStreamReader的方法:
* int read():一次读取一个字符
* int read(char[] chs):一次读取一个字符数组
*/
代码如下:
package com.lj.iodemo;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class IODemo8 {
public static void main(String[] args) throws IOException {
/*
* InputStreamReader的方法: int read():一次读取一个字符 int
* read(char[]chs):一次读取一个字符数组
*/
// 构造方法 InputStreamReader(InputStream in) 创建一个使用默认字符集的
// InputStreamReader。
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("osw.txt"));
InputStreamReader inputStreamReader2 = new InputStreamReader(new FileInputStream("osw.txt"));
// int read():一次读取一个字符
int by = 0;
while ((by = inputStreamReader.read()) != -1) {
System.out.print((char)by);
}
System.out.println("-----------------");
//int read(char[] chs):一次读取一个字符数组
char[] cs = new char[1024];
int len = 0;
while((len = inputStreamReader2.read(cs))!=-1){
System.out.print(new String(cs,0,len));
}
inputStreamReader.close();
inputStreamReader2.close();
}
}
通过上面两种方式我们就可以完成java字符流对文件的读取。