字符集

字符集的基本概念

image.png

常见字符集介绍

image.png
image.png
Unicode是字符集,utf-8是编码规则
其中,“字符集”的意思是:为每一个“字符”分配一个唯一的 ID(学名为码位 / 码点 / Code Point);
“编码规则”的意思是:将“码位”转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)。

字符集的编码,解码操作

image.png
image.png
默认编码解码规则是utf-8

字符集的重点知识

image.png

I/O流

I/O流概述

io流也称输入输出流,就是用来读写数据的
i表示input,表示输入,负责读、o表示output表示输出,负责写
image.png

IO流的分类

image.png
字节流能操作所有类型的文件但是更适合读音频,视频,图像文件
字符流更适合操作纯文本文件

image.png
image.png

文件字节输入流(一个一个字节读和一组字节一起读)

image.png

  1. //一个一个字节读
  2. InputStream fl=new FileInputStream("C:\\Users\\86191\\Desktop\\jar\\阿萨德加快.txt");
  3. int b;
  4. while((b=fl.read())!=-1){
  5. System.out.print((char) b);
  6. }

read()方法并不好用,特别是遇到中文时,他每次只读一个字节,而中文至少有两个字节,用这个方法会截断中文,无可避免的乱码
read(byte[] buffer)的返回值返回的是读取的字节长度,但是这种方式也可能会截断中文造成乱码

  1. InputStream fl=new FileInputStream("C:\\Users\\86191\\Desktop\\jar\\阿萨德加快.txt");
  2. byte[] input=new byte[3];\\假设文件中的内容是12312312
  3. int len=fl.read(input);
  4. System.out.println(len);\\3
  5. String rs=new String(input);
  6. System.out.println(rs);\\123
  7. int len=fl.read(input);\\3
  8. String rs=new String(input);\\123
  9. System.out.println(rs);
  10. int len=fl.read(input);\\2
  11. String rs=new String(input);\\123这里是123的原因是,第二次读取放在数组的是123
  12. 第三次读取12会覆盖第二次的12但是3没有被覆盖,想要只输出12
  13. 应该改为String rs=new String(input0len);
  14. System.out.println(rs);

解决中文乱码问题(一次读完所有字节)

image.png

第一种方式:
  1. File f=new File("C:\\Users\\86191\\Desktop\\jar\\阿萨德加快.txt");
  2. InputStream fl=new FileInputStream(f);
  3. byte[] input=new byte[(int) f.length()];
  4. fl.read(input);
  5. System.out.println(new String(input));

第二种方式:
  1. byte[] input=fl.readAllBytes();JDK9新增的方法

文件字节输出流(不追加每次写会覆盖前一次的内容)

image.png
image.png
在写文件时必须刷新flush(),由于内存和磁盘的读写速度不一样在不用写入时,必须将数据流关闭close()来释放资源,close()包含一次的flush()下一次使用不需要刷新
想写入汉字要用write(byte[] buffer)的方法
而且要先将中文进行编码例如:byte[] buffer=”打卡技术到”.getBytes()
这种方式怎么换行
fp.write(“\r\n”.getBytes());标准写法,\n在windows系统中可用在linux系统中不行,标准写法都是可以的
这种写法管道一旦创建会先清空之前所有内容(启动两次main方法),所以想要追加数据应该是
outputStream fl=new FileOutputStream(f,true);

image.png

写数据注意点总结

image.png
image.png

文件拷贝(输出流必须是追加的形式)

由于所有的数据都是以字节的形式存储在计算机中的,所以可以用字节流对任意的文件进行拷贝操作
image.png
所谓文件拷贝就是文件从磁盘复制到另一块磁盘的过程

image.png

  1. public static void main(String[] args) {
  2. try {
  3. //创建字节输入流管道与原视频接通
  4. InputStream in=new FileInputStream("C:\\Users\\86191\\Desktop\\jar\\阿萨德加快.txt");
  5. //创建字节输出流管道与目标文件接通
  6. OutputStream out=new FileOutputStream("C:\\Users\\86191\\Desktop\\jar\\阿萨德sda加快.txt",true);
  7. byte[] buffer=new byte[2];
  8. int len;//记录每次读取的字节数,这是因为最后一次数据可能无法填充满数组,不记录的话复制不正确
  9. while((len=in.read(buffer))!=-1){
  10. out.write(buffer,0,len);
  11. }
  12. System.out.println("复制完成");
  13. in.close();
  14. out.close();
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. }

拷贝总结

image.png

资源释放

try-catch-finally(一般不用)

image.png

finally

执行的优先级很高即使前面有return也要先把它执行完才能去执行return

其他方式(一般用JDK7)

image.pngimage.png

image.png

字符输入输出流

image.png
image.png

为什么要用字符输入输出流

image.png
这里的字符的大小根据不同的编码方式而改变

一次读一个总结

image.png

一次读多个总结

image.png

文件字符输出流

image.png
image.png
image.png
image.png