资讯专栏INFORMATION COLUMN

java.io (1) 基本输入输出流

haobowd / 1595人阅读

摘要:基本输入流输入流类中包含两类功能输入流的两大功能读取流中字节数据的功能是通过方法来完成。基本输出流与类相对应的类表示基本的输出流,用来把数据从程序输出到其他地方。

一堆废话(赶快跳过)

在我们的日常开发中 I/O 涉及到我们开发的方方面面,虽然早在 JDK1.5 就新增了 NIO的概念,但是 java.io 的使用以及技巧在我们的日常开发中还是占据很高的比重。

概念(不看也行)

最基本的I/O 流是 java.io 包中的抽象类 java.io.InputStreamjava.io.OutputStream。s有预留的设计比较早,因此并没有采用现在流行的面向接口的编程思路,而是采用了抽象类。新增的IO相关的API则大量使用了接口。如果留的实现只是对使用者暴漏字节这个层次的细节,则可以直接集成InputStream 或 OutputStream 类,并且提供自己二外的能力。

在接下来的几个章节中,会逐章记录
以下各种流类的详细使用方法

BufferedInputStream, BufferedOutputStream 缓冲复用流

ByteArrayInputStream, ByteArrayOutputStream byte数组缓冲流

DataInputStream, DataOutputStream java原生数据流

ObjectInputStream, ObjectOutputStream 对象序列化流

PushbackInputStream, PushbackOutputStream 推回流

PipedInputStream, PipedOutputStream 管道流

SequenceInputStream, SequenceOutputStream 序列流

和字符流类和字符流的的装饰类

Reader, Writer

InputStreamReader, InputStreamWriter

StringReader, StringWriter

BufferedReader, BufferedWriter

CharArrayReader, CharArrayWriter

同时也会记录一些 java8 融入 Google guava 类库对 流类的支持。

基本输入流

输入流 InputStream类中包含两类功能

输入流的两大功能

读取流中字节数据的功能是通过 read 方法来完成。该方法有以下3种重载形式

public abstract int read() throws IOException

public int read(byte b[]) throws IOException

public int read(byte b[], int off, int len) throws IOException

比较常见的操作流的方式就是 创建一个字节数组作为缓冲区,然后循环读取,直到read方法返回-1或抛出 java.io.IOException 异常。read方法的返回值是每次调用中成功读取的字节数。 需要要注意的是在读取的过程中,对read方法调用是阻塞的。当流中没有数据可用时,对read方法的调用需要等待。这种阻塞式的特性可能会成为应用中的性能瓶颈。

如果不使用字节数组,那么read方法每次只能读取到一个字节,再有缓冲区的情况下虽然InputStream类每次也只是读取一个字节,但是 InputStream类的子类一般会接受一个缓冲区最为参数的read方法提供更高效的实现。

抽象

正像他的名字一样,字节流是流动的,像流水一样。刘中的字节一旦流过去,就无法重新使用。

控制流的功能。

close 关闭功能
通过 close 方法,我们可以关闭一个 流,就像拧上水管龙头一样。java7及以后,更推荐使用 try-with-resource 语句来使用流。可以避免显示的调用close方法。

javatry (
    FileInputStream fInput = new FileInputStream(new File("path/to/exists_file"));
    FileOutputStream fOutput = new FileOutputStream(new File("path/to/new_file"));
) {
    // ....fInput -> read -> fOutput
} catch (IOException e) {
    .....
} catch (FileNotFoundException e) {
    .....
}

skip 跳过若干个字节。相当于保留当前的位置往后移动若干个字节,这个功能可以通过skip方法来实现并不是所有的InputStream累都支持skip方法。

mark 读取位置标记

reset 读取位置重置
标记和重置是配合使用的,可以实现可以实现流中的内容重复读取,而不会像一般的读取那样操作,数据流过去之后就无法在次读取。但是并不是所有的流都支持标记功能,因此在使用mark方法来标记当前位置之前,需要通过markSupporetd方法来判断当前流的实现是否支持标记功能。

