IO流

1. IO流概述

IO流:用来进行设备间的数据传输问题(上传文件和下载文件)

Java对数据的操作是通过流的方式

Java用于操作流的对象都在IO包中

2. IO流分类

按流向分:

  1. 输入流(读取数据)
  2. 输出流(写出数据)

按数据类型分:

  1. 字节流
    1. 字节输入流——InputStream 
    2. 字节输出流——OutputStream
  2. 字符流(方便操作文本数据)
    1. 字符输入流——Reader
    2. 字符输出流—— Writer

注意:

  • 如果没有明确说明,默认按照数据类型分;
  • 如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流
  • 其他情况使用字节流

3. IO流常用基类

字节流的抽象基类: InputStream(读取数据),OutputStream(写出数据)

字符流的抽象基类: Reader(读取数据) , Writer(写出数据)

 注意:每种基类的子类都是以父类名作为后缀名。

  •      XxxOutputStream
  •      XxxInputStream
  •       XxxReader
  •       XxxWriter

4. 字节流写数据

OutputStream是抽象类,不能实例化

FileOutputStream是OutputStream的一个具体子类,通过它来实例化

FileOutputStream的构造方法:

  • FileOutputStream(File file)——将路径封装成一个file对象
  • FileOutputStream(String name)——直接传递路径

FileOutputStream的成员方法:

  • public void write(int b)——写一个字节
  • public void write(byte[] b) ——写一个字节数组
  • public void write(byte[] b,int off,int len)——写一个字节数组的一部分

FileOutputStream写出数据操作步骤:

  1. 创建字节输出流对象
    FileOutputStream fos = new FileOutputStream("fos.txt");

     

  2. 调用write()方法
    fos.write("hello".getBytes());

     

  3. 释放资源
    fos.close();

     

注意:

  1. 创建字节输出流对象了做了几件事情:
    1. 调用系统功能创建文件
    2. 创建对象
    3. 将对象指向文件
  2. 数据写成功后,为什么要close()?
    1. 让流对象变成垃圾,这样就可以被垃圾回收器回收
    2. 通知系统去释放跟该文件相关的资源
  3. 如何实现数据的换行?
    1. 在写入数据的代码中加入换行符即可,不同系统换行符不同
    2. winodws:\r\n
    3. linix:\n
    4. Mac:\r
    5. 一些常见的高级记事本可以识别任意换行符
  4. 如何实现数据的追加写入(再次运行继续写入数据)?
    1. 创建对象时使用构造方法public FileOutputStream(String name,boolean append)带第二个参数为true的情况

 

5. 字节流读取数据

FileInputStream是InputStream的一个具体子类

FileInputStream的构造方法:

  • FileInputStream(File file)
  • FileInputStream(String name)

FileInputStream的成员方法 :

  • public int read() ——读取下一个字节(一次读取一个字节)
  • public int read(byte[] b)——一次读取一个字节数组,每次可以读取多个数据,数组作为缓冲区,提高效率

字节输入流操作步骤:

  1. 创建字节输入流对象
  2. 调用read()方法读取数据,并把数据显示在控制台
  3. 释放资源

字节流复制文本文件步骤:

数据源——读取数据——FileInputStream

目的地——写出数据——FileOutputStream

  1. 封装数据源
  2. 封装目的地
  3. 复制数据
  4. 释放资源

6. 字节缓冲流

Java提供了带缓冲区的字节类以提高效率,这种类被称为缓冲区类(或高效类)

字节缓冲输出流 ——BufferedOutputStream

BufferedOutputStream构造方法(可以指定缓冲区大小,但是一般默认缓冲区就够用了):

  • BufferedOutputStream(OutputStream out)——创建一个新的缓冲输出流,以将数据写入指定的底层输出流
  • BufferedOutputStream(OutputStream out,int size)——创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流

这里传递的是OutputStream对象,因为字节缓冲区流仅仅提供缓冲区以提高效率,真正的读写操作还得靠基本的流对象实现

