Kaip perskaityti / konvertuoti InputStream į eilutę Java?

Jei turite objektą „ java.io.InputStream , kaip turėtumėte tvarkyti šį objektą ir sukurti String ?


Tarkime, turiu „ InputStream , turintį tekstinius duomenis, ir noriu ją konvertuoti į String , todėl, pavyzdžiui, galiu jį įrašyti į žurnalo failą.

Kas yra paprasčiausias būdas įvesti InputStream ir konvertuoti jį į String ?

 public String convertStreamToString(InputStream is) { // ??? } 
3483
21 нояб. nustatė Johnny Maelstrom lapkritis 21 2008-11-21 19:47 '08 at 7:47 pm 2008-11-21 19:47
@ 58 atsakymai
  • 1
  • 2

Geras būdas tai padaryti yra naudoti „ Apache commons IOUtils kad kopijuotumėte InputStream į StringWriter ... kažką panašaus į

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

ar netgi

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

Be to, galite naudoti „ ByteArrayOutputStream jei nenorite sumaišyti savo srautų ir rašytojų.

2197
21 нояб. atsakymas buvo pateiktas Hario Limei lapkričio 21 d. 2008-11-21 19:54 '08, 19:54, 2008-11-21 19:54

Čia galite naudoti tik standartinę „Java“ biblioteką (atkreipkite dėmesį, kad srautas nėra uždarytas, jūsų rida gali skirtis).

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

Su šia gudrybė sužinojau iš straipsnio „Gudrybės su skaitytuvu“. Tai veikia, nes skaitytuvas iteruoja virš srautų žetonų, tokiu atveju mes padalijame žetonus naudodami „įvesties ribos pradžią“ (A), kuris suteikia mums tik vieną simbolį visam srauto turiniui.

border=0

Pastaba: jei reikia įvesti konkretų įvesties srauto kodavimą, galite pateikti antrąjį argumentą „ Scanner konstruktoriui, kuris nurodo, kokį simbolių rinkinį naudoti (pvz., „UTF-8“).

Kepurė taip pat patenka į Jokūbą , kuris vieną kartą paminėjo minėtą straipsnį.

2170
26 марта '11 в 23:40 2011-03-26 23:40 atsakymas duotas Pavel Repin kovo 26 d. 11 val. 23:40 2011-03-26 23:40

Apibendrinant kitus atsakymus, radau 11 pagrindinių būdų tai padaryti (žr. Toliau). Ir parašiau kai kuriuos našumo testus (žr. Toliau pateiktus rezultatus):

InputStream konvertavimo į eilutę metodai:

  1. Naudojant IOUtils.toString (Apache Utils)

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

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

     Scanner s = new Scanner(inputStream).useDelimiter("\\A"); String result = s.hasNext() ? s.next() : ""; 
  4. Naudojant „ Stream“ API („Java 8“). Įspėjimas Šis sprendimas konvertuoja įvairias linijų pertraukas (pavyzdžiui, \r\n ) į.

     String result = new BufferedReader(new InputStreamReader(inputStream)) .lines().collect(Collectors.joining("\n")); 
  5. Naudojant lygiagrečią srauto API („Java 8“). Įspėjimas Šis sprendimas konvertuoja įvairias linijų pertraukas (pavyzdžiui, \r\n ) į.

     String result = new BufferedReader(new InputStreamReader(inputStream)).lines() .parallel().collect(Collectors.joining("\n")); 
  6. InputStreamReader ir „ StringBuilder (JDK) naudojimas

     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. StringWriter ir IOUtils.copy (Apache Commons) naudojimas

     StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer, "UTF-8"); return writer.toString(); 
  8. ByteArrayOutputStream ir „ inputStream.read (JDK) naudojimas

     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. Naudokite „ BufferedReader (JDK). Įspėjimas Šis sprendimas konvertuoja įvairias linijų pertraukas (pvz., \n\r ) į sistemos nuosavybės line.separator (pvz., „Windows“ - „r“).

     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. Naudojant „ BufferedInputStream ir „ 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 return buf.toString("UTF-8"); 
  11. Naudokite inputStream.read() ir StringBuilder (JDK). Įspėjimas Šis sprendimas turi problemų su „Unicode“, pavyzdžiui, su rusų kalba (jis veikia teisingai tik su tekstu, kuris skiriasi nuo Unicode)

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

