Bir InputStream-ı Java'da bir dize necə oxuyur / çevirirəm?

java.io.InputStream obyektiniz varsa, bu obyekti necə idarə etməli və String yaratmalısınız?


Mətnli məlumatları ehtiva edən bir InputStream var deyirəm və bunu bir InputStream çevirmək istəyirəm, məsələn, onu bir günlük faylına yaza bilərsiniz.

Bir InputStream almaq və bir InputStream çevirmək üçün ən asan yol nədir?

 public String convertStreamToString(InputStream is) { // ??? } 
3483
21 нояб. Nov 21 ilə təyin olunan Johnny Maelstrom 2008-11-21 19:47 '08 at 7:47 pm 2008-11-21 19:47
@ 58 cavab
  • 1
  • 2

Bunu etmək üçün yaxşı bir yol, IOUtils üçün Apache commons IOUtils istifadə StringWriter ... kimi bir şey

 StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer, encoding); String theString = writer.toString(); 

ya da hətta

 // NB: does not close inputStream, you'll have to use try-with-resources for that String theString = IOUtils.toString(inputStream, encoding); 

Bundan əlavə, siz axın və yazılarınızı qarışdırmaq istəmirsinizsə ByteArrayOutputStream istifadə edə bilərsiniz.

2197
21 нояб. 21 noyabrda Harry Limime verilən cavabı verdi 2008-11-21 19:54 '08 at 19:54 2008-11-21 19:54

Burada yalnız standart Java kitabxanasından istifadə edə bilərsiniz (akışın bağlanmamış olduğunu unutmayın, kilometriniz dəyişə bilər).

 static String convertStreamToString(java.io.InputStream is) { java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; } 

Bu hiylə haqqında öyrəndim "Bir skaner ilə fəndlər" məqaləsindən. Bu, brauzerin akıştaki belirteçler üzerinde yinelediği üçün çalışır, bu halda, bizi "giriş sərhədinin başlanğıcını" (\ A) istifadə edərək, bizi axının bütün məzmunu üçün bir mö'cüzə verir.

border=0

Qeyd: giriş axınının şifrələməsi ilə bağlı xüsusi bir məlumat lazımdırsa, Scanner konstruktoruna (məsələn, "UTF-8") istifadə etmək üçün təyin olunan göstəriciyi göstərən ikinci bir sübut təqdim edə bilərsiniz.

Şapka ucu da bir dəfə mənə göstərilən məqaləyə toxunan Yaquba gedib.

2170
26 марта '11 в 23:40 2011-03-26 23:40 Cavab Pavel Repin tərəfindən 26 Mart 'da 23:40' də veriləcək 2011-03-26 23:40

Digər cavabları yekunlaşdırarkən, bunu etmək üçün 11 əsas yol tapdım (aşağıya bax). Bəzi performans testlərini yazdım (aşağıdakı nəticələrə baxın):

InputStream bir simliya çevirmək üçün üsullar:

  1. IOUtils.toString (Apache Utils) istifadə edərək,

     String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8); 
  2. CharStreams istifadə (Guava)

     String result = CharStreams.toString(new InputStreamReader( inputStream, Charsets.UTF_8)); 
  3. Scanner (JDK) istifadə

     Scanner s = new Scanner(inputStream).useDelimiter("\\A"); String result = s.hasNext() ? s.next() : ""; 
  4. Stream API istifadə (Java 8). Xəbərdarlıq Bu həll müxtəlif xətt fasilələrini (məsələn, \r\n ) \r\n çevirir.

     String result = new BufferedReader(new InputStreamReader(inputStream)) .lines().collect(Collectors.joining("\n")); 
  5. Paralel Stream API istifadə (Java 8). Xəbərdarlıq Bu həll müxtəlif xətt fasilələrini (məsələn, \r\n ) \r\n çevirir.

     String result = new BufferedReader(new InputStreamReader(inputStream)).lines() .parallel().collect(Collectors.joining("\n")); 
  6. InputStreamReaderStringBuilder (JDK) istifadə edərək,

     final int bufferSize = 1024; final char[] buffer = new char[bufferSize]; final StringBuilder out = new StringBuilder(); Reader in = new InputStreamReader(inputStream, "UTF-8"); for (; ; ) { int rsz = in.read(buffer, 0, buffer.length); if (rsz < 0) break; out.append(buffer, 0, rsz); } return out.toString(); 
  7. StringWriterIOUtils.copy (Apache Commons)

     StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer, "UTF-8"); return writer.toString(); 
  8. ByteArrayOutputStreaminputStream.read (JDK) istifadə edərək,

     ByteArrayOutputStream result = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { result.write(buffer, 0, length); } // StandardCharsets.UTF_8.name() > JDK 7 return result.toString("UTF-8"); 
  9. BufferedReader (JDK) istifadə edin. Xəbərdarlıq Bu həll müxtəlif xətt line.separator (məsələn, \n\r ) sistem xüsusiyyət line.separator (məsələn, Windows-da "\ r \ n").

     String newLine = System.getProperty("line.separator"); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder result = new StringBuilder(); boolean flag = false; for (String line; (line = reader.readLine()) != null; ) { result.append(flag? newLine: "").append(line); flag = true; } return result.toString(); 
  10. ByteArrayOutputStreamByteArrayOutputStream (JDK) istifadə edərək,

     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 return buf.toString("UTF-8"); 
  11. inputStream.read()StringBuilder (JDK) istifadə edin. Xəbərdarlıq Bu həll Unicode ilə problemləri var, məsələn, rus mətni ilə (yalnız Unicode-dan fərqli olan mətnlə işləyir)

     int ch; StringBuilder sb = new StringBuilder(); while((ch = inputStream.read()) != -1) sb.append((char)ch); reset(); return sb.toString(); 

