字符集
字符集的基本概念
常见字符集介绍
Unicode是字符集,utf-8是编码规则
其中,“字符集”的意思是:为每一个“字符”分配一个唯一的 ID(学名为码位 / 码点 / Code Point);
“编码规则”的意思是:将“码位”转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)。
字符集的编码,解码操作
默认编码解码规则是utf-8
字符集的重点知识
I/O流
I/O流概述
io流也称输入输出流,就是用来读写数据的
i表示input,表示输入,负责读、o表示output表示输出,负责写
IO流的分类
字节流能操作所有类型的文件但是更适合读音频,视频,图像文件
字符流更适合操作纯文本文件
文件字节输入流(一个一个字节读和一组字节一起读)
//一个一个字节读
InputStream fl=new FileInputStream("C:\\Users\\86191\\Desktop\\jar\\阿萨德加快.txt");
int b;
while((b=fl.read())!=-1){
System.out.print((char) b);
}
read()方法并不好用,特别是遇到中文时,他每次只读一个字节,而中文至少有两个字节,用这个方法会截断中文,无可避免的乱码
read(byte[] buffer)的返回值返回的是读取的字节长度,但是这种方式也可能会截断中文造成乱码
InputStream fl=new FileInputStream("C:\\Users\\86191\\Desktop\\jar\\阿萨德加快.txt");
byte[] input=new byte[3];\\假设文件中的内容是12312312
int len=fl.read(input);
System.out.println(len);\\3
String rs=new String(input);
System.out.println(rs);\\123
int len=fl.read(input);\\3
String rs=new String(input);\\123
System.out.println(rs);
int len=fl.read(input);\\2
String rs=new String(input);\\123这里是123的原因是,第二次读取放在数组的是123,
第三次读取12会覆盖第二次的12但是3没有被覆盖,想要只输出12
应该改为String rs=new String(input,0,len);
System.out.println(rs);
解决中文乱码问题(一次读完所有字节)
第一种方式:
File f=new File("C:\\Users\\86191\\Desktop\\jar\\阿萨德加快.txt");
InputStream fl=new FileInputStream(f);
byte[] input=new byte[(int) f.length()];
fl.read(input);
System.out.println(new String(input));
第二种方式:
byte[] input=fl.readAllBytes();JDK9新增的方法
文件字节输出流(不追加每次写会覆盖前一次的内容)
在写文件时必须刷新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);
写数据注意点总结
文件拷贝(输出流必须是追加的形式)
由于所有的数据都是以字节的形式存储在计算机中的,所以可以用字节流对任意的文件进行拷贝操作
所谓文件拷贝就是文件从磁盘复制到另一块磁盘的过程
public static void main(String[] args) {
try {
//创建字节输入流管道与原视频接通
InputStream in=new FileInputStream("C:\\Users\\86191\\Desktop\\jar\\阿萨德加快.txt");
//创建字节输出流管道与目标文件接通
OutputStream out=new FileOutputStream("C:\\Users\\86191\\Desktop\\jar\\阿萨德sda加快.txt",true);
byte[] buffer=new byte[2];
int len;//记录每次读取的字节数,这是因为最后一次数据可能无法填充满数组,不记录的话复制不正确
while((len=in.read(buffer))!=-1){
out.write(buffer,0,len);
}
System.out.println("复制完成");
in.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
拷贝总结
资源释放
try-catch-finally(一般不用)
finally
执行的优先级很高即使前面有return也要先把它执行完才能去执行return