Įspėjimas :

  1. 4, 5 ir 9 sprendimai konvertuoja skirtingas linijas į vieną.

  2. 11 sprendimas negali tinkamai veikti su Unicode tekstu.

Veikimo bandymai

Mažos String našumo testai (ilgis = 175), URL į github (režimas = vidutinis laikas, sistema = Linux, rezultatas 1,343 yra geriausias):

github (režimas = vidutinis laikas, sistema = Linux, rezultatas 200 715 yra geriausias): 

1910 m
17 февр. Atsakymą pateikė Viacheslav Vedenin , vasario 17 d. 2016-02-17 03:58 '16 at 3:58 2016-02-17 03:58

„Apache Commons“ leidžia:

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

Žinoma, galite pasirinkti kitus simbolių koduotes nei UTF-8.

Taip pat žiūrėkite: ( dokumentacija )

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

Atsižvelgiant į failą, pirmiausia turite gauti java.io.Reader egzempliorių. Tada galite jį perskaityti ir pridėti prie „ StringBuilder (mums nereikia StringBuffer jei nesinaudosime keliomis StringBuilder ir „ StringBuilder yra greitesnis). Čia apgauti yra tai, kad mes dirbame blokais ir tokiu būdu nereikia kitų buferinių srautų. Bloko dydis yra parametruojamas, siekiant optimizuoti našumą veikimo metu.

 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 нояб. Pauliaus Vriezės atsakymas lapkričio 21 d 2008-11-21 21:34 '08 at 9:34 pm 2008-11-21 21:34

Naudoti:

 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 авг. atsakymas, kurį pateikė sampathpremarathna 04 rug . 2011-08-04 11:29 '11, 11:29, 2011-08-04 11:29

Jei naudojate „Google“ kolekcijas / Guava, galite atlikti šiuos veiksmus:

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

Atkreipkite dėmesį, kad antrasis parametras (t.y. „Charsets.UTF_8“) nereikalingas „ InputStreamReader , tačiau paprastai rekomenduojama nurodyti koduotę, jei žinote (ką reikia!)

158
13 июля '10 в 18:56 2010-07-13 18:56 atsakymą pateikė „ Sakuraba “ liepos 10 d., 10 val. 18:56 2010-07-13 18:56

Tai mano „Java“ ir „Android“ švarus sprendimas ir jis veikia gerai ...

 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 atsakymas suteiktas TacB0sS 08 gegužės 12 d. 23:24 2012-05-08 23:24

Naudoti:

 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 Atsakymą davė Jon Moore birželio 11 d., 09:07 2009-06-11 00:07

Čia yra labiausiai elegantiškas, grynas „Java“ (be bibliotekos) sprendimas, kurį atėjau po kai kurių eksperimentų:

 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 янв. Atsakymą pateikė Drew Noakes Jan 01 2013-01-01 06:43 '13, 6:43, 2013-01-01 06:43

Dėl išsamumo čia yra „ Java 9“ sprendimas :

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

readAllBytes šiuo metu yra pagrindinėje JDK 9 duomenų bazėje, todėl jis gali būti rodomas spaudoje. Dabar galite išbandyti JDK 9 momentinius vaizdus .

46
02 сент. Atsakymas pateikiamas Tagir Valeev 02 Sep. 2015-09-02 14:50 '15 - 14:50 2015-09-02 14:50

Norėčiau naudoti keletą „Java 8“ triukų.

 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. } } 

Iš esmės tas pats, kaip ir kiti atsakymai be glaustesnių atsakymų.

35
17 июля '14 в 20:58 2014-07-17 20:58 atsakymą Simonas Kuangas pateikė liepos 17 d. 14 val. 20:58 2014-07-17 20:58

Aš patikrinau čia 14 skirtingų atsakymų (atsiprašau, nesuteikiau paskolų, bet yra per daug dublikatų).

Rezultatas yra labai nuostabus. Pasirodo, kad „Apache IOUtils“ yra lėčiausias, o „ ByteArrayOutputStream yra greičiausias sprendimas:

Taigi, pirma, tai yra geriausias būdas:

 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); } } 

Bandymo rezultatai 20 MB atsitiktinių baitų 20 ciklų

