日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java inputstream api_Java 读取/转换 InputStream 为字符串

發(fā)布時間:2023/12/15 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java inputstream api_Java 读取/转换 InputStream 为字符串 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題

如果你有一個java.io.InputStream對象,你應該如何處理這個對象并產生一個String?

假設我有一個包含文本數(shù)據(jù)的InputStream,并且想將它轉換為String,例如我可以將它寫入日志文件。

采用InputStream并將其轉換為String的最簡單方法是什么?

public String convertStreamToString(InputStream is) {

// ???

}

#1 熱門回答(2077 贊)

這是一種僅使用標準Java庫的方式(請注意,流未關閉,YMMV)。

static String convertStreamToString(java.io.InputStream is) {

java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");

return s.hasNext() ? s.next() : "";

}

我從"Stupid Scanner tricks"學習了這個技巧。它工作的原因是因為Scanner在流中標記了代幣,在這種情況下,我們使用“輸入邊界的開始”(\ A)分離標記,因此只給出了流中整個內容的一個標記。

請注意,如果您需要詳細說明輸入流的編碼,則可以為Scanner構造函數(shù)提供第二個參數(shù),以指示要使用的字符集(例如“UTF-8”)。

帽尖也去了Jacob,誰曾經(jīng)指向我說的文章。

**編輯:**感謝來自Patrick的建議,在處理空輸入流時使功能更強大.**再一次編輯:**nited try / catch,Patrick的方式更簡潔。

#2 熱門回答(2010 贊)

一個很好的方法是使用Apache commonsIOUtils將InputStream復制到StringWriter中

StringWriter writer = new StringWriter();

IOUtils.copy(inputStream, writer, encoding);

String theString = writer.toString();

甚至

// NB: does not close inputStream, you'll have to use try-with-resources for that

String theString = IOUtils.toString(inputStream, encoding);

另外,如果你不想混合你的Streams和Writer,你可以使用ByteArrayOutputStream

#3 熱門回答(1586 贊)

總結其他答案,我找到了11個主要方法來做到這一點(見下文)。我寫了一些性能測試(見下面的結果):

將InputStream轉換為字符串的方法:-使用IOUtils.toString(Apache Utils)String result = IOUtils.toString(inputStream,StandardCharsets.UTF_8);

使用CharStreams(guava)String result = CharStreams.toString(new InputStreamReader(

inputStream,Charsets.UTF_8));

使用掃描儀(JDK)掃描儀s =新掃描儀(inputStream).useDelimiter(“\ A”);

字符串結果= s.hasNext()? s.next():“”;

使用Stream Api(Java 8)。警告:此解決方案將不同的換行符(如\ r \ n)轉換為\ n。 String result = new BufferedReader(new InputStreamReader(inputStream))

。.lines()收集(Collectors.joining( “\ n”));

使用并行流API(Java 8)。警告:此解決方案將不同的換行符(如\ r \ n)轉換為\ n。 String result = new BufferedReader(new InputStreamReader(inputStream))。lines()

。.parallel()收集(Collectors.joining( “\ n”));

使用InputStreamReader和StringBuilder(JDK)final int bufferSize = 1024;

final char [] buffer = new char [bufferSize];

最終的StringBuilder out = new StringBuilder();

Reader in = new InputStreamReader(inputStream,“UTF-8”);

for(;;){

int rsz = in.read(buffer,0,buffer.length);

如果(rsz <0)

打破;

out.append(buffer,0,rsz);

}

返回out.toString();

使用StringWriter和IOUtils.copy(Apache Commons)StringWriter writer = new StringWriter();

IOUtils.copy(inputStream,writer,“UTF-8”);

返回writer.toString();

使用ByteArrayOutputStream和inputStream.read(JDK)ByteArrayOutputStream result = new ByteArrayOutputStream();

byte [] buffer = new byte [1024];

int長度;

while((length = inputStream.read(buffer))!= -1){

result.write(buffer,0,length);

}

// StandardCharsets.UTF_8.name()> JDK 7

返回result.toString(“UTF-8”);

使用BufferedReader(JDK)。警告:此解決方案將不同的換行符(如\ n \ r)轉換為line.separator系統(tǒng)屬性(例如,在Windows中為“\ r \ n”)。 String newLine = System.getProperty(“l(fā)ine.separator”);

BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

StringBuilder result = new StringBuilder();

字符串行;布爾標志= false;

while((line = reader.readLine())!= null){

result.append(flag?newLine:“”).append(line);

flag = true;

}

return result.toString();

