一、InputStreamReader类
1、转换流`java.io.InputStreamReader`,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。
2、构造方法
InputStreamReader(InputStream in)`:
创建一个使用默认字符集的字符流。
InputStreamReader(InputStream in, String charsetName)`:
创建一个指定字符集的字符流。
二、OutputStreamWriter类
1、转换流`java.io.OutputStreamWriter` ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。
2、构造方法
OutputStreamWriter(OutputStream in)`:
创建一个使用默认字符集的字符流。
OutputStreamWriter(OutputStream in, String charsetName)`:
创建一个指定字符集的字符流。
三、转换流理解图解
四、案例
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/*
java.io.InputStreamReader extends Reader
InputStreamReader:是字节流通向字符流的桥梁:它使用指定的charset读取自己诶并将其解码为字符。
继承父类的成员方法:
int read()读取单个字符并返回。
int read(char[] cbuf)一次性读取多个字符,将字符传入数组
void close()关闭该流并释放与之关联的所有资源。
构造方法:
InputStreamReader(InputStream in)创建一个使用默认字符集的InputStreamReader
InputStreamReader(InputStream in , Streing charsetName)创建指定字符集的InputStreamReader
使用步骤:
1、创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称。
2、使用InputStreamReader对象中年的方法read读取文件
3、释放资源。
注意事项:
构造方法中指定的编码表名称要和文件的编码相同
*/
public class Demo02InputStreamReader {
public static void main(String[] args) throws IOException {
System.out.println("===使用默认编码表读取UTF-8文件===");
InputStreamReader isr1 = new InputStreamReader(new FileInputStream(
"我是UTF-8文件.txt"));
char[] chars = new char[1024];
int len = 0;
while((len = isr1.read(chars)) != -1){
System.out.println(new String(chars,0,len));
}
System.out.println("=======使用GBK编码表读取GBK文件======");
InputStreamReader isr2 = new InputStreamReader(new FileInputStream(
"我是GBK文件.txt"), "GBK");
char[] chars2 = new char[1024];
int len2 = 0;
while((len2 = isr2.read(chars2)) != -1){
System.out.println(new String(chars2,0,len2));
}
System.out.println("=======使用UTF-8编码表读取GBK文件======");
InputStreamReader isr3 = new InputStreamReader(new FileInputStream(
"我是GBK文件.txt"), "UTF-8");
char[] chars3 = new char[1024];
int len3 = 0;
while((len3 = isr3.read(chars3)) != -1){
System.out.println(new String(chars3,0,len3));
}
}
}
案例二、OuputStreameWriter
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
/*
FileReader可以读取IDE默认编码格式(UTF-8)的文件
FileReader读取系统默认编码(中文GBK)会产生乱码
java.io.OutputStreamWriter extends Writer
outputStreamWriter:是字符流通向字节流的桥梁;可使用指定的charset将要写入的字符编码成字节。
继承父类共性方法:
-void write(int c)写入单个字符。
-void write(char[] cbuf)写入字符数组
-abstract void write(char[] cbuf,int off, int len)写入字符串某一部分.
-void write(String str)写入字符串
-void write(String str, int off, int len)写入字符串某一部分
-void flush()刷新该流缓冲
-void close()关闭此流,但要先刷新它
构造方法:
outputStreamWriter(outputStream out)创建使用默认字符编码的outputStreamWriter
OutputStreamWriter(outputStream out,String charsetName)创建使用指定字符集的outputStreamWriter
参数:
OutputStream out:字节输出流,可以用来写转换之后的字节到文件中
String charsetName:指定的编码表名称,不区分带下写,可以是utf-8/UTF-8,gbk/GBK,...不指定默认使用UTF-8
使用步骤:
1、创建OutputStreamWriter对象,够着方法中传递字节输出流指定的编码表名称。
2、使用OutputStreamWriter对象的方法Write,把字符转换为字节储存缓冲区中(编码)
3、使用OutputStreamWriter对象中的方法flush,把内存缓冲区中内容写到硬盘中。
4、释放资源
*/
public class Demo01OutputStreameWriter {
public static void main(String[] args) throws IOException {
/*
用默认方式UTF-8写入UTF-8文件
*/
OutputStreamWriter osw1 = new OutputStreamWriter(new FileOutputStream(
"我是UTF-8文件.txt"));
osw1.write("中华人民共和国(UTF-8)");
osw1.flush();
osw1.write("\r\n,伟大的祖国");
osw1.close();
/*
用默认方式UTF-8写入GBK文件---这里看会是乱码,要直接打开文本
*/
OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream(
"我是GBK文件.txt"),"GBK");
osw2.write("中华人民共和国(UTF-8)");
osw2.flush();
osw2.write("\r\n,伟大的祖国");
osw2.close();
}
}