欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

I/O流,字节流和字符流区别

程序员文章站 2024-03-04 20:09:24
...

流的概念和作用

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

IO流的分类

根据处理数据类型的不同分为:字符流和字节流
根据数据流向不同分为:输入流和输出流

字符流和字节流

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。
字节流和字符流的区别:
(1)读写单位不同:字节流以字节为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符(文本)类型的数据
(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。
结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用更加广泛。
输入流和输出流
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。
I/O流,字节流和字符流区别

OutputStream(字节流写出)/InputStream(字节流读取)

//字节流写出:执行效率上:BufferedOutputStream >  FileOutputStream 
//原因是:底层维护了一个byte[] ,可以按照数组的长度一次性的向磁盘中写出一大批数据。

//1、创建对象
OutputStream out = new BufferedOutputStream(new FileOutputStream("D:\\iotest\\1.txt",true));
//默认是数据覆盖模式,直接将文件内容覆盖,也可以改成追加模式,需要传入第二参数true
//2、开始写出
out.write(97);
out.write(98);
out.write(99);
//3、释放资源
out.close();
//字节流读取
//1、创建对象  -- 参数是  文件的路径
InputStream in  = new FileInputStream("D:\\iotest\\1.txt")
int b = 0 ; //定义变量,记录读取到的值
while( ( b = in.read() ) != -1 ) {//因为读到-1时就没数据了
		System.out.println(b);
}
//3、释放资源
in.close();

BufferedInputStream为另一个输入流添加了功能,即缓冲输入和支持mark和reset方法的功能。 当创建BufferedInputStream时,将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次有多个字节

Reader(字符流写出)/Reader(字符流读取)

//1、创建对象
Writer out = new BufferedWriter(new FileWriter("D:\\iotest\\1.txt"));
//2、开始写出
out.write("hello");
//3、释放资源
//out.flush();//用来把缓冲区的数据刷到磁盘中做展示
out.close();//1、把数据刷出去  2、关闭资源
//1、创建对象
Reader in = new BufferedReader(newFileReader("D:\\iotest\\1.txt"));
//2、开始读取
int b = 0 ;
while(  ( b = in.read() ) != -1) {
	System.out.println(b);
}
//3、释放资源
in.close();

总结:
所有的buffer-xxx流都是高效的,底层都有对应的缓冲数组
能高效就不使用低效的
缓冲流中,如果没有关闭流的前提下,一定要flush(),不然数据刷不到磁盘中.若有关闭流的语句,则可省略不写

转换流:用来作为桥梁,把字节流转成字符流的桥梁,并解决字符流读写乱码问题

注意:输出的转换流,OutputStreamWriter可以很好的解决乱码问题,但是写出的数据会覆盖文件原来的数据;

//输出的转换流
// 1,创建转换流输出对象,OutputStreamWriter是字节流通向字符流的桥梁
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("1.txt"), "utf-8");
// 2,开始写出数据
// 当数据的保存方式和打开方式,使用的不是一张表时,就会出现乱码!!
out.write("大家好,我是渣渣辉");
// 3,释放资源
 out.flush(); 
//读取的转换流
//1,创建转换对象
 BufferedReader in = new BufferedReader( new InputStreamReader(new FileInputStream("1.txt"),"utf-8"));
//2,读取一行数据
String line = in.readLine();	//子类BufferedReader的特有方法
System.out.println(line);
//3,释放资源
in.close();
相关标签: 笔记