陆小曼|Java IO,讲的实在是太好了,这篇( 四 )
其它方法功能publiclongskip(longn)跳过接下来的n个字节 , 返回实际上跳过的字节数publiclongavailable()返回下一次可读取(跳过)且不会被方法阻塞的字节数的估计值publicsynchronizedvoidmark(intreadlimit)标记此输入流的当前位置 , 对reset()方法的后续调用将会重新定位在mark()标记的位置 , 可以重新读取相同的字节publicbooleanmarkSupported()判断该输入流是否支持mark()和reset()方法 , 即能否重复读取字节publicsynchronizedvoidreset()将流的位置重新定位在最后一次调用mark()方法时的位置
文件输入流 , 从文件中读入字节 , 通常对文件的拷贝、移动等操作 , 可以使用该输入流把文件的字节读入内存中 , 然后再利用输出流输出到指定的位置上 。
(3)PipedInputStream
管道输入流 , 它与PipedOutputStream成对出现 , 可以实现多线程中的管道通信 。 PipedOutputStream中指定与特定的PipedInputStream连接 , PipedInputStream也需要指定特定的PipedOutputStream连接 , 之后输出流不断地往输入流的buffer缓冲区写数据 , 而输入流可以从缓冲区中读取数据 。
(4)ObjectInputStream
对象输入流 , 用于对象的反序列化 , 将读入的字节数据反序列化为一个对象 , 实现对象的持久化存储 。
(5)PushBackInputStream
它是FilterInputStream的子类 , 是一个处理流 , 它内部维护了一个缓冲数组buf 。
在读入字节的过程中可以将读取到的字节数据回退给缓冲区中保存 , 下次可以再次从缓冲区中读出该字节数据 。 所以PushBackInputStream允许多次读取输入流的字节数据 , 只要将读到的字节放回缓冲区即可 。
【陆小曼|Java IO,讲的实在是太好了,这篇】假如一个文件中存储了数字和字母两种类型的数据 , 我们需要将它们交给两种线程各自去收集自己负责的数据 , 如果采用传统的做法 , 把所有的数据全部读入内存中 , 再将数据进行分离 , 面对大文件的情况下 , 例如1G、2G , 传统的输入流在读入数组后 , 由于没有缓冲区 , 只能对数据进行抛弃 , 这样每个线程都要读一遍文件 。
使用PushBackInputStream可以让一个专门的线程读取文件 , 唤醒不同的线程读取字符:
第一次读取缓冲区的数据 , 判断该数据由哪些线程读取回退数据 , 唤醒对应的线程读取数据重复前两步关闭输入流到这里 , 你是否会想到AQS的Condition等待队列 , 多个线程可以在不同的条件上等待被唤醒 。
(6)BufferedInputStream
缓冲流 , 它是一种处理流 , 对节点流进行封装并增强 , 其内部拥有一个buffer缓冲区 , 用于缓存所有读入的字节 , 当缓冲区满时 , 才会将所有字节发送给客户端读取 , 而不是每次都只发送一部分数据 , 提高了效率 。
- Java|淘宝商家要小心了!取消的“中差评”体系又回来啦!
- javascript|游戏开发之旅-JavaScript重新介绍
- Java|java多线程并发小demo
- Java|java程序猿如何才能走远,怎么做自己的职业规划
- 蚂蚁花呗|血亏!阿里P8轻易把总结了近一年的java高级特性笔记送人了
- 百度|Java高级进阶多线程学习之路(七)ThreadLocal
- 陆小曼|快来试试,微信又添新功能?表情包可以加小辫子了
- javascript|家里宽带是300M的,但是实际测速才2M应该这样维权。
- 社交|十一国庆过后,秋招Java岗,陆续收到字节/招银等offer
- Java|Java面试之基础问题答案口述整理