java判断读到末尾_IO流如何判断读取到了流的结尾,程序中以-1来判断,是流中写入一个EOF表示流结束吗,底层实现呢?...

Java中的read()方法返回-1表示读到流的末尾,这并非流中写入的数据。这个-1是读取操作的结果,表明没有更多数据可读。实际底层实现可能因不同的IO类型(如socket或文件)而异。LengthAwareInputStream和LengthLimitedInputStream是两个示例类,前者记录已读取字节数,后者在达到特定长度后自动返回-1。
摘要由CSDN通过智能技术生成

-1不是流中写入的数据。read()方法返回的数据都是unsigned byte,即是[0,255]。底层实现有很多,比如socket IO和文件IO,甚至你自己也可以实现。

——————————————————————

给两个类的代码给你看看,理解一下这个东西:

/**

* 能随时获取读取了多少字节数据的InputStream

*/

public class LengthAwareInputStream extends FilterInputStream {

private volatile long length;

private long maxReadSize;

public LengthAwareInputStream(InputStream in) {

this(in, Long.MAX_VALUE);

}

public LengthAwareInputStream(InputStream in, long maxReadSize) {

super(in);

this.maxReadSize = maxReadSize;

}

@Override

public int read() throws IOException {

//读取长度超过最大值,用于检查流量

if (length + 1 > maxReadSize) {

throw new IOException("exceeded max read size: " + maxReadSize);

}

int ret = super.read();

if (ret >= 0) {

length++;

}

return ret;

}

@Override

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

//读取长度超过最大值,用于检查流量

if (length + len > maxReadSize) {

throw new IOException("exceeded max read size: " + maxReadSize);

}

int ret = super.read(b, off, len);

if (ret > 0) {

length += ret;

}

return ret;

}

public long getLength() {

return length;

}

}

/**

* 读取数据达到特定长度之后自动终止(即返回-1)

* Created by Weijun on 2017/2/23.

*/

public class LengthLimitedInputStream extends LengthAwareInputStream {

private final long limitBytes;

/**

* @param in

* @param limitBytes

*/

public LengthLimitedInputStream(InputStream in, long limitBytes) {

super(in);

this.limitBytes = limitBytes;

}

@Override

public int read() throws IOException {

if (getLength() == limitBytes) {

return -1;

}

return super.read();

}

@Override

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

len = (int) Math.min(len, limitBytes - getLength());

if (len == 0) {

return -1;

}

return super.read(b, off, len);

}

}

你并不需要关注底层IO流如何实现return -1。实在想看,去看JDK的实现,是c写的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值