字节流和字符流

时间:2022-08-03 21:01:40

字节流和字符流

Java中IO流是输入/输出流,也分为字节流和字符流。
Java将输入输出抽象化为串流,数据有来源地及目的地,衔接两者的是串流对象。从应用程序来看,如果要将数据从来源取出,可以使用输入串流,如果要将数据写入目的地,可以使用输出串流。

1.字节流

字节流和字符流
字节流和字符流
(1)InputStream抽象类与OutputStream抽象类
1)InputStream抽象类
InputStream抽象了应用程序读取数据的方式。

int read();从输入流中读取数据的下一个字节,并置入byte数组。
int b = in.read();//读取一个字节无符号填充到int低八位.-1是EOF
in.read(byte[] buf)
in.read(byte[] buf,int start,int size)

2)OutputStream抽象类
OutputStream类 抽象了应用程序写出数据的方式 。

void write();将一个指定的byte数组、初始索引与数据长度写入文件。
out.write(int b)//写出一个byte到流,b的低8位0;
out.write(byte[] buf)//将buf字节数组都写入到流
out.write(byte[] buf,int start,int size)//字节数组buf将从start位置开始写size长度的字节到流

注意:EOF = End表示的含义是读到-1就读到结尾
(2)FileInputStream类和FileOutputStream类
1)FileInputStream类
FileInputStream是InputStream的子类,可以指定文件名创建实例,实例创建完成即可进行读取数据(获得输入字节)。
主要操作抽象类InputStream的read()抽象方法。
构造方法:
字节流和字符流
2)FileOutputStream
FileOutputStream是OutputStream的子类,可以指定文件名创建实例,实例创建完成即可进行写出数据。
主要操作了抽象类OutputStream的write()抽象方法。
(3)ByteArrayInputStream类与ByteArrayOutputStream类
1)ByteArrayInputStream
ByteArrayInputStream是InputStream类的子类,可以指定byte数组创建实例,一旦创建就可将byte数组当作数据源进行读取。
主要操作抽象类InputStream的read()抽象方法。
2)ByteArrayOutputStream
ByteArrayOutputStream是OutputStream类的子类,可以指定byte数组创建实例,一旦创建将byte数组当作目的地写入数据。
主要操作了抽象类OutputStream的write()抽象方法。
(4)DataInputStream类与DataOutputStream类
对”流”功能的扩展,可以更加方便的操作int、long、char等基本数据类型数据。此类体现了设计模式中的装饰模式。DataInputStream类与DataOutputStream类用来装饰InputStream类和OutputStream类。提供读取、写入Java基本数据类型的方法,这些方法会自动在指定的类型与字节间转换。
1)DataInputStream类
继承于FilterInputStream,DataInputStream 对于多线程访问不一定是安全的。 线程安全是可选的,它由此类方法的使用者负责。
DataInputStream类中常用的方法:
字节流和字符流
2)DataOutputStream类
继承于FilterOutputStream类,数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
DataOutputStream类中常用的方法:
字节流和字符流
(5)BufferedInputStream类与BufferedOutputStream类
这两个流类为IO提供了带缓冲区的操作,一般打开文件进行写入;或读取操作时,都会加上缓冲,这种流模式提高了IO的性能从应用程序中把输入放入文件,相当于将一缸水倒入到另一个缸中。
1)BufferedInputStream类
继承于FilterInputStream ,BufferedInputStream类的方法:
字节流和字符流
2)BufferedOutputStream类
继承于FilterOutputStream类 ,BufferedOutputStream类的方法:
字节流和字符流
FileOutputStream—>write()方法相当于一滴一滴地把水“转移”过去。
DataOutputStream–>writeXxx()方法会方便一些,相当于一瓢一瓢把水“转移”过去。
BufferedOutputStream—>write()方法更方便,相当于一飘一瓢先放入一个桶中,再从桶中倒入到另一个缸中,性能提高了。
6)ObjectInputStream类与ObjectOutputStream类
将内存中的整个对象存储下来,之后再读入还原为对象。只能将支持 java.io.Serializable 接口的对象写入流中。
1)ObjectInputStream类
ObjectInputStream提供readObject()方法将数据读入对象。
2)ObjectOutputStream类
ObjectOutputStream提供writeObject()方法将对象写至目的地。

2.字符流

字节流和字符流字节流和字符流
Java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码);而文件是byte byte byte …的数据;文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk等)序列化为byte的存储结果。
(1)抽象类Reader与抽象类Writer
操作的是文本文本文件,字符的处理,一次处理一个字符,字符的底层任然是基本的字节序列。
1)抽象类Reader
方法:
字节流和字符流
2)抽象类 Writer
方法:
字节流和字符流
(2)InputStreamReader类和OutputStreamWriter类
1)InputStreamReader
InputStreamReader类是完成字节流解析为字符流,按照编码解析。每次调用 InputStreamReader 中的一个read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
InputStreamReader类的方法:
字节流和字符流
2) OutputStreamWriter
OutputStreamWriter类是提供字符流到字节流,按照编码处理。每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。
OutputStreamWriter类的方法:
字节流和字符流
(3)FileReader类和FileWriter类
1)FileReader
继承自InputStreamReader,FileReader类用来读取字符文件的便捷类。
2)FileWriter
继承自OutputStreamWriter,FileWriter类用来写入字符文件的便捷类。
FileReader类和FileWriter类中的方法都是来自继承的方法,并没有自己独有的方法。
(4)BufferedReader类和BufferedWriter类
1)BufferedReader
String readLine(); 一次读一行
BufferedReader类从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
BufferedReader类的方法:
字节流和字符流
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader对象创建后,我们便可以使用read()方法从控制台读取一个字符,或者用readLine()方法读取一个字符串。
2)BufferedWriter
BufferedWriter类将文本写入字符输出流,缓冲各个字符,从而实现字符、数组的高效写入。
BufferedWriter类的方法:
字节流和字符流
PrintWriter类向文本输出流打印对象的格式化表示形式。
PrintWriter类的方法:
字节流和字符流字节流和字符流字节流和字符流
(5)StringReader与StringWriter
1)StringReader
将字符串打包,当作读取来源。
2)StringWriter
写入目的地,用toString()取得所有写入的字符组成的字符串。
(6)CharArrayReader与CharArrayWriter
1)CharArrayReader
将char数组当作读取来源。
2)CharArrayWriter
写入目的地。