Xəbərdarlıq :

  1. Çözümler 4, 5 və 9 fərqli xətlərin birinə çevrilir.

  2. Solution 11 Unicode mətn ilə düzgün işləmir.

Performans testləri

Kiçik bir String (uzunluğu = 175), github'ta url (rejimi = Orta vaxt, sistem = Linux, skor 1,343) üçün performans testləri yaxşıdır:

yaxşıdır : 

1910
17 февр. Cavab 17 fevralda Viacheslav Vedenin tərəfindən verilir. 2016-02-17 03:58 '16 'da 3:58' də 2016-02-17 03:58 'də

Apache Commons sizə:

 String myString = IOUtils.toString(myInputStream, "UTF-8"); 

Əlbəttə ki, UTF-8-dən başqa digər xarakterli kodlamaları seçə bilərsiniz.

Həmçinin baxın: ( sənədlər )

808
08 дек. Cavab Chinnery 08 dec verilir . 2008-12-08 23:13 '08 at 11:13 pm 2008-12-08 23:13

Dosyayı nəzərə alaraq, əvvəlcə java.io.Reader bir nümunəsini almaq lazımdır. Sonra oxumaq və StringBuilder əlavə edə bilərsiniz (birdən çox mövzuya daxil StringBuffer ehtiyacımız yoxdur və StringBuilder daha sürətli). Hiylə biz burada bloklarda işləyirik və buna görə də digər tamponlama axınlarına ehtiyac yoxdur. Blok ölçüsü iş vaxtında performansın optimallaşdırılması üçün parametrləşdirilmişdir.

 public static String slurp(final InputStream is, final int bufferSize) { final char[] buffer = new char[bufferSize]; final StringBuilder out = new StringBuilder(); try (Reader in = new InputStreamReader(is, "UTF-8")) { for (;;) { int rsz = in.read(buffer, 0, buffer.length); if (rsz < 0) break; out.append(buffer, 0, rsz); } } catch (UnsupportedEncodingException ex) {  } catch (IOException ex) {  } return out.toString(); } 
272
21 нояб. cümə axşamı Paul de Vrieze tərəfindən verilmiş cavab 2008-11-21 21:34 '08 at 21:34 pm 2008-11-21 21:34