使用BufferedInputStream和ByteArrayOutputStream(JDK)BufferedInputStream bis = new BufferedInputStream(inputStream);

ByteArrayOutputStream buf = new ByteArrayOutputStream();

int result = bis.read();

while(result!= -1){

buf.write((byte)result);

result = bis.read();

}

// StandardCharsets.UTF_8.name()> JDK 7

返回buf.toString(“UTF-8”);

使用inputStream.read()和StringBuilder(JDK)。警告:此解決方案有Unicode問題,例如使用俄文文本(僅在非Unicode文本中正常工作)int ch;

StringBuilder sb = new StringBuilder();

while((ch = inputStream.read())!= -1)

sb.append((char)的CH);

重啟();

返回sb.toString();

警告:

解決方案4,5和9將不同的換行符轉換為一個。

解決方案11無法正確使用Unicode文本

性能測試

小字符串(長度= 175),URL ingithub(模式=平均時間,系統(tǒng)= Linux,得分為1,343是最好的)的性能測試:

Benchmark Mode Cnt Score Error Units

8. ByteArrayOutputStream and read (JDK) avgt 10 1,343 ± 0,028 us/op

6. InputStreamReader and StringBuilder (JDK) avgt 10 6,980 ± 0,404 us/op

10. BufferedInputStream, ByteArrayOutputStream avgt 10 7,437 ± 0,735 us/op

11. InputStream.read() and StringBuilder (JDK) avgt 10 8,977 ± 0,328 us/op

7. StringWriter and IOUtils.copy (Apache) avgt 10 10,613 ± 0,599 us/op

1. IOUtils.toString (Apache Utils) avgt 10 10,605 ± 0,527 us/op

3. Scanner (JDK) avgt 10 12,083 ± 0,293 us/op

2. CharStreams (guava) avgt 10 12,999 ± 0,514 us/op

4. Stream Api (Java 8) avgt 10 15,811 ± 0,605 us/op

9. BufferedReader (JDK) avgt 10 16,038 ± 0,711 us/op

5. parallel Stream Api (Java 8) avgt 10 21,544 ± 0,583 us/op

大字符串性能測試(長度= 50100),網(wǎng)址github(模式=平均時間,系統(tǒng)= Linux,得分200,715是最好的):

Benchmark Mode Cnt Score Error Units

8. ByteArrayOutputStream and read (JDK) avgt 10 200,715 ± 18,103 us/op

1. IOUtils.toString (Apache Utils) avgt 10 300,019 ± 8,751 us/op

6. InputStreamReader and StringBuilder (JDK) avgt 10 347,616 ± 130,348 us/op

7. StringWriter and IOUtils.copy (Apache) avgt 10 352,791 ± 105,337 us/op

2. CharStreams (guava) avgt 10 420,137 ± 59,877 us/op

9. BufferedReader (JDK) avgt 10 632,028 ± 17,002 us/op

5. parallel Stream Api (Java 8) avgt 10 662,999 ± 46,199 us/op

4. Stream Api (Java 8) avgt 10 701,269 ± 82,296 us/op

10. BufferedInputStream, ByteArrayOutputStream avgt 10 740,837 ± 5,613 us/op

3. Scanner (JDK) avgt 10 751,417 ± 62,026 us/op

11. InputStream.read() and StringBuilder (JDK) avgt 10 2919,350 ± 1101,942 us/op

圖表(性能測試取決于Windows 7系統(tǒng)中的輸入流長度)

性能測試(平均時間)取決于Windows 7系統(tǒng)中的輸入流長度:

length 182 546 1092 3276 9828 29484 58968

test8 0.38 0.938 1.868 4.448 13.412 36.459 72.708

test4 2.362 3.609 5.573 12.769 40.74 81.415 159.864

test5 3.881 5.075 6.904 14.123 50.258 129.937 166.162

test9 2.237 3.493 5.422 11.977 45.98 89.336 177.39

test6 1.261 2.12 4.38 10.698 31.821 86.106 186.636

test7 1.601 2.391 3.646 8.367 38.196 110.221 211.016

test1 1.529 2.381 3.527 8.411 40.551 105.16 212.573

test3 3.035 3.934 8.606 20.858 61.571 118.744 235.428

test2 3.136 6.238 10.508 33.48 43.532 118.044 239.481

test10 1.593 4.736 7.527 20.557 59.856 162.907 323.147

test11 3.913 11.506 23.26 68.644 207.591 600.444 1211.545

總結

以上是生活随笔為你收集整理的java inputstream api_Java 读取/转换 InputStream 为字符串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。