available 获取当没有阻塞情况下,当前流中还有多少字节可供读取。如果我们每次读取调用available方法获取到的字节书,不如在读取一个大文件的同时对文件的内容进行处理,如果每次读取是都不发生阻塞,就可以比较好的平均数据读取和处理的时间。

基本输出流

与InputStream类相对应的OutputStream类表示基本的输出流,用来把数据从程序输出到其他地方。基本OutputStream类的对象也是在自己这个层次上操作。其中最主要的是写入数据的write方法。

write 写入方法。
public abstract void write(int b) throws IOException
public void write(byte b[]) throws IOException
public void write(byte b[], int off, int len) throws IOException

write 方法也有3种类似的重载形式,可以每次写入一个字节,也可以写入一个字节数组中全部或部分内容。

控制方法

close 方法
关闭当前输出流

flush 方法
强制要求OutputStream类对象对暂时保持内部缓冲区中的内容立即进行实际的写入操作。因为有些OutputStream类的子类会在内部维护一个缓冲区,通过write方法写入的数据会被首先放在这个缓冲区中,然后再摸个适合的实际执行已经缓冲的内容的写入操作。在一般的场景中OutputStream对象的使用者一般不需要直接调用flush方法保证内部缓冲区数据成功写入。这是因为当OutputStream类对象内部的缓冲区满了以后,会自动执行写入操作。OutputStram类的对象被关闭时,flush方法一般也会被自动调用。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64233.html

相关文章

  • 从设计者的角度理解Java IO

    摘要:通过多个装饰类实现责任链模式,它将对一个输入流的不同处理分散到不同的中去。 1、基本概念 1.1、InputStream 最基本的字节输入流,抽象类,定义了读取原始字节的所有基本方法1.1.1、public abstract int read() throws IOException 读取一个字节的方法,最基础的方法1.1.2、public int read(byte b[], in...

    Flink_China 评论0 收藏0
  • Java学习笔记5-方法、(Stream)、文件(File)和IO

    摘要:是方法返回值的数据类型。方法名和参数表共同构成方法签名。构造方法和它所在类的名字相同,但构造方法没有返回值。输入流表示从一个源读取数据,输出流表示向一个目标写数据。下图是一个描述输入流和输出流的类层次图。有多种构造方法可用来创建对象。 我们经常使用到 System.out.println(),那么它是什么呢? 一、系统方法 我们经常使用到 System.out.println(),那么...

    suemi 评论0 收藏0
  • 高薪程序员&面试题精讲系列22之说说JavaIO,常用哪些IO

    摘要:一面试题及剖析今日面试题今天壹哥带各位复习一块可能会令初学者比较头疼的内容,起码当时让我很有些头疼的内容,那就是流。在这里壹哥会从两部分展开介绍流,即与流。除此之外尽量使用字节流。关闭此输入流并释放与流相关联的任何系统资源。 一. 面试题及剖析 1. 今日面试题 今天 壹哥 带各位复习一块可...

    fnngj 评论0 收藏0
  • 第十五章 输入输出系统

    摘要:在包下主要包括输入输出两种流,每种输入输出流又可分为字节流和字符流两大类。输入输出是从程序运行所在的内存的角度而言的。的输入流主要由和作为基类,而输出流主要由和作为基类。 本章主要参考和摘自疯狂java讲义上面的(java编程思想的后面看过后有新的内容再补充进去吧)。  输入输出是所有程序都必需的部分————使用输入机制允许程序读取外部数据(包括磁盘、光盘等存储设备上的数据和用户输入的...

    hankkin 评论0 收藏0
  • Java IO

    摘要:分类一按操作方式类结构字节流和字符流字节流以字节为单位,每次次读入或读出是位数据。该对象并不是流体系中的一员,其封装了字节流,同时还封装了一个缓冲区字符数组,通过内部的指针来操作字符数组中的数据。 分类一:按操作方式(类结构) 字节流和字符流: 字节流:以字节为单位,每次次读入或读出是8位数据。可以读任何类型数据。 字符流:以字符为单位,每次次读入或读出是16位数据。其只能读取字符类...

    Salamander 评论0 收藏0

发表评论

0条评论

haobowd

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<