知识点:
1.字符串中的编码解码
2.字符流读写数据: FileWriter和FileReader
一.Unicode码表
大吉大利----查询-----> Unicode ---码表中对应的数字-------> 编码utf-8 --------转换二进制------> 存储
今晚吃鸡<--展示------ 码表 <--查询----码表中对应的数字---- 解码utf-8 <-------读取二进制---- 计算机
重点:
windows默认使用码表为:GBK,一个字符两个字节。
idea和以后工作默认使用Unicode的UTF-8编解码格式,一个中文三个字节
二.字符串中的编码解码问题
1.编码:
byte[] getBytes():使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName):使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
2.解码:
String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的 String
String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的 String
3.代码案例实现:
public class CharStreamDemo2 {
public static void main(String[] args) throws UnsupportedEncodingException {
//1.编码
//byte[] getBytes():
//使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
//byte[] getBytes(String charsetName):
//使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
String s = "黑马程序员";
//利用idea默认的UTF-8将中文编码为一系列的字节
byte[] bytes1 = s.getBytes(); //byte[] bytes1 = s.getBytes("UTF-8");
System.out.println(Arrays.toString(bytes1));
byte[] bytes2 = s.getBytes("GBK");
System.out.println(Arrays.toString(bytes2));
//2.解码
//String(byte[] bytes):
//通过使用平台的默认字符集解码指定的字节数组来构造新的 String
//String(byte[] bytes, String charsetName):
//通过指定的字符集解码指定的字节数组来构造新的 String
byte [] bytes1 = {-23, -69, -111, -23, -87, -84, -25, -88, -117, -27, -70, -113, -27, -111, -104};//UTF-8
byte [] bytes2 = {-70, -38, -62, -19, -77, -52, -48, -14, -44, -79}; //gbk
//利用默认的UTF-8进行解码
String s1 = new String(bytes1);
System.out.println(s1);//黑马程序员
//利用指定的GBK进行解码
String s2 = new String(bytes2,"gbk");
System.out.println(s2);//黑马程序员
}
}
三.字符流
1.字符流读取中文的过程
字符流 = 字节流 + 编码表
基础知识:不管是在哪张码表中,中文的第一个字节一定是负数。
a黑马--------> 97 | -23 -69 -111 | -23 -87 -84
2.结论规则
(1)想要进行拷贝,一律使用字节流或者字节缓冲流。
(2)想要把文件中的数据读到内存中打印或者读到内存中运算,请使用字符输入流。
想要把集合,数组,键盘录入等数据写到文件中,请使用字符输出流
(3)GBK码表一个中文两个字节,UTF-8编码格式一个中文3个字节
四.字符流写数据
1.字符流写数据的5种方式
void write(int c) 写一个字符
void write(char[] cbuf) 写入一个字符数组
void write(char[] cbuf, int off, int len) 写入字符数组的一部分
void write(String str) 写一个字符串
void write(String str, int off, int len) 写一个字符串的一部分
2.创建字符输出流对象注意事项
创建字符输出流对象,注意事项:
如果文件不存在,就创建。但是要保证父级路径存在。
如果文件存在就清空。
写数据,注意事项:
写出int类型的整数,实际写出的是整数在码表上对应的字母。
写出字符串数据,是把字符串本身原样写出
释放资源,注意事项:
每次使用完流必须要释放资源。
3.代码实现:
public class CharStreamDemo3 {
public static void main(String[] args) throws IOException {
//1.创建字符输出流的对象
//FileWriter fw = new FileWriter(new File("charstream\\a.txt"));
FileWriter fw = new FileWriter("charstream\\a.txt");
//2.1.void write(int c) 写一个字符
fw.write(97);
fw.write(98);
fw.write(99);
//2.2.void write?(char[] cbuf) 写出一个字符数组
char [] chars = {97,98,99,100,101};
fw.write(chars);
//2.3.void write(char[] cbuf, int off, int len) 写出字符数组的一部分
char [] chars = {97,98,99,100,101};
fw.write(chars,0,3);
//2.4void write(String str) 写一个字符串
String line = "黑马程序员abc";
fw.write(line);
//2.5void write(String str, int off, int len) 写一个字符串的一部分
String line = "黑马程序员abc";
fw.write(line,0,2);
//3.释放资源
fw.close();
}
}
五.字符流写数据的5种方式
flush() 刷新流,还可以继续写数据
close() 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据
public class CharStreamDemo5 {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("charstream\\a.txt");
fw.write("黑马程序员");
//flush()刷新流。刷新完毕之后,还可以继续写数据
fw.flush();
//close()关闭流前会调用flush方法。释放资源。一旦关闭,就不能写数据
fw.close();
}
}
六.字符流读数据的2种方式
int read() 一次读一个字符数据
int read(char[] cbuf) 一次读一个字符数组数据
public class CharStreamDemo6 {
public static void main(String[] args) throws IOException {
//创建字符输入流的对象
//FileReader fr = new FileReader(new File("charstream\\a.txt"));
FileReader fr = new FileReader("charstream\\a.txt");
//1.read()一次读取一个字符
int ch;
while((ch = fr.read()) != -1){
System.out.println((char) ch);
}
//2.read(chars)一次读取多个字符
//创建一个数组
char [] chars = new char[1024];
int len;
//read方法还是读取,但是是一次读取多个字符
//他把读到的字符都存入到chars数组。
//返回值:表示本次读到了多少个字符。
while((len = fr.read(chars))!=-1){
System.out.println(new String(chars,0,len));
}
//释放资源
fr.close();
}
}
七.案例:保存键盘录入的数据
需求:将用户键盘录入的用户名和密码保存到本地实现永久化存储
步骤:
用户键盘录入用户名
将用户名和密码写到本地文件中
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();
//释放资源
fw.close();
}
}
文章详细阐述了字符串中的Unicode编码与GBK编码的区别,以及Java中如何进行编码解码操作。通过示例代码展示了`getBytes()`和`String(byte[])`方法的使用。同时,讨论了字符流在读写数据时的角色,特别是在处理中文字符时的注意事项,如GBK码表和UTF-8编码格式的字节差异。最后,提供了字符流读写文件的实例,包括写入文件和从文件读取数据的方法。



2353

被折叠的 条评论
为什么被折叠?