İstifadə edin:

 InputStream in = ; StringBuilder sb = new StringBuilder(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String read; while ((read=br.readLine()) != null) { //System.out.println(read); sb.append(read); } br.close(); return sb.toString(); 
232
04 авг. Sampatpremarathna tərəfindən verilən cavabı 04 aug. 2011-08-04 11:29 '11 'də 11:29' də 2011-08-04 11:29

Google-Collections / Guava-dan istifadə edirsinizsə, aşağıdakıları edə bilərsiniz:

 InputStream stream = ... String content = CharStreams.toString(new InputStreamReader(stream, Charsets.UTF_8)); Closeables.closeQuietly(stream); 

Xahiş edirik unutmayın ki, ikinci parametr (yəni Charsets.UTF_8) InputStreamReader üçün lazım deyil, ancaq, bir qayda olaraq, bunu bildiyiniz halda kodlaşdırmanın göstərilməsi məsləhət görülür (lazım olduğunuz!)

158
13 июля '10 в 18:56 2010-07-13 18:56 Cavab Sakuraba tərəfindən 13 iyul 2010-cu il tarixində saat 18 : 56-da verilmişdir

Bu, Java və Android üçün mənim təmiz həllimdir və yaxşı işləyir ...

 public String readFullyAsString(InputStream inputStream, String encoding) throws IOException { return readFully(inputStream).toString(encoding); } public byte[] readFullyAsBytes(InputStream inputStream) throws IOException { return readFully(inputStream).toByteArray(); } private ByteArrayOutputStream readFully(InputStream inputStream) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length = 0; while ((length = inputStream.read(buffer)) != -1) { baos.write(buffer, 0, length); } return baos; } 
110
08 мая '12 в 23:24 2012-05-08 23:24 Cavab TacB0sS 08 may '12 saat 23: 24-da verilir. 2012-05-08 23:24

İstifadə edin:

 import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.IOException; public static String readInputStreamAsString(InputStream in) throws IOException { BufferedInputStream bis = new BufferedInputStream(in); ByteArrayOutputStream buf = new ByteArrayOutputStream(); int result = bis.read(); while(result != -1) { byte b = (byte)result; buf.write(b); result = bis.read(); } return buf.toString(); } 
57
11 июня '09 в 0:07 2009-06-11 00:07 Cavab John Moore tərəfindən 11 iyun 'da 0:07' da 2009-06-11 00:07 'də verilir

Bəzi eksperimentlərdən sonra gəldiyim ən zərif, təmiz Java (kitabxana olmadan) həll edir:

 public static String fromStream(InputStream in) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder out = new StringBuilder(); String newLine = System.getProperty("line.separator"); String line; while ((line = reader.readLine()) != null) { out.append(line); out.append(newLine); } return out.toString(); } 
56
01 янв. Cavab Drew Noakes 01 yanvar tarixində verilir 2013-01-01 06:43 '13 'da 6:43' da 2013-01-01 06:43

Tamamlama üçün burada Java 9 həll edir :

 public static String toString(InputStream input) throws IOException { return new String(input.readAllBytes(), StandardCharsets.UTF_8); } 

readAllBytes hazırda əsas JDK 9 verilənlər bazasındadir, buna görə azadlıqda görünə bilər. JDK 9 anonim istifadə edərək, indi bunu sınayabilirsiniz .

46
02 сент. Cavab verilib Tagir Valeev 02 Sentyabr. 2015-09-02 14:50 '15 'də 14:50' də 2015-09-02 14:50

