Java字符流
目录
1 为什么会出现字符流【理解】
字符流的介绍
由于字节流操作中文不是特别的方便,所以
Java
就提供字符流
字符流
=
字节流
+
编码表
中文的字节存储方式
用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接
成中文,如何识别是中文的呢?
汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数
2 编码表【理解】
什么是字符集
是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等
l
计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码。
常见字符集有
ASCII
字符集、
GBXXX
字符集、
Unicode
字符集等
常见的字符集
ASCII
字符集:
lASCII
:是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符
(
回车键、退格、
换行键等
)
和可显示字符
(
英文大小写字符、阿拉伯数字和西文符号
)
基本的
ASCII
字符集,使用
7
位表示一个字符,共
128
字符。
ASCII
的扩展字符集使用
8
位表示一个字符,共
256
字符,方便支持欧洲常用字符。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、
图形符号、数字等
GBXXX
字符集:
GBK
:最常用的中文码表。是在
GB2312
标准基础上的扩展规范,使用了双字节编码方案,共收录了
21003
个汉字,完全兼容
GB2312
标准,同时支持繁体汉字以及日韩汉字等
Unicode
字符集:
UTF-8
编码:可以用来表示
Unicode
标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用
中,优先采用的编码。互联网工程工作小组(
IETF
)要求所有互联网协议都必须支持
UTF-8
编码。它使用
一至四个字节为每个字符编码
编码规则:
128
个
US-ASCII
字符,只需一个字节编码
拉丁文等字符,需要二个字节编码
大部分常用字(含中文),使用三个字节编码
其他极少使用的
Unicode
辅助字符,使用四字节编码
3 字符串中的编码解码问题【应用】
相关方法
代码演示
public class StringDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
//定义一个字符串
String s = "中国";
//byte[] bys = s.getBytes(); //[-28, -72, -83, -27, -101, -67]
//byte[] bys = s.getBytes("UTF-8"); //[-28, -72, -83, -27, -101, -67]
byte[] bys = s.getBytes("GBK"); //[-42, -48, -71, -6]
System.out.println(Arrays.toString(bys));
//String ss = new String(bys);
//String ss = new String(bys,"UTF-8");
String ss = new String(bys,"GBK");
System.out.println(ss);
}
}
4 字符流中的编码解码问题【应用】
字符流中和编码解码问题相关的两个类
InputStreamReader
:是从字节流到字符流的桥梁
它读取字节,并使用指定的编码将其解码为字符
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
OutputStreamWriter
:是从字符流到字节流的桥梁
是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
构造方法
代码演示
public class ConversionStreamDemo {
public static void main(String[] args) throws IOException {
//OutputStreamWriter osw = new OutputStreamWriter(new
FileOutputStream("myCharStream\\osw.txt"));
OutputStreamWriter osw = new OutputStreamWriter(new
FileOutputStream("myCharStream\\osw.txt"),"GBK");
osw.write("中国");
osw.close();
//InputStreamReader isr = new InputStreamReader(new
FileInputStream("myCharStream\\osw.txt"));
InputStreamReader isr = new InputStreamReader(new
FileInputStream("myCharStream\\osw.txt"),"GBK");
//一次读取一个字符数据
int ch;
while ((ch=isr.read())!=-1) {
System.out.print((char)ch);
}
isr.close();
}
}
5 字符流写数据的5种方式【应用】
方法介绍
刷新和关闭的方法
代码演示
public class OutputStreamWriterDemo {
public static void main(String[] args) throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new
FileOutputStream("myCharStream\\osw.txt"));
//void write(int c):写一个字符
// osw.write(97);
// osw.write(98);
// osw.write(99);
//void writ(char[] cbuf):写入一个字符数组
char[] chs = {'a', 'b', 'c', 'd', 'e'};
// osw.write(chs);
//void write(char[] cbuf, int off, int len):写入字符数组的一部分
// osw.write(chs, 0, chs.length);
// osw.write(chs, 1, 3);
//void write(String str):写一个字符串
// osw.write("abcde");
//void write(String str, int off, int len):写一个字符串的一部分
// osw.write("abcde", 0, "abcde".length());
osw.write("abcde", 1, 3);
//释放资源
osw.close();
}
}
6 字符流读数据的2种方式【应用】
方法介绍
代码演示
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new
FileInputStream("myCharStream\\ConversionStreamDemo.java"));
//int read():一次读一个字符数据
// int ch;
// while ((ch=isr.read())!=-1) {
// System.out.print((char)ch);
// }
//int read(char[] cbuf):一次读一个字符数组数据
char[] chs = new char[1024];
int len;
while ((len = isr.read(chs)) != -1) {
System.out.print(new String(chs, 0, len));
}
//释放资源
isr.close();
}
}
7 字符流复制Java文件【应用】
案例需求
把模块目录下的
“ConversionStreamDemo.java”
复制到模块目录下的
“Copy.java”
实现步骤
根据数据源创建字符输入流对象
根据目的地创建字符输出流对象
读写数据,复制文件
释放资源
代码实现
public class CopyJavaDemo01 {
public static void main(String[] args) throws IOException {
//根据数据源创建字符输入流对象
InputStreamReader isr = new InputStreamReader(new
FileInputStream("myCharStream\\ConversionStreamDemo.java"));
//根据目的地创建字符输出流对象
OutputStreamWriter osw = new OutputStreamWriter(new
FileOutputStream("myCharStream\\Copy.java"));
//读写数据,复制文件
//一次读写一个字符数据
// int ch;
// while ((ch=isr.read())!=-1) {
// osw.write(ch);
// }
//一次读写一个字符数组数据
char[] chs = new char[1024];
int len;
while ((len=isr.read(chs))!=-1) {
osw.write(chs,0,len);
}
//释放资源
osw.close();
isr.close();
}
}
8 字符流复制Java文件改进版【应用】
案例需求
使用便捷流对象,把模块目录下的
“ConversionStreamDemo.java”
复制到模块目录下的
“Copy.java”
实现步骤
根据数据源创建字符输入流对象
根据目的地创建字符输出流对象
读写数据,复制文件
释放资源
代码实现
public class CopyJavaDemo02 {
public static void main(String[] args) throws IOException {
//根据数据源创建字符输入流对象
FileReader fr = new FileReader("myCharStream\\ConversionStreamDemo.java");
//根据目的地创建字符输出流对象
FileWriter fw = new FileWriter("myCharStream\\Copy.java");
//读写数据,复制文件
// int ch;
// while ((ch=fr.read())!=-1) {
// fw.write(ch);
// }
char[] chs = new char[1024];
int len;
while ((len=fr.read(chs))!=-1) {
fw.write(chs,0,len);
}
//释放资源
fw.close();
fr.close();
}
}
9 字符缓冲流【应用】
字符缓冲流介绍
BufffferedWriter
:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可
以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
BufffferedReader
:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓
冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途
构造方法
代码演示
public class BufferedStreamDemo01 {
public static void main(String[] args) throws IOException {
//BufferedWriter(Writer out)
BufferedWriter bw = new BufferedWriter(new
FileWriter("myCharStream\\bw.txt"));
bw.write("hello\r\n");
bw.write("world\r\n");
bw.close();
//BufferedReader(Reader in)
BufferedReader br = new BufferedReader(new
FileReader("myCharStream\\bw.txt"));
//一次读取一个字符数据
// int ch;
// while ((ch=br.read())!=-1) {
// System.out.print((char)ch);
// }
//一次读取一个字符数组数据
char[] chs = new char[1024];
int len;
while ((len=br.read(chs))!=-1) {
System.out.print(new String(chs,0,len));
}
br.close();
}
}
10 字符缓冲流复制Java文件【应用】
案例需求
把模块目录下的
ConversionStreamDemo.java
复制到模块目录下的
Copy.java
实现步骤
根据数据源创建字符缓冲输入流对象
根据目的地创建字符缓冲输出流对象
读写数据,复制文件,使用字符缓冲流特有功能实现
释放资源
代码实现'
public class CopyJavaDemo01 {
public static void main(String[] args) throws IOException {
//根据数据源创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new
FileReader("myCharStream\\ConversionStreamDemo.java"));
//根据目的地创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new
FileWriter("myCharStream\\Copy.java"));
//读写数据,复制文件
//一次读写一个字符数据
// int ch;
// while ((ch=br.read())!=-1) {
// bw.write(ch);
// }
//一次读写一个字符数组数据
char[] chs = new char[1024];
int len;
while ((len=br.read(chs))!=-1) {
bw.write(chs,0,len);
}
//释放资源
bw.close();
br.close();
}
}
11 字符缓冲流特有功能【应用】
方法介绍
BufffferedWriter
:
BufffferedReader:
代码演示
public class BufferedStreamDemo02 {
public static void main(String[] args) throws IOException {
//创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new
FileWriter("myCharStream\\bw.txt"));
//写数据
for (int i = 0; i < 10; i++) {
bw.write("hello" + i);
//bw.write("\r\n");
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
//创建字符缓冲输入流
BufferedReader br = new BufferedReader(new
FileReader("myCharStream\\bw.txt"));
String line;
while ((line=br.readLine())!=null) {
System.out.println(line);
}
br.close();
}
}
12 字符缓冲流特有功能复制Java文件【应用】
案例需求
使用特有功能把模块目录下的
ConversionStreamDemo.java
复制到模块目录下的
Copy.java
实现步骤
根据数据源创建字符缓冲输入流对象
根据目的地创建字符缓冲输出流对象
读写数据,复制文件,使用字符缓冲流特有功能实现
释放资源
代码实现
public class CopyJavaDemo02 {
public static void main(String[] args) throws IOException {
//根据数据源创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new
FileReader("myCharStream\\ConversionStreamDemo.java"));
//根据目的地创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new
FileWriter("myCharStream\\Copy.java"));
//读写数据,复制文件
//使用字符缓冲流特有功能实现
String line;
while ((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
br.close();
}
}
13 IO流小结【理解】
字节流
字符流
浙公网安备 33010602011771号