愚公系列2022年01月 Java教学课程 55-字符的读取与写入

网友投稿 421 2022-05-29

一、字符的读取与写入

1.为什么会出现字符流

字符流的介绍

由于字节流操作中文不是特别的方便,所以Java就提供字符流

字符流 = 字节流 + 编码表

中文的字节存储方式

用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢?

汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数

2.编码表

什么是字符集

是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等

l计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码。常见字符集有ASCII字符集、GBXXX字符集、Unicode字符集等

常见的字符集

ASCII字符集:

【愚公系列】2022年01月 Java教学课程 55-字符的读取与写入

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.字符流写数据

介绍

Writer: 用于写入字符流的抽象父类

FileWriter: 用于写入字符流的常用子类

构造方法

成员方法

刷新和关闭的方法

代码演示

public class OutputStreamWriterDemo { public static void main(String[] args) throws IOException { FileWriter fw = new FileWriter("myCharStream\\a.txt"); //void write(int c):写一个字符 // fw.write(97); // fw.write(98); // fw.write(99); //void writ(char[] cbuf):写入一个字符数组 char[] chs = {'a', 'b', 'c', 'd', 'e'}; // fw.write(chs); //void write(char[] cbuf, int off, int len):写入字符数组的一部分 // fw.write(chs, 0, chs.length); // fw.write(chs, 1, 3); //void write(String str):写一个字符串 // fw.write("abcde"); //void write(String str, int off, int len):写一个字符串的一部分 // fw.write("abcde", 0, "abcde".length()); fw.write("abcde", 1, 3); //释放资源 fw.close(); } }

5.字符流读数据

介绍

Reader: 用于读取字符流的抽象父类

FileReader: 用于读取字符流的常用子类

构造方法

成员方法

代码演示

public class InputStreamReaderDemo { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("myCharStream\\b.txt"); //int read():一次读一个字符数据 // int ch; // while ((ch=fr.read())!=-1) { // System.out.print((char)ch); // } //int read(char[] cbuf):一次读一个字符数组数据 char[] chs = new char[1024]; int len; while ((len = fr.read(chs)) != -1) { System.out.print(new String(chs, 0, len)); } //释放资源 fr.close(); } }

6.字符流用户注册案例

案例需求

将键盘录入的用户名和密码保存到本地实现永久化存储

实现步骤

获取用户输入的用户名和密码

将用户输入的用户名和密码写入到本地文件中

关流,释放资源

代码实现

public class CharStreamDemo8 { public static void main(String[] args) throws IOException { //需求: 将键盘录入的用户名和密码保存到本地实现永久化存储 //要求:用户名独占一行,密码独占一行 //分析: //1,实现键盘录入,把用户名和密码录入进来 Scanner sc = new Scanner(System.in); System.out.println("请录入用户名"); String username = sc.next(); System.out.println("请录入密码"); String password = sc.next(); //2.分别把用户名和密码写到本地文件。 FileWriter fw = new FileWriter("charstream\\a.txt"); //将用户名和密码写到文件中 fw.write(username); //表示写出一个回车换行符 windows \r\n MacOS \r Linux \n fw.write("\r\n"); fw.write(password); //刷新流 fw.flush(); //3.关流,释放资源 fw.close(); } }

7.字符缓冲流

字符缓冲流介绍

BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途

BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途

构造方法

代码演示

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(); } }

8.字符缓冲流特有功能

方法介绍

BufferedWriter:

BufferedReader:

代码演示

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(); } }

9.9字符缓冲流操作文件中数据排序案例

案例需求

使用字符缓冲流读取文件中的数据,排序后再次写到本地文件

实现步骤

将文件中的数据读取到程序中

对读取到的数据进行处理

将处理后的数据添加到集合中

对集合中的数据进行排序

将排序后的集合中的数据写入到文件中

代码实现

public class CharStreamDemo14 { public static void main(String[] args) throws IOException { //需求:读取文件中的数据,排序后再次写到本地文件 //分析: //1.要把文件中的数据读取进来。 BufferedReader br = new BufferedReader(new FileReader("charstream\\sort.txt")); //输出流一定不能写在这里,因为会清空文件中的内容 //BufferedWriter bw = new BufferedWriter(new FileWriter("charstream\\sort.txt")); String line = br.readLine(); System.out.println("读取到的数据为" + line); br.close(); //2.按照空格进行切割 String[] split = line.split(" ");//9 1 2 5 3 10 4 6 7 8 //3.把字符串类型的数组变成int类型 int [] arr = new int[split.length]; //遍历split数组,可以进行类型转换。 for (int i = 0; i < split.length; i++) { String smallStr = split[i]; //类型转换 int number = Integer.parseInt(smallStr); //把转换后的结果存入到arr中 arr[i] = number; } //4.排序 Arrays.sort(arr); System.out.println(Arrays.toString(arr)); //5.把排序之后结果写回到本地 1 2 3 4... BufferedWriter bw = new BufferedWriter(new FileWriter("charstream\\sort.txt")); //写出 for (int i = 0; i < arr.length; i++) { bw.write(arr[i] + " "); bw.flush(); } //释放资源 bw.close(); } }

总结

5G教育 Java

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Shared memory共享内存
下一篇:销售 小姐姐 给买家打分系统,用 Python Django 又整了一个花活
相关文章