IO流、字符流、字节流、缓冲流

流:一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

IO分类:
按数据流的方向分为 输入流、输出流
按处理数据单位不同分为 字节流、字符流  
按功能不同分为 节点流、处理流

IO流特性
1、先进先出,最先写入输出流的数据最先被输入流读取到。
2、顺序存取,可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。
3、只读或只写,每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。

IO流常用到的五类一接口
5个类指的是File、OutputStream、 InputStream、Writer、Reader;一个接口指的是Serializable

------------------------------------------------------------------------------------------------------------------------------------------
InputStreamReader、OutputStreamWriter(字符流)
字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。
本身就带有缓冲区,在操作时使用了缓冲区,通过缓冲区再操作文件,缓冲字符流相对于字符流效率提升不大。

FileInputStream、FileOutputStream(字节流)
字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。
本身没有缓冲区,在操作时是文件本身直接操作的,缓冲字节流相对于字节流,效率提升非常高。

------------------------------------------------------------------------------------------------------------------------------------------
(字节缓冲流)
BufferedInputStream
从BufferedInputStream中读取一个字节时,
BufferedInputStream会一次性从文件中读取8192个, 存在缓冲区中, 返回给程序一个
程序再次读取时, 就不用找文件了, 直接从缓冲区中获取
直到缓冲区中所有的都被使用过, 才重新从文件中读取8192个

BufferedOutputStream
BufferedOutputStream也内置了一个缓冲区(数组)
程序向流中写出字节时, 不会直接写到文件, 先写到缓冲区中
直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里

------------------------------------------------------------------------------------------------------------------------------------------
(字符缓冲流)
BufferedWriter:字符缓冲输出流;
该字符缓冲输出流中提供了一个跨平台的换行符:newLine()。如果想要在硬盘上创建一个文件并写入一些文字数据的话,就可以使用该类
write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率

BufferedReader:字符缓冲输入流。
该字符缓冲输入流提供了一个一次读一行的方法:readLine()。方便于对文本数据的获取,当返回null时,表示读取到文件末尾。
read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率

阻塞问题:用BufferedReader缓冲流,在传输数据时在服务端使用readline()读取时,一直读取不到,使用debug发现,readline是发生了阻塞
     如果字符串不加\n   readline方法将一直阻塞 而read方法则不会出现阻塞的情况

原因:readLine()方法返回的时候只返回回车符之前的数据内容,并不返回回车符(行终止符)。

------------------------------------------------------------------------------------------------------------------------------------------
字节流,字符流的区别
字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。
字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。
说白了是,字节流可以处理一切文件,而字符流只能处理纯文本文件。如果数据通过记事本软件打开,我们还可以读懂里面的内容,就使用字符流,否则使用字节流。如果不知道到底要用那种类型的流,就用字节流
字节流本身没有缓冲区,在操作时是文件本身直接操作的,缓冲字节流相对于字节流,效率提升非常高。
字符流本身就带有缓冲区,在操作时使用了缓冲区,通过缓冲区再操作文件,缓冲字符流相对于字符流效率提升不大。

----------------------------------------------------------------------------------------------------------

缓冲区的原理

临时存储数据,减少了对设备操作的频率,提高了效率,其实就是将数据临时缓存到了内存(数组)中。

----------------------------------------------------------------------------------------------------------------

 

 

 

File:
demo02:在指定目录下创建各种文件
demo03:返回绝对路径,返回目录下的文件名,目录名
demo04:删除目录下的各种文件目录
demo05、demo06、demo17:​创建文件输出流以指定的名称写入文件。FileOutputStream    write函数
demo07:(跟上面那个一类)字节流换行,写入开头或结尾
demo08:字节输入流     读取字节数据       FileInputStream        read函数
demo09:复制文本文件
demo10,demo16:读取字节 数组 数据
demo11:复制图片
demo18:复制内容改进版   ---字符流---
demo20:复制内容字符缓冲
demo15:OutputStreamWriter(字符流)写入字符、字符数组、字符数组的一部分、字符串、字符串的一部分
demo19:统计字符出现的次数(但是我觉得考核项目那个更好,好像前几天还保存了一个!!!!!)

注意!!!前方高能!


缓读缓写:demo12
(字节缓冲流)
BufferedOutputStream
BufferedInputStream
最快的方法:缓冲加数组读取

字符流!!!
demo18:FileReader    FileWriter
demo20:复制内容字符缓冲
demo21:字符缓冲输入输出流    复制文本


统计:
最佳!demo22 统计字符数到另一个文件中
demo20    统计字符数到另一个文件中
java0017    统计字符数到输出栏中


flush()方法和close()方法区别:
flush()方法

    用来刷新缓冲区的,刷新后可以再次写出

close()方法

    具备刷新功能,在关闭流之前,会先刷新一次缓冲区,将缓冲区的字节全部刷新到文件上,再关闭
    用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以了解到Java IO流分为字节流字符流两种类型。其中字节流以字节为单位进行读写,而字符流以字符为单位进行读写。下面是Java IO字节流的构造方法和使用方法: 1. InputStream类是所有字节输入的父类,常用方法有: - read():从输入中读取一个字节的数据。 - read(byte[] b):从输入中读取一定数量的字节,并将其存储在缓冲区数组b中。 - skip(long n):跳过并丢弃输入中的n个字节数据。 - available():返回输入中可以被读取的字节数。 2. FileInputStream类是InputStream类的子类,常用方法有: - FileInputStream(String name):创建一个文件输入,以读取具有指定名称的文件。 - read():从输入中读取一个字节的数据。 - read(byte[] b):从输入中读取一定数量的字节,并将其存储在缓冲区数组b中。 - skip(long n):跳过并丢弃输入中的n个字节数据。 - available():返回输入中可以被读取的字节数。 3. FileOutputStream类是OutputStream类的子类,常用方法有: - FileOutputStream(String name):创建一个文件输出,以写入具有指定名称的文件。 - write(int b):将指定的字节写入此文件输出。 - write(byte[] b):将b.length个字节从指定的字节数组写入此文件输出中。 - flush():刷新此输出并强制任何缓冲的输出字节被写出。 下面是一个Java IO字节流复制文件的示例代码: ```java public static void main(String[] args) { try { // 创建要复制文件的字节输入 InputStream inp = new FileInputStream("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.pdf"); // 创建目标路径的字节输出 OutputStream oup = new FileOutputStream("/Users/chenyq/Documents/newtest.pdf"); // 使用文件输入获取要复制文件的全部数据的字节数组 byte[] arr = inp.readAllBytes(); // 使用文件输出将字节数组写入目标文件 oup.write(arr); System.out.println("复制成功!"); // 释放资源 inp.close(); oup.close(); } catch (IOException e) { e.printStackTrace(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值