【Java Core】输入与输出 1

「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

本系列将介绍Java中用于输入和输出的各种应用编程接口(Application Programming Interface, API)。

1. 输入/输出流

在Java API中,可以从其中读入一个字节序列的对象称为输入流,而可以向其中写入一个字节序列的对象称作输出流。

这些字节序列的来源地和目的地可以是文件,而且通常都是文件,但也可以是网络连接,甚至是内存块。抽象类InputStream和OutputStream构成了输入/输出(I/O)类层次结构的基础。

因为面向字节的流不便于处理以Unicode形式存储的信息(Unicode中每个字符都使用了多个字节来表示),**所以从抽象类Reader和Writer中继承出来了一个专门用于处理Unicode字符的单独的类层次结构。**这些类拥有的读入和写出操作都是基于两字节的Char值的(即Unicode码元),而不是基于byte值的。

1.1 读写字节

InputStream类有一个抽象方法:

    abstract int read()
复制代码

这个方法将读入一个字节,并返回读入的字节,或者在遇到输入源结尾时返回-1。

在设计具体的输入流类时,必须覆盖这个方法以提供适用的功能,例如,在FileInputStream类中,这个方法将从某个文件中读入一个字节。

InputStream类还有若干个非抽象的方法,它们可以读入一个字节数组,或者跳过大量的字节。从Java9开始,有了一个非常有用的可以读取流中所有字节的方法:

    byte[] bytes = in.readAllBytes();
复制代码

这些方法都要调用抽象的read方法,因此,各个子类都只需覆盖这一个方法。 与此类似,OutputStream类定义了下面的抽象方法:

    abstract void write(int b);
复制代码

它可以向某个输出位置写出一个字节。 如果我们有一个字节数组,那么就可以一次性地写出它们:

    byte[] values = . . .;
    out.write(values);
复制代码

transferTo方法可以将所有字节从一个输入流传递到另一个输出流:

    in.transferTo(out);
复制代码

read和write方法在执行时都将阻塞,直至字节确实被读入或写出。这意味着如果流不能被立即访问(通常是因为网络繁忙),那么当前地线程将会被阻塞。

感谢观看,这是Java输入与输出的第1篇文章,如果您有兴趣,可以关注一下我,方便查看后续文章,一起学习,共同进步,不胜感激!

Guess you like

Origin juejin.im/post/7031334622336122888