Bəzi Java 8 tövsiyələrini istifadə edərdim.

 public static String streamToString(final InputStream inputStream) throws Exception { // buffering optional try ( final BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)) ) { // parallel optional return br.lines().parallel().collect(Collectors.joining("\n")); } catch (final IOException e) { throw new RuntimeException(e); // whatever. } } 

Əslində daha qısa olanlardan başqa bəzi digər cavablarla eynidır.

35
17 июля '14 в 20:58 2014-07-17 20:58 cavab 17 iyul 'da saat 20:58' də Simon Kuang tərəfindən verilir 2014-07-17 20:58

Burada 14 fərqli cavabı yoxladım (kədərləndim, kredit vermədim, amma çox sayda cütlük var).

Nəticə çox gözəl. Apache IOUtils ən yavaş olduğu ortaya çıxır və ByteArrayOutputStream ən sürətli həlldir:

Beləliklə, burada ən yaxşı üsuldur:

 public String inputStreamToString(InputStream inputStream) throws IOException { try(ByteArrayOutputStream result = new ByteArrayOutputStream()) { byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { result.write(buffer, 0, length); } return result.toString(UTF_8); } } 

20 dövr üçün 20 MB təsadüfi bayt test nəticələri

Mili saniyədə vaxt

  • ByteArrayOutputStreamTest: 194
  • NioStream: 198
  • Java9İstransferTo: 201
  • Java9ISReadAllBytes: 205
  • BufferedInputStreamVsByteArrayOutputStream: 314
  • ApacheStringWriter2: 574
  • GuavaCharStreams: 589
  • ScannerReaderNoNextTest: 614
  • ScannerReader: 633
  • ApacheStringWriter: 1544
  • StreamApi: səhv
  • ParallelStreamApi: səhv
  • BufferReaderTest: Səhv
  • InputStreamAndStringBuilder: səhv

Testin mənbə kodu

 import com.google.common.io.CharStreams; import org.apache.commons.io.IOUtils; import java.io.*; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.nio.channels.WritableByteChannel; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.stream.Collectors;  public class InputStreamToString { private static final String UTF_8 = "UTF-8"; public static void main(String... args) { log("App started"); byte[] bytes = new byte[1024 * 1024]; new Random().nextBytes(bytes); log("Stream is ready\n"); try { test(bytes); } catch (IOException e) { e.printStackTrace(); } } private static void test(byte[] bytes) throws IOException { List<Stringify> tests = Arrays.asList( new ApacheStringWriter(), new ApacheStringWriter2(), new NioStream(), new ScannerReader(), new ScannerReaderNoNextTest(), new GuavaCharStreams(), new StreamApi(), new ParallelStreamApi(), new ByteArrayOutputStreamTest(), new BufferReaderTest(), new BufferedInputStreamVsByteArrayOutputStream(), new InputStreamAndStringBuilder(), new Java9ISTransferTo(), new Java9ISReadAllBytes() ); String solution = new String(bytes, "UTF-8"); for (Stringify test : tests) { try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) { String s = test.inputStreamToString(inputStream); if (!s.equals(solution)) { log(test.name() + ": Error"); continue; } } long startTime = System.currentTimeMillis(); for (int i = 0; i < 20; i++) { try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) { test.inputStreamToString(inputStream); } } log(test.name() + ": " + (System.currentTimeMillis() - startTime)); } } private static void log(String message) { System.out.println(message); } interface Stringify { String inputStreamToString(InputStream inputStream) throws IOException; default String name() { return this.getClass().getSimpleName(); } } static class ApacheStringWriter implements Stringify { @Override public String inputStreamToString(InputStream inputStream) throws IOException { StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer, UTF_8); return writer.toString(); } } static class ApacheStringWriter2 implements Stringify { @Override public String inputStreamToString(InputStream inputStream) throws IOException { return IOUtils.toString(inputStream, UTF_8); } } static class NioStream implements Stringify { @Override public String inputStreamToString(InputStream in) throws IOException { ReadableByteChannel channel = Channels.newChannel(in); ByteBuffer byteBuffer = ByteBuffer.allocate(1024 * 16); ByteArrayOutputStream bout = new ByteArrayOutputStream(); WritableByteChannel outChannel = Channels.newChannel(bout); while (channel.read(byteBuffer) > 0 || byteBuffer.position() > 0) { byteBuffer.flip(); //make buffer ready for write outChannel.write(byteBuffer); byteBuffer.compact(); //make buffer ready for reading } channel.close(); outChannel.close(); return bout.toString(UTF_8); } } static class ScannerReader implements Stringify { @Override public String inputStreamToString(InputStream is) throws IOException { java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; } } static class ScannerReaderNoNextTest implements Stringify { @Override public String inputStreamToString(InputStream is) throws IOException { java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); return s.next(); } } static class GuavaCharStreams implements Stringify { @Override public String inputStreamToString(InputStream is) throws IOException { return CharStreams.toString(new InputStreamReader( is, UTF_8)); } } static class StreamApi implements Stringify { @Override public String inputStreamToString(InputStream inputStream) throws IOException { return new BufferedReader(new InputStreamReader(inputStream)) .lines().collect(Collectors.joining("\n")); } } static class ParallelStreamApi implements Stringify { @Override public String inputStreamToString(InputStream inputStream) throws IOException { return new BufferedReader(new InputStreamReader(inputStream)).lines() .parallel().collect(Collectors.joining("\n")); } } static class ByteArrayOutputStreamTest implements Stringify { @Override public String inputStreamToString(InputStream inputStream) throws IOException { try(ByteArrayOutputStream result = new ByteArrayOutputStream()) { byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { result.write(buffer, 0, length); } return result.toString(UTF_8); } } } static class BufferReaderTest implements Stringify { @Override public String inputStreamToString(InputStream inputStream) throws IOException { String newLine = System.getProperty("line.separator"); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder result = new StringBuilder(UTF_8); String line; boolean flag = false; while ((line = reader.readLine()) != null) { result.append(flag ? newLine : "").append(line); flag = true; } return result.toString(); } } static class BufferedInputStreamVsByteArrayOutputStream implements Stringify { @Override public String inputStreamToString(InputStream inputStream) throws IOException { BufferedInputStream bis = new BufferedInputStream(inputStream); ByteArrayOutputStream buf = new ByteArrayOutputStream(); int result = bis.read(); while (result != -1) { buf.write((byte) result); result = bis.read(); } return buf.toString(UTF_8); } } static class InputStreamAndStringBuilder implements Stringify { @Override public String inputStreamToString(InputStream inputStream) throws IOException { int ch; StringBuilder sb = new StringBuilder(UTF_8); while ((ch = inputStream.read()) != -1) sb.append((char) ch); return sb.toString(); } } static class Java9ISTransferTo implements Stringify { @Override public String inputStreamToString(InputStream inputStream) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); inputStream.transferTo(bos); return bos.toString(UTF_8); } } static class Java9ISReadAllBytes implements Stringify { @Override public String inputStreamToString(InputStream inputStream) throws IOException { return new String(inputStream.readAllBytes(), UTF_8); } } } 
28
14 февр. 14 fevralda İlya Gazman tərəfindən cavab. 2018-02-14 00:30 '18 'də 0:30' da 2018-02-14 00:30 'da

Mən bir neçə dəfə test keçirdim, çünki hər zaman vacibdir.

Cavabımı String 3-də müxtəlif yollarla əldə etməyə çalışdım. (aşağıda göstərilən)
Mən oxumaq üçün blokları cəhd edin.

Kontekst vermək üçün, bu, hər üç yanaşmanın əvvəlki kodudur:

  String response; String url = "www.blah.com/path?key=value"; GetMethod method = new GetMethod(url); int status = client.executeMethod(method); 

1)

  response = method.getResponseBodyAsString(); 

2)

 InputStream resp = method.getResponseBodyAsStream(); InputStreamReader is=new InputStreamReader(resp); BufferedReader br=new BufferedReader(is); String read = null; StringBuffer sb = new StringBuffer(); while((read = br.readLine()) != null) { sb.append(read); } response = sb.toString(); 

3)

 InputStream iStream = method.getResponseBodyAsStream(); StringWriter writer = new StringWriter(); IOUtils.copy(iStream, writer, "UTF-8"); response = writer.toString(); 