字节缓冲输入流 ——BufferedInputStream

BufferedInputStream构造方法与输出流同理,传递的是InputStream对象

BufferedInputStream读取数据的两种方法

  • int read() ——读取下一个字节(一次读取一个)
  • int read(byte[] b)——一次读取一个字节数组

7. 字符流

7.1 概述

转换流:字节流操作中文数据不是特别的方便,所以就出现了转换流

转换流的作用:就是把字节流转换字符流来使用
转换流其实是一个字符流
        字符流 = 字节流 + 编码表

7.2 编码表概述

编码表:就是由字符和对应的数值组成的一张表
常见的编码表:

  1.  ASCII——一个字节表示,最高位为符号位,其余为数值位
  2. ISO-8859-1——拉丁码表,8位表示一个数据
  3. GB2312——简体中文
  4. GBK——GB2312升级
  5. GB18030——GBK取代版本
  6. UTF-8——最多用三个字节表示一个字符

字符串中的编码问题
编码——String编码成byte[]——getBytes()方法

解码——byte[]解码成String——String(数组名)

7.3 字符输出流

OutputStreamWriter 字符输出流构造方法:

  • public OutputStreamWriter(OutputStream out) ——根据默认编码将字节流数据转换为字符流数据
  • public OutputStreamWriter(OutputStream out,String charsetName) ——根据指定编码将字节流数据转换为字符流数据

OutputStreamWriter 写数据方法:

  • public void write(int c) ——写一个字符
  • public void write(char[] cbuf) ——写一个字符数组
  • public void write(char[] cbuf,int off,int len) ——写一个字符数组的一部分
  • public void write(String str) ——写一个字符串
  • public void write(String str,int off,int len)——写一个字符串的一部分

flush()的作用

  • 刷新缓冲区

close()和flush()的区别

  • close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。
  • flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。

7.4 字符输入流

InputStreamReader 字符输入流:

  • public InputStreamReader(InputStream in) ——用默认编码读取数据
  • public InputStreamReader(InputStream in,String charsetName)——用指定编码读取数据

OutputStreamReader 读数据方法:

  • public int read() ——一次读取一个字符
  • public int read(char[] cbuf)——一次读取一个数组

转换流的简化写法

转换流的名字比较长,而常见的操作都是按照本地默认编码实现的,所以,为了简化书写,转换流提供了对应的子类

  • FileWriter 
  • FileReader

7.5 字符缓冲流

字符流为了高效读写,也提供了对应的字符缓冲流

  • BufferedWriter——字符缓冲输出流
  • BufferedReader——字符缓冲输入流

字符缓冲流的特殊方法

  • BufferedWriter:
    • public void newLine()——换行(根据系统来决定)
  • BufferedReader:
    • public String readLine()——一次读取一行数据
    • 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

8. 其他流

操作基本数据类型的流

能读写基本数据类型的数据

  • 数据输入流——DataInputStream
    • DataInputStream(InputStream in)
  • 数据输出流——DataOutputStream
    • DataOutputStream(OutputStream out) 

内存操作流

用于处理临时存储信息的,程序结束,数据就从内存中消失

操作字节数组

  • ByteArrayInputStream
  • ByteArrayOutputStream

操作字符数组

  • CharArrayReader
  • CharArrayWrite

操作字符串

  • StringReader
  • StringWriter

打印流

字节打印流——PrintStrem

字符打印流——PrintWriter

特点:

  1. 只有写数据的,没有读取数据,只操作目的地,不操作数据源
  2. 可以操作任意类型的数据
  3. 如果启用了自动刷新,在调用println()方法的时候,能够换行并刷新
  4. 可以直接操作文本文件

可以直接操作文件的流:看API,如果其构造方法能够同时接收File和String类型的参数,一般都是可以直接操作文件的

FileInputStream、FileOutputStream、FileReader 、FileWriter、PrintStream、PrintWriter

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值