OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。
import java.io.*;
/*
java.io.OutputStreamWriter extends Writer
OutputStreamWriter:是字符流通向字节流的桥梁,可使用指定的charset 将要写入流中的字符编码成字节。(编码:把能看懂的编程看不懂)
继承自父类的共性成员方法:
writer
构造方法:
OutputStreamWriter(OutputStream out):创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName):创建使用指定字符集的 OutputStreamWriter。
参数:
OutputStream out:字节输出流,可以用来写转换之后的字节到文件中。
String charsetName:指定的编码表名称,不区分大小写。不指定默认使用UTF-8
使用步骤:
1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
2.使用OutputStreamWriter对象中的方法write,把字符转换为字节,存储到缓冲区(编码)
3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
4.释放资源
*/
public class Demo02OutputStreamWriter {
public static void main(String[] args) throws IOException {
write_utf_8();
while_gbk();
}
private static void while_gbk() throws IOException {
// 1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称,后面是指定了utf-8编码表
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\day10-IO\\day10-IO\\src\\gbk.txt"), "gbk");
//2.使用OutputStreamWriter对象中的方法write,把字符转换为字节,存储到缓冲区(编码)
osw.write("你好");
//3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
osw.flush();
//释放资源
osw.close();
}
//-----------------------------------------------
/*
使用转换流OutputStreamWriter写UTF-8格式的文件
*/
private static void write_utf_8() throws IOException {
// 1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称,后面是指定了utf-8编码表
// OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\day10-IO\\day10-IO\\src\\utf_8.txt"), "utf-8");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\day10-IO\\day10-IO\\src\\utf_8.txt"));//不指定默认是utf-8
//2.使用OutputStreamWriter对象中的方法write,把字符转换为字节,存储到缓冲区(编码)
osw.write("你好");
//3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
osw.flush();
//释放资源
osw.close();
}
}
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/*
java.io.InputStreamReader extends Reader
InputStreamReader:是字节流通向字符流的桥梁,它使用指定的charset 读取字节并将其解码为字符。(解码:把看不懂的编程能看懂的)
继承自父类的共性成员方法:
read
构造方法:
InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader
InputStreamReader(InputStream in,String charsetName)创建使用指定字符集的InputStreamReader
参数:
InputStream in:字节输入流,用来读取文件中保存的字节
String charsetName:指定的编码表名称,不区分大小写,不指定默认使用utf-8
使用步骤:
1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
2.创建InputStreamReader对象中的方法read读取文件
3.释放资源
注意事项:
构造方法中指定的编码表名称要和文件的编码相同,否则会发生乱码
*/
public class Demo03InputStreamReader {
public static void main(String[] args) throws IOException {
//read_utf_8();
read_gbk();
}
//-----------------------------------------
private static void read_gbk() throws IOException {
//1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\day10-IO\\day10-IO\\src\\gbk.txt"),"gbk");
//2.创建InputStreamReader对象中的方法read读取文件
int len = 0;
while ((len = isr.read()) != -1) {
System.out.println((char) len);
}
//3.释放资源
isr.close();
}
//-------------------------------------
/*
使用InputStreamReader读取UTF-8格式的文件
*/
private static void read_utf_8() throws IOException {
//1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\day10-IO\\day10-IO\\src\\utf_8.txt"));
//2.创建InputStreamReader对象中的方法read读取文件
int len = 0;
while ((len = isr.read()) != -1) {
System.out.println((char) len);
}
//3.释放资源
isr.close();
}
}
转换文件练习:
import java.io.*;
/*
练习:转换文件编码
将GBK编码的文本文件,转换为UTF-8编码的文本文件。
分析:
1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称GBK
2.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称UTF-8
3.使用InputStreamReader对象中的方法read读取文件
4.使用OutputStreamWriter对象中的方法write,把读取的数据写入到文件中
5.释放资源
*/
public class Demo04Test {
public static void main(String[] args) throws IOException {
// 1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称GBK
InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\day10-IO\\day10-IO\\src\\我是GBK的文本.txt"),"GBK");
// 2.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称UTF-8
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\day10-IO\\day10-IO\\src\\我是UTF-8的文本.txt"),"UTF-8");
// 3.使用InputStreamReader对象中的方法read读取文件
int len = 0;
while ((len = isr.read())!= -1) {
//4.使用OutputStreamWriter对象中的方法write,把读取的数据写入到文件中
//将len代入
osw.write(len);
}
//5.释放资源
osw.close();
isr.close();
}
}