Java中InputStream流的多次讀取的實現(xiàn)示例
在讀取 InputStream 的時候,其實內(nèi)部是有個指針,它指示每次讀取之后下一次要讀取的起始位置,當(dāng)?shù)谝淮巫x完的時候,指針已經(jīng)指到最后了,當(dāng)再次讀取的時候,自然是讀不到數(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)建一個-------");
InputStream isOne = new ByteArrayInputStream(builder.toString().getBytes());
// 下面是測試新的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)建一個-------");
InputStream isTwo = new ByteArrayInputStream(builder.toString().getBytes());
// 下面是測試新的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)建一個-------");
InputStream isOne = new ByteArrayInputStream(byteArrayOut.toByteArray());
// 下面是測試新的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)建一個-------");
InputStream isTwo = new ByteArrayInputStream(byteArrayOut.toByteArray());
// 下面是測試新的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)建一個新的 ByteArrayInputStream 對象,包含復(fù)制的數(shù)據(jù)
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOut.toByteArray());
System.out.println("-------第一次使用-------");
// 下面是測試新的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 的指針到開頭
byteArrayInputStream.reset();
System.out.println("-------第二次使用-------");
// 下面是測試新的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流的多次讀取的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Java InputStream流讀取內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring引入外部屬性文件配置數(shù)據(jù)庫連接的步驟詳解
這篇文章主要介紹了Spring引入外部屬性文件配置數(shù)據(jù)庫連接的步驟詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Springboot通過請求頭獲取當(dāng)前用戶信息方法詳細(xì)示范
這篇文章主要介紹了Springboot通過請求頭獲取當(dāng)前用戶信息的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-11-11
淺析如何在SpringBoot上傳中將MultipartFile轉(zhuǎn)File對象
在我們開發(fā) Spring Boot Web 應(yīng)用中,文件上傳通常通過 MultipartFile 接口接收,但有時我們需要將 MultipartFile 轉(zhuǎn)成標(biāo)準(zhǔn)的 java.io.File 對象,下面我們就來看看具體實現(xiàn)吧2025-08-08
解決SpringBoot使用devtools導(dǎo)致的類型轉(zhuǎn)換異常問題
這篇文章主要介紹了解決SpringBoot使用devtools導(dǎo)致的類型轉(zhuǎn)換異常問題,具有很好的參考價值,希望對大家有所幫助。 一起跟隨小編過來看看吧2020-08-08

