一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - 解決java文件流處理異常 mark/reset not supported問(wèn)題

解決java文件流處理異常 mark/reset not supported問(wèn)題

2020-10-08 15:51微觀盡頭 JAVA教程

這篇文章主要介紹了解決java文件流處理異常 mark/reset not supported問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

原因:

給定的流不支持mark和reset就會(huì)報(bào)這個(gè)錯(cuò)誤。

獲取到一個(gè)網(wǎng)絡(luò)流,這個(gè)網(wǎng)絡(luò)流不允許讀寫(xiě)頭來(lái)回移動(dòng),也就不允許mark/reset機(jī)制.

解決辦法:

用BufferedInputStream把原來(lái)的流包一層.

BufferedInputStream buffInputStream = new BufferedInputStream(fileInputStream);

補(bǔ)充知識(shí):Java BufferedReader之mark和reset方法實(shí)踐

在讀取文本的操作中,常常會(huì)在讀取到文件末尾時(shí)重新到文件開(kāi)頭進(jìn)行操作。通過(guò)搜索發(fā)現(xiàn),有兩種方法:

(1)mark和reset方法,但是在博客中都是以簡(jiǎn)短的string為示例對(duì)象;

(2)利用randomacessfile中的seek方法,seek方法可進(jìn)行移動(dòng)。

由于前面的文本操作使用了BufferedReader,所以只能用mark和reset方法將程序進(jìn)行完善。非常好理解這兩個(gè)方法,一個(gè)在前面做標(biāo)記,另一個(gè)重置返回到做標(biāo)記的位置。

首先,看一下mark方法

public void mark
(int readAheadLimit) throws IOException
Marks the present position in the stream. Subsequent calls to reset() will attempt to reposition the stream to this point.
Overrides:
markin class Reader
Parameters:
readAheadLimit - Limit on the number of characters that may be read while still preserving the mark. An attempt to reset the stream after reading characters up to this limit or beyond may fail. A limit value larger than the size of the input buffer will cause a new buffer to be allocated whose size is no smaller than limit. Therefore large values should be used with care.
Throws:
IllegalArgumentException- If readAheadLimit is < 0
IOException- If an I/O error occurs

mark(readAheadLimit)方法僅有一個(gè)參數(shù),翻譯過(guò)來(lái)就是“保證mark有效的情況下限制讀取的字符數(shù)。當(dāng) 讀取字符達(dá)到或超過(guò)此限制時(shí),嘗試重置流會(huì)失敗。當(dāng)限制數(shù)值大于輸入buffer的默認(rèn)大小時(shí),將會(huì)動(dòng)態(tài)分配一個(gè)容量不小于限制數(shù)值的buffer。因此,應(yīng)該慎用大數(shù)值。”

第二,獲取文件的大小

既然要讀取某文件,需知道該文件的大小,調(diào)用file.length()方法,將會(huì)“Returns the length of the file denoted by this abstract pathname. The return value is unspecified if this pathname denotes a directory.”

由于返回?cái)?shù)值為long型,需加一個(gè)判斷(是否超出int默認(rèn)最大值,因?yàn)閙ark方法的參數(shù)為int類(lèi)型)后才能進(jìn)行int的強(qiáng)制轉(zhuǎn)換

?
1
2
3
4
5
6
int size;
if(filesize>=2147483647){
  Toast.makeText(……).show();
}else{
  size=(int)filesize;
}

第三,設(shè)置mark參數(shù)

如果完成前兩步后,并mark(size)你就去嘗試,那么還會(huì)出錯(cuò),為什么呢?

解決java文件流處理異常 mark/reset not supported問(wèn)題

前面的mark()方法已經(jīng)講過(guò)“當(dāng)讀取字符達(dá)到或超過(guò)此限制時(shí),嘗試重置流會(huì)失敗”,所以最好還要將mark的size數(shù)值加1.

解決。

PS:我嘗試了270多KB的文件,也可以正常讀取。

修改---2016-07-19 17:03

吃完午飯回來(lái)后,就意識(shí)到一個(gè)問(wèn)題,重復(fù)操作io是非常浪費(fèi)資源的,為何不將數(shù)據(jù)全部寫(xiě)入list或map中,這樣就是從緩存中讀取數(shù)據(jù),操作更快一點(diǎn)。一下午都在修改程序,包括輸出部分及排序操作,總之對(duì)這部分的理解加深了許多。

原文鏈接:https://blog.csdn.net/huangdingsheng/article/details/93400975

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产自在自拍 | 99久久精品国产一区二区 | 白丝爆动漫羞羞动漫软件 | 456亚洲人成高清在线 | 日本精a在线观看 | 99热在线精品播放 | 大胆国模一区二区三区伊人 | 青青青青青国产免费手机看视频 | 精品一卡2卡3卡4卡5卡亚洲 | 午夜精品国产自在现线拍 | 青青精品 | 精品四虎 | 国产第一草草影院 | 九九在线免费视频 | 99re5在线精品视频热线 | 国产欧美国产精品第一区 | 久久婷婷丁香五月色综合啪免费 | 桃色视频破解版 | 全是女性放屁角色的手游 | 日本午夜大片免费观看视频 | 亚洲国产成人久久综合一区77 | 亚洲精品综合一区二区 | 40岁女人三级全黄 | 久久久免费观成人影院 | 美女被免费视频 | 久久精品一区二区免费看 | 男人插女人软件 | 亚洲成人一区 | free哆拍拍免费永久视频 | 四虎国产 | 乌克兰肥熟 | 亚洲XXX午休国产熟女屁 | 精品一区二区三区五区六区七区 | 日本精a在线观看 | 香蕉精品国产高清自在自线 | 欧美摸胸 | 免费国产在线视频 | 欧美三级一区 | 国产成人免费片在线视频观看 | 91小视频在线观看免费版高清 | 日本强不卡在线观看 |