流式IO读写

1. FileInputStream 类直接继承了InputStream 的方法

mark, markSupported, reset 方法

而这几个方法都是空实现

markSupported直接返回false

所以对于FileInputStream类不支持随机访问文件,只能顺序的读写文件。

2. NIO中的Buffer操作:

Nio中的 java.nio.Buffer 这个类的几乎所有操作都是关于一个线性缓存区的,对于缓冲区的抽象,这个提供了下面的4个指示位:

// Invariants: mark <= position <= limit <= capacity

private int mark = -1;

private int position = 0;

private int limit;

private int capacity;

Capacity:缓冲区的容量

其中的 capacity是缓冲区的容量大小,表示该缓冲区可以存储的元素个数。这里不是字节个数,而是element的个数,如果IntBuffer,则其所占的字节应该是:

Capacity * 4:

A buffer‘s capacity is the number of elements it contains. The capacity of a buffer is never negative and never changes.这个值在缓冲区初始化好之后,是不会变化的。它可以通过:capacity()方法获得。

Position:缓冲区的当前读写位置

表示缓冲区的当前位置,当缓冲区下一次调用get或者put方法时,就从 position++的位置开始。

final int nextGetIndex() {                          // package-private

if (position >= limit)

throw new BufferUnderflowException();

return position++; // 下一次读写的位置。

}

查看:java.nio.HeapByteBuffer 的 put , get方法,

public ByteBuffer put(byte x) {

hb[ix(nextPutIndex())] = x;

return this;

}

public byte get() {

return hb[ix(nextGetIndex())];

}

由上面的代码可见,buffer的读写操作,就是发生在position位置的。

Buffer提供了两个方法对position进行操作:


int


position()
          Returns this
buffer‘s position.


Buffer


position(int newPosition)

可见我们可以手动的调整读写位置。

3.mark

Mark和reset常常是一对操作,这里的mark的语义和功能,同InputStream流类中提供的mark功能是完全一致的。

Marks the current position in this input stream. A subsequent call
to the reset method repositions this stream at the last marked position so that
subsequent reads re-read the same bytes.

就是在调用者方法时,将当前的position记录下来,

这是 Buffer 的mark的实现:

public final Buffer mark() {

mark = position;

return this;

}

这是 ByteArrayInputStream类的实现:

public void mark(int readAheadLimit) {

mark = pos;

}

调用 reset方法,使得 position 赋值为 mark 中保存的上一次调用mark方法的值:

public final Buffer reset() {

int m = mark;

if (m < 0)

throw new InvalidMarkException();

position = m;

return this;

}

4. limit

Limit的作用:用来限制读写的位置

public final Buffer limit(int newLimit) {

if ((newLimit > capacity) || (newLimit < 0))

throw new IllegalArgumentException();

limit = newLimit;

if (position > limit) position = limit;

if (mark > limit) mark = -1;

return this;

}

3.Java.io

BufferedReader类的 readLine 方法 ---》 调用 fill() 方法。

Fill:

n = in.read(cb, dst, cb.length - dst);

java.io.Reader。 就是这个类的方法。

这个类的 read 方法是:

sd.read(cbuf, offset, length);

sd = StreamDecoder.forInputStreamReader(in, this, charsetName);

其中的 in 就是 InputStream

所以最终是调用read方法来读取数据,

时间: 2024-07-30 17:51:35

流式IO读写的相关文章

Java流式IO

1. 流式IO结构 下图只给出了较为常用的IO流的类图结构 Java的IO流主要分为两大类:字节流和字符流,字节流以InputStream和OutputStream为基础类,字符流以Reader和Writer为基础类. 2. 字节流 字节流以InputStream和OutputStream为基础类,常用的子类流有: FileInputStream和FileOutputStream用于从文件读写二进制数据: FilterInputStream和FilterOutputStream即过滤流,过滤流可

IO流-文本IO\读写二进制数据

