JAVA两种流,字符流和字节流

Java的流分为字节流和字符流,由InputStream、OutputStream、Reader、Writer四大抽象类派生。字节流处理二进制数据,字符流处理字符,适合文本数据。字符流使用Unicode,对多国语言支持好。字符流由Reader和Writer派生,字节流由InputStream和OutputStream派生。两者间通过InputStreamReader和OutputStreamWriter关联,涉及字符集转换问题。在实际开发中注意字符流与字节流之间的编码一致性,以避免汉字问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的.
字符流和字节流是根据处理数据的不同来区分的。字节流按照8位传输,字节流是最基本的,所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。
1.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
读文本的时候用字符流,例如txt文件。读非文本文件的时候用字节流,例如mp3。理论上任何文件都能够用字节流读取,但当读取的是文本数据时,为了能还原成文本你必须再经过一个转换的工序,相对来说字符流就省了这个麻烦,可以有方法直接读取。
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节, 操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!

从源码可以看出
OutputStream的write里使用的是byte[]字节数组
而Writer的write里使用的是char[]字符数组

ObjectInputStream是装饰流,不能直接处理数据源。必须装饰其他实体流才能一起使用,他是用来序列化的。
字节流是由InputStream或者OutputStream派生的。
字节流是由reader和writer派生的子类。
ObjectInputStream是一个装饰流,装饰流不能直接处理数据源,它必须和其他的装饰流或实体流一起使用,ObjectInputStream是用来实现反序列化的。
凡是流,都是一对一对出现的,比如FileInputStream相对的就是FileOutputStream
ObjectInputStream相对的是ObjectOutputStream
字符流是Reader和Writer所派生下来的子类,字节流是InputStream和OutputStream所派生下来的子类,其中总怕有几十个类,不必全记住。只需要知道流的分类
按内容分:字符流、字节流
按功能分:输入流、输出流
按形式分:实体流、装饰流

1.Java的字节流

InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。

2.Java的字符流

Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
  InputStream,OutputStream,Reader,writer都是抽象类。所以不能直接new。
  字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的。但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化。这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联。
  在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。在从字节流转化为字符流时,实际上就是byte[]转化为String时,public String(byte bytes[], String charsetName)
有一个关键的参数字符集编码,通常我们都省略了,那系统就用操作系统的lang。而在字符流转化为字节流时,实际上是String转化为byte[]时,byte[] String.getBytes(String charsetName)也是一样的道理。至于java.io中还出现了许多其他的流,按主要是为了提高性能和使用方便,如BufferedInputStream,PipedInputStream等。

注:
  在Java中,它的内核使用 Unicode,也就是说它记住了每个字符的Unicode 内部编码。与ANSI码不兼容。
  按照ANSI编码标准,标点符号、数字、大小写字母都占一个字节,汉字占2个字节。按照UNICODE标准所有字符都占2个字节。
  因为在Java当中字符是采用Unicode编码标准的,所以“学Java”这个字符串在Java语言中占10个字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值