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.pswp.cn/news/396356.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396356.shtml
英文地址,請注明出處:http://en.pswp.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;在整個程序中只有一個實例對…