Beləliklə, eyni sorğu / cavab məlumatları ilə hər bir yanaşma üçün 500 test aparıldıqdan sonra ədədlərdir. Bir daha, bu mənim nəticələrimdir və nəticələriniz tam olaraq eyni olmaya bilər, amma bu yanaşmaların effektivliyindən fərqli olaraq başqalarına birbaşa rəhbərlik vermək üçün yazdım.

Rütbələr:
1 yanaşma
Yaklaşım # 3 - # 1-dən daha yavaş 2.6%
Yaklaşım # 2 - 4.3% 1 daha yavaş

Bu yanaşmaların hər ikisi cavab alması və ondan bir simli yaratmaq üçün müvafiq həlldir.

28
12 окт. 12 oktyabrda Brett Holt tərəfindən verilən cavab 2011-10-12 20:23 '11 də 20:23 'də 2011-10-12 20:23

Stream s istifadə edərək təmiz Java həll, Java 8 ilə işləyir.

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.stream.Collectors; // ... public static String inputStreamToString(InputStream is) throws IOException { try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) { return br.lines().collect(Collectors.joining(System.lineSeparator())); } } 

Aşağıdakı Kristoffer Hammarstromun başqa bir cavabında qeyd etdiyimiz kimi, şifrəni açıq şəkildə ifadə etmək daha təhlükəsizdir. Yəni InputStreamReader qurucusu aşağıdakı kimi dəyişdirilə bilər:

 new InputStreamReader(is, Charset.forName("UTF-8")) 
27
26 февр. cavab verildi czerny 26 fevral. 2015-02-26 21:39 '15 'da 21:39' de, 2015-02-26 21:39

Sampat, təmizlənmiş bit və bir funksiya kimi təqdim edilən çox və ya az cavab:

 String streamToString(InputStream in) throws IOException { StringBuilder out = new StringBuilder(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); for(String line = br.readLine(); line != null; line = br.readLine()) out.append(line); br.close(); return out.toString(); } 
