IO:InputStream & OutputStream

※ 流的概念

程序的主要任务是操纵数据。在Java中,把一组有序的数据序列称为流。根据操作的方向,可以把流分为输入流和输出流两种。程序从输入流读取数据,向输出流写出数据。

        文件    输入流                     输出流           文件
        内存 ------------->  Java程序 ------------------>  内存
        键盘                                              控制台
         |                                                  |
        数据源                                            数据目的地

Java I/O系统负责处理程序的输入和输出,I/O类库位于java.io包中,它对各种常见的输入流和输出流进行了抽象。

如果数据流中最小的数据单元是字节,那么称这种流为字节流;如果数据流中最小的数据单元是字符,那么称这种流为字符流。在I/O类库中,java.io.InputStream和java.io.OutputStream分别表示字节输入流和字节输出流,java.io.Reader和java.io.Writer分别表示字符输入流和字符输出流。

注意:它们四个都是抽象类。

※ IO流(数据的搬运)

字节流
字节输入流 InputStream
字节输出流 OutputStream
字符流
字符输入流 Reader
字符输出流 Write
(都是抽象类)

注意:
流是字符流还是字节流
流是输出流还是输入流
流是包装流,桥梁流还是功能流
流的输出目的是谁

流提供了输入的流,一定有一个对应的输出的流。

※ 字节输入流和输出流概述

在java.io包中,java.io.InputStream表示字节输入流,java.io.OutputStream表示字节输出流,它们都是抽象类,不能被实例化。

※ InputStream类提供了一系列和读取数据有关的方法:
这里写图片描述
1.read(): 从输入流读取数据:有三种重载形式: 

a. int read(): 从输入流读取一个8位的字节(1字节是8位),把它转换为0-255之间的整数,并返回这一整数。如果遇到输入流的结尾,则返回-1;
b. int read(byte[] b): 从输入流读取若干个字节,把它们保存到参数b指定的字节数组中。返回的整数表示读取的字节数。如果遇到输入流的结尾,则返回-1;
c. int read(byte[] b, int off, int len): 从输入流读取若干个字节,把它们保存到参数b指定的字节数组中。返回的整数表示读取的字节数。参数off指定在字节数组中开始保存数据的起始下标,参数len指定读取的字节数目。返回的整数表示实现读取的字节数。如果遇到输入流的结尾,则返回-1;

以上第一个read方法从输入流读取一个字节,而其余两个read方法从输入流批量读取若干字节。在从文件或键盘读数据时,采用后面两个read方法可以减少进行物理读文件或键盘的次数,因此能提高I/O操作的效率。

2.void close(): 关闭输入流,InputStream类本身的close()方法不执行任何操作。它的一些子类覆盖了close()方法,在close()方法中释放和流有关的系统资源。

3.int available(): 返回可以从输入流中读取的字节数目;

4.skip(long): 从输入流中跳过参数n指定数目的字节。

5.boolean markSupported(),void mark(int),void reset(): 如果要从流中重复读入数据,先用markSupported()方法来判断这个流是否支持重复读入数据,如果返回true,则表明可以在流上设置标记。接下来调用mark(int readLimit)方法从流的当前位置开始设置标记。最后调用reset()方法,该方法使输入流重新定位到刚才做了标记的起始位置。这样就可以重复读取做过标记的数据了。

※ OuputStream类提供了一系列和写数据有关的方法:
这里写图片描述
1.write(): 向输出流写入数据:有三种重载形式:

a. void write(int b): 向输出流写入一个字节;
b. void write(byte[] b): 把参数b指定的字节数组中的所有字节写到输出流;
c. void write(byte[] b, int off, int len): 把参数b指定的字节数组中的所有字节写到输出流,参数off指定字节数组的起始下标,从这个位置开始输出由参数len指定数目的字节;

以上第一个write方法从输出流写入一个字节,而其余两个write方法从输出流批量写出若干字节。在向文件或控制台写数据时,采用后面两个write方法可以减少进行物理读文件或键盘的次数,因此能提高I/O操作的效率。

2.void close(): 关闭输出流,OutputStream类本身的close()方法不执行任何操作。它的一些子类覆盖了close()方法,在close()方法中释放和流有关的系统资源。

3.void flush(): OutputStream类本身的flush()方法不执行任何操作,它的一些带有缓冲区的子类(比如BufferedOutputStream和PrintStream类)覆盖了flush()方法。通过带缓冲区的输出流写数据时,数据先保存在缓冲区中,积累到一定程度才会真正写到输出流中。缓冲区通常用字节数组实现,实际上是指一块内存空间。flush()方法强制把缓冲区内的数据写到输出流中。

※ 常用到的字节输入流和输出流

※ in:输入流
1. System.in 从控制台读取数据;
2. ByteArrayInputStream: 读取byte类型的数组中的数据;
3. FileInputStream: 从文件中读取数据;
4. PipedInputStream: (管道流)连接一个PipedOutputStream;
5. ObjectInputStream: 对象输入流;
6. DataInputStream: 将基本数据类型转换成流读出;
7. BufferedInputStream: 从缓存中读取数据;
8. StringBufferInputStream: 可以读取一个字符串,在API中已经过时
9. SequenceInputStream:合并多个流
※ out: 输出流
1. System.out;
2. ByteArrayOutputStream;
3. FileOutputStream;
4. PipedOutputStream;
5. ObjectOutputStream;
6. DataOutputStream;
7. BufferedOutputStream;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值