Laikas milisekundėmis

  • ByteArrayOutputStreamTest: 194
  • NioStream: 198
  • Java9ISTransferTo: 201
  • Java9ISReadAllBytes: 205
  • BufferedInputStreamVsByteArrayOutputStream: 314
  • ApacheStringWriter2: 574
  • GuavaCharStreams: 589
  • ScannerReaderNeKitasTestas: 614
  • ScannerReader: 633
  • ApacheStringWriter: 1544
  • StreamApi: klaida
  • ParallelStreamApi: klaida
  • „BufferReaderTest“: klaida
  • InputStreamAndStringBuilder: klaida

Bandymo šaltinio kodas

 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 февр. Ilya Gazman atsakymas vasario 14 d. 2018-02-14 00:30 '18 - 0:30 2018-02-14 00:30

Aš praleidau keletą laiko testų, nes laiko reikalas, visada.

Bandžiau gauti atsakymą 3 eilutėje įvairiais būdais. (parodyta žemiau)
Aš palikau pabandyti / sugauti blokus skaitymui.

Norint pateikti kontekstą, tai yra ankstesnis visų trijų metodų kodas:

  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(); 

Taigi, atlikus 500 testų kiekvienam metodui su tais pačiais užklausų / atsakymų duomenimis, čia yra numeriai. Vėlgi, tai yra mano išvados, o jūsų rezultatai gali būti ne tokie patys, bet parašiau tai, kad pateikčiau keletą rekomendacijų kitiems dėl šių metodų veiksmingumo skirtumų.

Reitingai:
1 metodas
3 metodas - 2,6% lėčiau nei # 1
2 metodas - 4,3% lėčiau nei # 1

Bet kuris iš šių metodų yra tinkamas sprendimas, kaip užfiksuoti atsakymą ir sukurti iš jo eilutę.

28
12 окт. Breto Holto atsakymas spalio 12 d 2011-10-12 20:23 '11 prie 20:23 2011-10-12 20:23

Grynas „Java“ sprendimas naudojant „ Stream“ s, veikia su „Java 8“.

 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())); } } 

Kaip paminėjo Kristoffer Hammarstrom toliau kitame atsakyme, saugiau aiškiai nurodyti kodavimą . Ty InputStreamReader konstruktorių galima pakeisti taip:

 new InputStreamReader(is, Charset.forName("UTF-8")) 
27
26 февр. atsakymas duotas czerny 26 vasaris 2015-02-26 21:39 '15, 21:39, 2015-02-26 21:39

Čia yra daugiau ar mažiau atsako į sampatą, išvalytą bitą ir pateiktą kaip funkciją:

 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 atsakymą TKH pateikė kovo 30 d. 12 d. 10:52 val. 2012-03-30 22:52

Jei pajutote drąsus, galite maišyti „Scala“ ir „Java“ ir baigti:

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

„Java“ ir „Scala“ kodų ir bibliotekų maišymas turi privalumų.

Žr. Visą aprašymą čia: Idiomatinis būdas konvertuoti InputStream į eilutę Scala

21
07 марта '12 в 10:32 2012-03-07 10:32 atsakymą pateikė Jack 07 kovo 12 d. 10:32 2012-03-07 10:32

Jei negalite naudoti „Commons IO“ („FileUtils“ / „IOUtils“ / „CopyUtils“), čia pateikiamas pavyzdys, kaip naudoti „BufferedReader“ failo eilutės eilutei skaityti:

 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); } } 

Arba, jei jums reikia apvalaus greičio, siūlau tai, ką pasiūlė Paulas de Vriesas (kuris vengia naudoti StringWriter (kuris naudoja viduje StringBuffer):

 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 Atsakymą DJDaveMark teikia gegužės 18 d. 10 val. 15:57 2010-05-18 15:57

Tai yra atsakymas, pritaikytas iš org.apache.commons.io.IOUtils šaltinio kodo tiems, kurie nori turėti apache įgyvendinimą, bet nenori visos bibliotekos.

 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 авг. Atsakymas pateikiamas „ Dreaming in Code 03“. 2014-08-03 12:47 '14 at 12:47 2014-08-03 12:47

Jei naudojate srautų skaitytuvus, įsitikinkite, kad pabaigoje uždarysite srautus.

 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+ galite naudoti bandymą su ištekliais.

  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 нояб. Atsakymą pateikė Thamme Gowda lapkričio 17 d. 2012-11-17 15:39 '12, 15:39 pm 2012-11-17 15:39

Вот полный метод преобразования InputStream в String без использования сторонней библиотеки. Используйте StringBuilder для однопоточной среды, иначе используйте StringBuffer .

 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
ответ дан laksys 09 апр. '14 в 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