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

-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写的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

结束书

by William Countiss威廉Countiss 结束书 (Closing the Book on Closures) JavaScript closures are an important, but notoriously confusing concept. There’s no escaping it — if you want to grow as a developer, you need to understand what closures are and how …

java激励_激励干个人java的不足之处

1.你需要精通面向对象分析与设计(OOA/OOD)、涉及模式(GOF,J2EEDP)以及综合模式。你应该十分了解UML,尤其是class,object,interaction以及statediagrams。2.你需要学习JAVA语言的基础知识以及它的核心类库(collections,…

Bioconductor软件安装与升级

1 安装工具Bioc的软件包不能使用直接install.packages函数,它有自己的安装工具,使用下面的代码: source("https://bioconductor.org/biocLite.R")biocLite() 上面第二个语句将安装Bioconductor一些基础软件包,包括BiocI…

Laravel Kernel引导流程分析

Laravel Kernel引导流程分析 代码展示 protected function sendRequestThroughRouter($request) {# $this->app->instance(request, $request);# Facade::clearResolvedInstance(request);// 主要是这句代码$this->bootstrap();# return (new Pipeline($this->app)…

Android RecyclerView (一) 使用完全解析

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45059587; 本文出自:【张鸿洋的博客】 概述 RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用。 据官方的…

数据透视表日期怎么选范围_透视范围

数据透视表日期怎么选范围by Tiffany White蒂芙尼怀特(Tiffany White) 透视范围 (Putting Scope in Perspective) In JavaScript, lexical scope deals with where your variables are defined, and how they will be accessible — or not accessible — to the rest of your…

feign调用多个服务_Spring Cloud 快速入门系列之feign–微服务之间的调用

我们将一个大的应用拆成多个小的服务之后,紧接着的一个问题就是,原本都在一个项目里,方法我可以随便调用,但是拆开后,原来的方法就没法直接调用了,这时候要怎么办?Spring Cloud提供了feign&…

Asix下日志包冲突

为什么80%的码农都做不了架构师?>>> Class org.apache.commons.logging.impl.SLF4JLogFactory does not implement org.apache.commons.logging. 最近集成asix包的时候发生如下错误,原因是程序运行时logFactoryImple加载了JBOSS下面的sff4j包…

kubernetes中mysql乱码_在kubernetes中部署tomcat与mysql集群-Go语言中文社区

在kubernetes中部署tomcat与mysql集群之前必须要有以下这些基础:1. 已安装、配置kubernetes2. 集群中有tomcat与mysql容器镜像3. 有docker基础具体步骤部署tomcat创建tomcat RC对象我们想要在kubernetes集群中配置tomcat服务器,首先要保证集群中的节点上…

c# 测试运行时间毫秒级

long currentMillis (DateTime.Now.Ticks - (new DateTime(1970, 1, 1, 0, 0, 0, 0)).Ticks) / 10000;/*代码*/long currentMillis1 (DateTime.Now.Ticks - (new DateTime(1970, 1, 1, 0, 0, 0, 0)).Ticks) / 10000;MessageBox.Show((currentMillis1 - currentMillis).ToStri…

nodejs_NodeJS历险记

nodejsby Elliott McNary埃利奥特麦克纳里(Elliott McNary) NodeJS历险记 (Adventures in NodeJS) I built an app a couple of weeks ago after going through FreeCodeCamp’s Front-End curriculum and wanted to write an update as I head into NodeJS-land. I was final…

pytdx 获取板块指数_能否增加一个通过股票代码,板块指数代码获得中文名称的接口?...

T0002/hq_cache/shex.tnfT0002/hq_cache/szex.tnf这个解码就是。/***************************************************股票代码列表和股票名称T0002/hq_cache/shex.tnfT0002/hq_cache/szex.tnf***************************************************/struct TdxSymbolMap {cha…

灵动标签调用友情链接

1、文字形式[e:loop{select * from [!db.pre!]enewslink where checked1 and classid1 order by myorder,20,24,0}] <li><a href"<?$bqr[lurl]?>" title"<?$bqr[lname]?>" target"_blank"><?$bqr[lname]?>&…

4-----Scrapy框架中选择器的用法

Scrapy提取数据有自己的一套机制&#xff0c;被称作选择器&#xff08;selectors&#xff09;,通过特定的Xpath或者CSS表达式来选择HTML文件的某个部分Xpath是专门在XML文件中选择节点的语言&#xff0c;也可以用在HTML上。CSS是一门将HTML文档样式化语言&#xff0c;选择器由它…

【原】Jenkins持续集成环境搭建之创建java项目的job【centos6.5 java maven git 项目】...

一、构建一个maven项目在jenkins主页上&#xff0c;左侧&#xff0c;选择“新建”&#xff0c;然后填写项目名称&#xff0c;选择“构建一个maven项目”二、Git配置保存之后&#xff0c;进入详细配置页面&#xff1a;这里的源码管理&#xff1a;选择git&#xff0c;输入代码的g…

linux修改java内存大小_Linux 和 windows修改java虚拟机内存大小

1、Java内存区域划分&#xff1a; 运行时的数据区:方法区和堆(各个线程共享的内存区域)&#xff0c;程序计数器、Java虚拟机栈和本地方法栈(线程私有的) 程序计数器&#xff1a;当前线程所执行字节码的行号指示器&#xff0c;字节码解释器就是通过改变计算器的值来选取下一条需…

html制作彩虹_制作彩虹

html制作彩虹by Gil Fewster吉尔弗斯特(Gil Fewster) 制作彩虹 (Making rainbows) This is a story about curiosity. It’s also about what happens when you stick a needle into your eye. If you happen to be eating a handful of grapes right this moment, maybe come…

python3 set_python3.x 基础三:set集合

| clear(...) 清空一个集合| Remove all elements from this set.>>>set1.clear()>>>set1set()| copy(...) 影子复制&#xff0c;指向同一个内存地址| Return a shallow copy of a set. |>>> list1[3, 2, 1, 1, 2, 3, 4, 5]>>>…

Linux内核分析作业第八周

进程的切换和系统的一般执行过程 一、进程调度的时机 中断处理过程&#xff08;包括时钟中断、I/O中断、系统调用和异常&#xff09;中&#xff0c;直接调用schedule()&#xff0c;或者返回用户态时根据need_resched标记调用schedule()&#xff1b; 内核线程可以直接调用sched…

iOS--数据存储NSUserDefaults

2019独角兽企业重金招聘Python工程师标准>>> 今天去面试&#xff0c;被问道NSUserDefaults的存取并手写出来&#xff0c;一时想不起来&#xff0c;回来之后看看之前的笔记&#xff0c;稍作一些整理 NSUserDefaults是一个单例&#xff0c;在整个程序中只有一个实例对…