文本IO 一.简述 OutputStreamWriter类使用选定的编码方式吧Unicode字符流转换为字节流,InputStreamReader类将包含字节的输入流转为可以产生Unicode字符的读入器. 例: (1)InputStreamReader in = new InputStreamReader(System.in)让一个输入读入器可以从控制台读入输入并转换为Unicode (2)InputStreamReader in = new InputStreamReader(new Fil

Go 流式 IO

原文链接:基本的 IO 接口 原文链接:方便的IO操作函数集 图片来源:图片显示来源 1. 1.1 io — 基本的 IO 接口 io 包为 I/O 原语提供了基本的接口.它主要包装了这些原语的已有实现. 由于这些被接口包装的I/O原语是由不同的低级操作实现,因此,在另有声明之前不该假定它们的并行执行是安全的. 在 io 包中最重要的是两个接口:Reader 和 Writer 接口.本章所提到的各种 IO 包,都跟这两个接口有关,也就是说,只要满足这两个接口,它就可以使用 IO 包的功能. 1.

Java IO:面向流、同步、堵塞式IO(BIO)

转载请注明出处:jiq?钦's technical Blog 备注:阅读此文之前,建议先看我这篇博文了解堵塞式IO和非堵塞式IO的基本概念. JAVA BIO是面向流(字节流.字符流)的,即从流中一次读取一个或者多个字节,读取和写入时都须要同步堵塞直至完毕. 一.流(Stream) 1.字节流 输入(InputStream) 介质流 FileInputStream 从文件里读取信息 PipedInputStream 产生用于写入相关PipedOutputStream的数据,实现"管道化"

java IO流文件的读写具体实例(转载)

引言: 关于java IO流的操作是非常常见的,基本上每个项目都会用到,每次遇到都是去网上找一找就行了,屡试不爽.上次突然一个同事问了我java文件的读取,我一下子就懵了第一反应就是去网上找,虽然也能找到,但自己总感觉不是很踏实,所以今天就抽空看了看java IO流的一些操作,感觉还是很有收获的,顺便总结些资料,方便以后进一步的学习... IO流的分类:1.根据流的数据对象来分:高端流:所有的内存中的流都是高端流,比如:InputStreamReader  低端流:所有的外界设备中的流都是低端流

Java基础:阻塞式IO

转载请注明出处:jiq?钦's technical Blog 备注:阅读此文之前,建议先看我这篇博文了解阻塞式IO和非阻塞式IO的基本概念. 一.流(Stream) 1.字节流 输入(InputStream) 介质流 FileInputStream 从文件中读取信息 PipedInputStream 产生用于写入相关PipedOutputStream的数据,实现"管道化"概念 ByteArrayInputStream 允许将内存缓冲区当做InputStream使用 处理流 Sequen

Java基础:非阻塞式IO

转载请注明出处:jiq?钦's technical Blog 引言 JDK1.4中引入了NIO,即New IO,目的在于提高IO速度.特别注意JavaNIO不完全是非阻塞式IO(No-Blocking IO),因为其中部分通道(如FileChannel)只能运行在阻塞模式下,而其他的通道可以在阻塞式和非阻塞式之间进行选择. 尽管这样,我们还是习惯将Java NIO看作是非阻塞式IO,而前面介绍的面向流(字节/字符)的IO类库则是非阻塞的,详细来看,两者区别如下: IO NIO 面向流(Strea

C++的那些事:流与IO类

1.流的概念 "流"就是"流动",是物质从一处向另一处流动的过程,比如我们能感知到的水流.C++的流是指信息从外部输入设备(如键盘和磁盘)向计算机内部(即内存)输入和从内存向外部输出设备(如显示器和磁盘)输出的过程,这种输入输出过程被形象地比喻为"流". 为了实现信息的内外流动,C++系统定义了I/O类库,其中的每一个类都称作相应的流或流类,用以完成某一方面的功能.根据一个流类定义的对象也时常被称为流. 通常标准输入或标准输出设备显示器称为标准流

搬家与流式处理

这两天搬家,身体很劳累,脑子算是没闲着.在把货物搬上楼的过程中,我琢磨了个自认为很高效的方法,本质和流式处理很像. 需求与尝试 一车货物,零零散散打了些包,停在楼下,需要搬到五楼去.劳力有三人.一开始的方案是每个人自己拿几样东西,自管自上楼去,再下楼来拿下一趟.搬了几趟后,有以下一些问题: 1. 搬运过程中,累的不是手臂,而是脚.光爬几次五楼,腿已经先受不了了. 2. 过程中为了方便,楼下车不锁,楼上门不关,这是潜在的一种风险因子. 3. 每个人在车上和楼上分别会花些时间整理货物,前者是为了携带