java inputstream api_Java 读取/转换 InputStream 为字符串
問題
如果你有一個java.io.InputStream對象,你應該如何處理這個對象并產生一個String?
假設我有一個包含文本數據的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構造函數提供第二個參數,以指示要使用的字符集(例如“UTF-8”)。
帽尖也去了Jacob,誰曾經指向我說的文章。
**編輯:**感謝來自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系統屬性(例如,在Windows中為“\ r \ n”)。 String newLine = System.getProperty(“line.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(模式=平均時間,系統= 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),網址github(模式=平均時間,系統= 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系統中的輸入流長度)
性能測試(平均時間)取決于Windows 7系統中的輸入流長度:
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 为字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QQ红包蚊子图案怎么画 蚊子图案简笔画教
- 下一篇: Win10玩英雄联盟提示登录程序已停止怎