Java中InputStream流的多次讀取的實(shí)現(xiàn)示例
在讀取 InputStream 的時(shí)候,其實(shí)內(nèi)部是有個(gè)指針,它指示每次讀取之后下一次要讀取的起始位置,當(dāng)?shù)谝淮巫x完的時(shí)候,指針已經(jīng)指到最后了,當(dāng)再次讀取的時(shí)候,自然是讀不到數(shù)據(jù)的。
1. 使用 StringBuilder 中轉(zhuǎn)
public static void main(String[] args) throws IOException {
String filePath = "C:\\Users\\wangb\\Desktop\\test.txt";
// 使用Files.newInputStream方法獲取InputStream
InputStream is = Files.newInputStream(Paths.get(filePath));
// builder 保留讀到的數(shù)據(jù)
StringBuilder builder = new StringBuilder();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
builder.append(new String(buffer, 0, len));
}
System.out.println("-------第一次需要InputStream,那么就創(chuàng)建一個(gè)-------");
InputStream isOne = new ByteArrayInputStream(builder.toString().getBytes());
// 下面是測(cè)試新的InputStream到底是否有數(shù)據(jù)
byte[] bufferOne = new byte[1024];
int lenOne;
while ((lenOne = isOne.read(bufferOne)) != -1) {
System.out.println(new String(bufferOne, 0, lenOne));
}
System.out.println("-------第二次需要InputStream,那么就再創(chuàng)建一個(gè)-------");
InputStream isTwo = new ByteArrayInputStream(builder.toString().getBytes());
// 下面是測(cè)試新的InputStream到底是否有數(shù)據(jù)
byte[] bufferTwo = new byte[1024];
int lenTwo;
while ((lenTwo = isTwo.read(bufferTwo)) != -1) {
System.out.println(new String(bufferTwo, 0, lenTwo));
}
is.close();
isOne.close();
isTwo.close();
}
2. 使用 ByteArrayOutputStream 中轉(zhuǎn)
public static void main(String[] args) throws IOException {
String filePath = "C:\\Users\\wangb\\Desktop\\test.txt";
// 使用Files.newInputStream方法獲取InputStream
InputStream is = Files.newInputStream(Paths.get(filePath));
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
int len;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
byteArrayOut.write(buffer, 0, len);
}
System.out.println("-------第一次需要InputStream,那么就創(chuàng)建一個(gè)-------");
InputStream isOne = new ByteArrayInputStream(byteArrayOut.toByteArray());
// 下面是測(cè)試新的InputStream到底是否有數(shù)據(jù)
byte[] bufferOne = new byte[1024];
int lenOne;
while ((lenOne = isOne.read(bufferOne)) != -1) {
System.out.println(new String(bufferOne, 0, lenOne));
}
System.out.println("-------第二次需要InputStream,那么就再創(chuàng)建一個(gè)-------");
InputStream isTwo = new ByteArrayInputStream(byteArrayOut.toByteArray());
// 下面是測(cè)試新的InputStream到底是否有數(shù)據(jù)
byte[] bufferTwo = new byte[1024];
int lenTwo;
while ((lenTwo = isTwo.read(bufferTwo)) != -1) {
System.out.println(new String(bufferTwo, 0, lenTwo));
}
is.close();
isOne.close();
isTwo.close();
}
3. 使用 ByteArrayInputStream 重置指針
public static void main(String[] args) throws IOException {
String filePath = "C:\\Users\\wangb\\Desktop\\test.txt";
// 使用Files.newInputStream方法獲取InputStream
InputStream is = Files.newInputStream(Paths.get(filePath));
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
int len;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
byteArrayOut.write(buffer, 0, len);
}
// 創(chuàng)建一個(gè)新的 ByteArrayInputStream 對(duì)象,包含復(fù)制的數(shù)據(jù)
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOut.toByteArray());
System.out.println("-------第一次使用-------");
// 下面是測(cè)試新的InputStream到底是否有數(shù)據(jù)
byte[] bufferOne = new byte[1024];
int lenOne;
while ((lenOne = byteArrayInputStream.read(bufferOne)) != -1) {
System.out.println(new String(bufferOne, 0, lenOne));
}
// 重置 ByteArrayInputStream 的指針到開(kāi)頭
byteArrayInputStream.reset();
System.out.println("-------第二次使用-------");
// 下面是測(cè)試新的InputStream到底是否有數(shù)據(jù)
byte[] bufferTwo = new byte[1024];
int lenTwo;
while ((lenTwo = byteArrayInputStream.read(bufferTwo)) != -1) {
System.out.println(new String(bufferTwo, 0, lenTwo));
}
is.close();
byteArrayInputStream.close();
}
到此這篇關(guān)于Java中InputStream流的多次讀取的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Java InputStream流讀取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring引入外部屬性文件配置數(shù)據(jù)庫(kù)連接的步驟詳解
這篇文章主要介紹了Spring引入外部屬性文件配置數(shù)據(jù)庫(kù)連接的步驟詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
springboot實(shí)現(xiàn)增加黑名單和白名單功能
本文主要介紹了springboot實(shí)現(xiàn)增加黑名單和白名單功能,就是單純的實(shí)現(xiàn)filter,然后注冊(cè)到springboot里面,在filter里面進(jìn)行黑白名單的篩選,感興趣的可以了解一下2024-05-05
java加密MD5實(shí)現(xiàn)及密碼驗(yàn)證代碼實(shí)例
這篇文章主要介紹了java加密MD5實(shí)現(xiàn)及密碼驗(yàn)證代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Springboot通過(guò)請(qǐng)求頭獲取當(dāng)前用戶(hù)信息方法詳細(xì)示范
這篇文章主要介紹了Springboot通過(guò)請(qǐng)求頭獲取當(dāng)前用戶(hù)信息的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-11-11
淺析如何在SpringBoot上傳中將MultipartFile轉(zhuǎn)File對(duì)象
在我們開(kāi)發(fā) Spring Boot Web 應(yīng)用中,文件上傳通常通過(guò) MultipartFile 接口接收,但有時(shí)我們需要將 MultipartFile 轉(zhuǎn)成標(biāo)準(zhǔn)的 java.io.File 對(duì)象,下面我們就來(lái)看看具體實(shí)現(xiàn)吧2025-08-08
解決SpringBoot使用devtools導(dǎo)致的類(lèi)型轉(zhuǎn)換異常問(wèn)題
這篇文章主要介紹了解決SpringBoot使用devtools導(dǎo)致的類(lèi)型轉(zhuǎn)換異常問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。 一起跟隨小編過(guò)來(lái)看看吧2020-08-08
JPA實(shí)現(xiàn)多條件分頁(yè)查詢(xún)
這篇文章主要介紹了JPA實(shí)現(xiàn)多條件分頁(yè)查詢(xún)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

