Youzi的知识库 - 字符流
type: channel
link: https://knowledge.autisn.com/index.php/tag/字符流/
items: 字节流和字符流

字节流和字符流
type: item
date: 2022-07-12T16:04:00+08:00
description: 1、什么是字节流，什么是字符流字节流： 它处理单元为1个字节（byte），操作字节和字节数组，存储的是二进制文件，如果是音频文件、图片、歌曲，就用字节流好点（1byte = 8位）；字符流： 它处理的单元为2个字节的Unicode字符，分别操作字符、字符数组或字符串，字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的，如果是关系到中文（文本）的，用字符流好点（1Unicode = 2字节 = 16位）；所有文件的储存是都是字节（byte）的储存，在磁盘上保留的并不是文件的字符而是先把字符编码成字节，再储存这些字节到磁盘。在读取文件（特别是文本文件）时，也是一个字节一个字节地读取以形成字节序列。字节流可用于任何类型的对象，包括二进制对象，而字符流只能处理字符或者字符串；字节流提供了处理任何类型的IO操作的功能，但它不能直接处理Unicode字符，而字符流就可以。字节流是最基本的，所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据，它是按字节来处理的 但实际中很多的数据是文本，又提出了字符流的概念，它是按虚拟机的encode来处理，也就是要进行字符集的转化 这两个之间通过 InputStreamReader,OutputStreamWriter来关联，实际上是通过byte[]和String来关联。在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。最简单的区分字节流和字符流：万物皆文件，那就将文件在记事本里面打开，如果打开后能看的懂的就是字符流，如果看不懂那就是字节流。问题:word.doc 数据字节流还是字符流？答：.doc数据字节流。Excel 数据字节流还是字符流？答：要根据保存的格式进行判断，如果是保存为.csv那么他就是字符流，如果是其他的则数据字节流。字符和字节操作如何简单记住字节流和字符流字符流是以Reader，Writer结尾的字节流是以InputStream或OutputStream结尾的2、字节流的使用字节流主要是操作byte类型数据，以byte数组为准，主要操作类就是OutputStream、InputStream。字节输出流：OutputStream，OutputStream是整个IO包中字节输出流的最大父类Closeable表示可以关闭的操作2.1普通字节流的操作import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * 复制D:\io_test下的加菲猫文件到D:\io_test这个目录下 */ public class IoDemo4 { public static void main(String[] args) throws IOException { //输入文件目录 String srcFilePath = "D:\\io_test\\加菲猫.jpg"; //输出文件目录（拷贝的路径） String destFilePath = "D:\\io_test\\加菲猫2.jpg"; FileInputStream fileInputStream = null; FileOutputStream fileOutputStream = null; try { //输入流,传入路径 fileInputStream = new FileInputStream(srcFilePath); //输出流 fileOutputStream = new FileOutputStream(destFilePath); byte[] bytes = new byte[1024]; try { int count = 0; //如果不等于-1说明还没有读取完成，要继续读取 while((count = fileInputStream.read(bytes)) != -1){ //还有内容要读取,然后从0开始读取，上面count有读了多少个，那么就写多少个 fileOutputStream.write(bytes,0,count); } } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); }finally { //用完之后一定要关闭流,但是得判断不是空的时候才需要去关闭流 if(fileInputStream != null){ fileInputStream.cl…