目录
④abstract void write(char[] cbuf, int off, int len)
⑦void write(String str, int off, int len)
①OutputStreamWriter(OutputStream out)
②OutputStreamWriter(OutputStream out, String charsetName)
①InputStreamReader(InputStream in)
②InputStreamReader(InputStream in, String charsetName)
一、字符编码和字符集
1、字符编码
编码与解码
我们知道,计算机存储的数据全部都是二进制的,而我们屏幕上显示的文字、符号、图片、视频等都是二进制转换后的结果。则按照某种规则将数组存储到计算机就是编码;与之对应的,将存储子计算机中的数据按照某种规则进行解析显示出来就是解码。
字符编码
字符编码就是一套自然语言的字符与计算机中二进制之间的对应规则;
编码表:生活中的文字与计算机中二进制的对应规则;
2、字符集
字符集
字符集也叫编码表,是一个系统支持的所有字符的集合,包括各国文字、标点符号、图形符号、数字等;
常见的字符集有:ASCII字符集,GBK字符集,Unicode字符集
每一套字符集至少对应一种编码
ASCII字符集——ASCII编码;
GBK字符集——GBK编码;
Unicode字符集——UTF8编码(最常用)、UTF16编码、UTF32编码;
当制定了编码字符集就确定了,所以编码是最终关心的。
二、编码引出的问题
在IDEA中,使用FileReader读取项目中的文本文件,由于IDEA的设置默认为UTF-8编码,所以没有任何问题;但是Windows读取创建的文本文件时,由于Windows系统默认的编码是GBK编码,就会出现乱码;
三、转换流的原理
四、OutputStreamWriter简介及使用
1、简介
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节(编码);
2、继承自父类的共性成员方法
①abstract void close()
关闭此流,但要先刷新它;
②abstract void flush()
刷新该流的缓冲;
③void write(char[] cbuf)
写入字符数组;
④abstract void write(char[] cbuf, int off, int len)
写入字符数组的某一部分;
⑤void write(int c)
写入单个字符;
⑥void write(String str)
写入字符串;
⑦void write(String str, int off, int len)
写入字符串的某一部分;
3、构造方法
①OutputStreamWriter(OutputStream out)
创建使用默认字符编码的 OutputStreamWriter;
②OutputStreamWriter(OutputStream out, String charsetName)
创建使用指定字符集的 OutputStreamWriter;
参数说明:
OutputStream out:字符输出流,可以将转换之后的字节写入到文件中;
String charsetName:指定编码的名称,不区分大小写(例如:utf8/UTF8,gbk/GBK),不指定默认为UTF8;
4、使用步骤
①创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称;
②使用OutputStreamWriter中的write方法,把字符转换成字节存储在缓冲区中(编码);
③使用OutputStreamWriter中的flush方法,将缓冲区中的字节刷新到文件中(使用字节流写字节的过程);
④释放资源;
5、代码演示
代码:
package study.io;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class OutputStreamWriterTest {
public static void main(String[] args) throws IOException {
//①创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称;
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test.txt"), "GBK");
//②使用OutputStreamWriter中的write方法,把字符转换成字节存储在缓冲区中(编码);
outputStreamWriter.write("哈哈哈哈哈哈哈!");
//③使用OutputStreamWriter中的flush方法,将缓冲区中的字节刷新到文件中(使用字节流写字节的过程);
outputStreamWriter.flush();
//④释放资源;
outputStreamWriter.close();
}
}
运行结果:
备注:
当代码写入文件的编码是UTF-8的时候,文件的格式是UTF-8;
五、InputStreamReader简介及使用
1、简介
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符;
2、继承自父类的共性成员方法
①abstract void close()
关闭该流并释放与之关联的所有资源;
②int read()
读取单个字符;
③int read(char[] cbuf)
将字符读入数组;
3、构造方法
①InputStreamReader(InputStream in)
创建一个使用默认字符集的 InputStreamReader;
②InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader;
参数说明:
InputStream in:字节输入流,用来读取文件中保存的字节;
String charsetName:指定的编码表名称,不起区分大小写,默认为UTF-8;
4、使用步骤
①创建InputStreamReader对象,构造方法中传入字节输入流和指定的编码表名称;
②使用InputStreamReader中的read读取文件;
③释放资源;
注意:构造方法中指定的编码表要和文件的编码一直,否则会乱码;
5、代码演示
代码:
package study.io;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputStreamReaderTest {
public static void main(String[] args) throws IOException {
//①创建InputStreamReader对象,构造方法中传入字节输入流和指定的编码表名称;
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("C:\\Users\\Administrator\\Desktop\\test.txt"), "GBK");
//②使用InputStreamReader中的read读取文件;
char[] chars = new char[1024];
while (true){
int num = inputStreamReader.read(chars);
if(num==-1){
break;
}
System.out.println(chars);
}
//③释放资源;
inputStreamReader.close();
}
}
运行结果:
六、练习:转换文件编码
1、代码
package study.io;
import java.io.*;
import java.nio.charset.StandardCharsets;
public class Code_Conversion {
public static void main(String[] args) throws IOException {
//文件格式本来是GBK,要以GBK编码读取,用UTF-8编码写入
//1、创建InputStreamReader对象,并读取文件
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("C:\\Users\\Administrator\\Desktop\\test.txt"),"GBK");
char[] chars = new char[1024];
StringBuilder sb = new StringBuilder();
while (true){
int num = inputStreamReader.read(chars);
if(num==-1){
break;
}
sb.append(chars);
}
inputStreamReader.close();
System.out.println("文件读取结果:"+sb.toString());
//2、创建OutputStreamWriter对象,并进行文件写入
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test.txt"), StandardCharsets.UTF_8);
outputStreamWriter.write(sb.toString());
outputStreamWriter.flush();
outputStreamWriter.close();
}
}
2、运行结果