22
30 марта '12 в 22:52 2012-03-30 22:52 Cavab TKH tərəfindən 30 Mart 2012 tarixində saat 22 : 52- də verilir. 2012-03-30 22:52

Sərgüzəşt hiss etsəniz, Scala və Java-nı qarışdıraraq, sona çatdıra bilərsiniz:

 scala.io.Source.fromInputStream(is).mkString("") 

Java və Scala kodu və kitabxanalarının qarışdırılması üstünlüklərə malikdir.

Burada tam təsvirə baxın: Bir InputStream-i Scala-da bir simliya çevirmək idiomatik bir yol

21
07 марта '12 в 10:32 2012-03-07 10:32 cavab 07 mart '12 'də saat 10 : 32-də Jack tərəfindən verilir

Commons IO'yu (FileUtils / IOUtils / CopyUtils) istifadə edə bilmirsinizsə, xəttə bir fayl xəttini oxumaq üçün BufferedReader istifadə nümunəsidir:

 public class StringFromFile { public static void main(String[] args)  { InputStream is = StringFromFile.class.getResourceAsStream("file.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(is)); final int CHARS_PER_PAGE = 5000; //counting spaces StringBuilder builder = new StringBuilder(CHARS_PER_PAGE); try { for(String line=br.readLine(); line!=null; line=br.readLine()) { builder.append(line); builder.append('\n'); } } catch (IOException ignore) { } String text = builder.toString(); System.out.println(text); } } 

Və ya, bir kobud sürət ehtiyac varsa, Mən Paul De Vries təklif (bir StringBuffer içərisində istifadə edən bir StringWriter istifadə qarşısını) təklif bir variant təklif:

 public class StringFromFileFast { public static void main(String[] args)  { InputStream is = StringFromFileFast.class.getResourceAsStream("file.txt"); InputStreamReader input = new InputStreamReader(is); final int CHARS_PER_PAGE = 5000; //counting spaces final char[] buffer = new char[CHARS_PER_PAGE]; StringBuilder output = new StringBuilder(CHARS_PER_PAGE); try { for(int read = input.read(buffer, 0, buffer.length); read != -1; read = input.read(buffer, 0, buffer.length)) { output.append(buffer, 0, read); } } catch (IOException ignore) { } String text = output.toString(); System.out.println(text); } } 
18
18 мая '10 в 15:57 2010-05-18 15:57 Cavab DJDaveMark tərəfindən 18 may 10-da saat 15 : 57-da verilir. 2010-05-18 15:57

Bu apache proqramına sahib olmaq istəyənlər üçün, org.apache.commons.io.IOUtils mənbə org.apache.commons.io.IOUtils uyğunlaşdırılmış cavabdır, lakin bütün kitabxananı istəmirəm.

 private static final int BUFFER_SIZE = 4 * 1024; public static String inputStreamToString(InputStream inputStream, String charsetName) throws IOException { StringBuilder builder = new StringBuilder(); InputStreamReader reader = new InputStreamReader(inputStream, charsetName); char[] buffer = new char[BUFFER_SIZE]; int length; while ((length = reader.read(buffer)) != -1) { builder.append(buffer, 0, length); } return builder.toString(); } 
17
03 авг. Cavab 03 saylı kodda Dreaming verilir . 2014-08-03 12:47 '14 at 12:47 2014-08-03 12:47

Stream Oxucular istifadə edirsinizsə sonunda axınları bağlamaq üçün əmin olun.

 private String readStream(InputStream iStream) throws IOException { //build a Stream Reader, it can read char by char InputStreamReader iStreamReader = new InputStreamReader(iStream); //build a buffered Reader, so that i can read whole line at once BufferedReader bReader = new BufferedReader(iStreamReader); String line = null; StringBuilder builder = new StringBuilder(); while((line = bReader.readLine()) != null) { //Read till end builder.append(line); builder.append("\n"); // append new line to preserve lines } bReader.close(); //close all opened stuff iStreamReader.close(); //iStream.close(); //EDIT: Let the creator of the stream close it! // some readers may auto close the inner stream return builder.toString(); } 

EDIT: JDK 7+-də, siz-ilə-resursları qurmaq istifadə edə bilərsiniz.

  private String readStream(InputStream iStream) throws IOException { //Buffered reader allows us to read line by line try (BufferedReader bReader = new BufferedReader(new InputStreamReader(iStream))){ StringBuilder builder = new StringBuilder(); String line; while((line = bReader.readLine()) != null) { //Read till end builder.append(line); builder.append("\n"); // append new line to preserve lines } return builder.toString(); } } 
16
17 нояб. Cavab Thamme Gowda tərəfindən verilir . 2012-11-17 15:39 '12 at 3:39 pm 2012-11-17 15:39

Üçüncü tərəf kitabxanasını istifadə etmədən bir InputStream ə InputStream tam metodudur. StringBuilder istifadə tək bir işıqlı mühit üçün, əks halda StringBuffer istifadə edin.

 public static String getString( InputStream is) throws IOException { int ch; StringBuilder sb = new StringBuilder(); while((ch = is.read()) != -1) sb.append((char)ch); return sb.toString(); } 
15
09 апр. laksys 09 apr tərəfindən verilmiş cavab . 2014-04-09 13:37 '14 da 13:37 2014-04-09 13:37

Здесь, как это сделать, используя только JDK с использованием буферов массива байтов. На самом деле все методы commons-io IOUtils.copy() работают. Вы можете заменить byte[] на char[] , если вы копируете из Reader вместо InputStream .

 import java.io.ByteArrayOutputStream; import java.io.InputStream; ... InputStream is = .... ByteArrayOutputStream baos = new ByteArrayOutputStream(8192); byte[] buffer = new byte[8192]; int count = 0; try { while ((count = is.read(buffer)) != -1) { baos.write(buffer, 0, count); } } finally { try { is.close(); } catch (Exception ignore) { } } String charset = "UTF-8"; String inputStreamAsString = baos.toString(charset); 
14
ответ дан Matt Shannon 02 нояб. '12 в 15:37 2012-11-02 15:37

Другой, для всех пользователей Spring:

12
ответ дан James 29 июля '16 в 23:58 2016-07-29 23:58

Используйте java.io.InputStream.transferTo(OutputStream) , поддерживаемый в Java 9 и ByteArrayOutputStream.toString(String) , который берет имя кодировки:

 public static String gobble(InputStream in, String charsetName) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); in.transferTo(bos); return bos.toString(charsetName); } 
12
ответ дан jmehrens 28 янв. '16 в 18:55 2016-01-28 18:55

Пользователи Kotlin просто делают:

 println(InputStreamReader(is).readText()) 

тогда как

 readText() 

- встроенный метод расширения стандартной библиотеки Kotlin.

11
ответ дан Alex 04 февр. '15 в 4:12 2015-02-04 04:12

Это хорошо, потому что:

  • Безопасность рук в кодировке.
  • Вы управляете размером буфера чтения.
  • Вы можете указать длину построителя и не точно.
  • Свободен от зависимостей библиотек.
  • Является ли для Java 7 или выше.

Что для?

 public static String convertStreamToString(InputStream is) { if (is == null) return null; StringBuilder sb = new StringBuilder(2048); // Define a size if you have an idea of it. char[] read = new char[128]; // Your buffer size. try (InputStreamReader ir = new InputStreamReader(is, StandardCharsets.UTF_8)) { for (int i; -1 != (i = ir.read(read)); sb.append(read, 0, i)); } catch (Throwable t) {} return sb.toString(); } 
9
ответ дан Daniel De León 08 июня '14 в 10:46 2014-06-08 10:46

Самый простой способ в JDK состоит в следующем: snipplets кода.

 String convertToString(InputStream in){ String resource = new Scanner(in).useDelimiter("\\Z").next(); return resource; } 
7
ответ дан Raghu K Nair 09 авг. '16 в 23:18 2016-08-09 23:18

Здесь мое решение Java 8 , которое использует новый Stream API для сбора всех строк из InputStream :

 public static String toString(InputStream inputStream) { BufferedReader reader = new BufferedReader( new InputStreamReader(inputStream)); return reader.lines().collect(Collectors.joining( System.getProperty("line.separator"))); } 
6
ответ дан Christian Rädel 02 сент. '15 в 14:19 2015-09-02 14:19

С точки зрения reduce и concat это может быть выражено в Java 8 как:

 String fromFile = new BufferedReader(new InputStreamReader(inputStream)).lines().reduce(String::concat).get(); 
5
ответ дан libnull-dev 21 янв. '16 в 17:28 2016-01-21 17:28

В Groovy

 inputStream.getText() 
5
ответ дан Snekse 26 янв. '17 в 22:40 2017-01-26 22:40
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос