Java InputStream u niz

1. Pregled

U ovom uputstvu ćemo pogledati kako pretvoriti InputStream na žicu, koristeći Guavu, biblioteku Apache Commons IO i običnu Javu.

Ovaj je članak dio serije "Java - Povratak na osnovno" ovdje na Baeldungu.

2. Konverzija s Guavom

Počnimo s primjerom Guave - iskorištavanjem ByteSource funkcionalnost:

@Test javna praznina givenUsingGuava_whenConvertingAnInputStreamToAString_thenCorrect () baca IOException {String originalString = randomAlphabetic (8); InputStream inputStream = novi ByteArrayInputStream (originalString.getBytes ()); ByteSource byteSource = new ByteSource () {@Override public InputStream openStream () baca IOException {return inputStream; }}; Tekst niza = byteSource.asCharSource (Charsets.UTF_8) .read (); assertThat (text, jednakTo (originalString)); }

Krenimo preko koraka:

  • prvi - zamotamo svoje InputStream a ByteSource - i koliko mi je poznato, ovo je najlakši način za to
  • zatim - gledamo svoje ByteSource kao CharSource s UTF8 znakom.
  • konačno - koristimo CharSource čitati ga kao Niz.

A jednostavniji način pretvorbe s Guavom, ali tok treba izričito zatvoriti; srećom, za to se jednostavno možemo poslužiti sintaksom try-with-resources:

@Test javna praznina givenUsingGuavaAndJava7_whenConvertingAnInputStreamToAString_thenCorrect () baca IOException {String originalString = randomAlphabetic (8); InputStream inputStream = novi ByteArrayInputStream (originalString.getBytes ()); Tekst niza = null; probajte (Reader čitač = novi InputStreamReader (inputStream)) {text = CharStreams.toString (čitač); } assertThat (text, jednakTo (originalString)); }

3. Pretvorba s Apache Commons IO

Pogledajmo sada kako to učiniti s bibliotekom Commons IO.

Ovdje je važno upozorenje da - za razliku od Guave - niti jedan od ovih primjera neće zatvoriti InputStream - zbog čega osobno više volim rješenje Guava.

@Test javna praznina givenUsingCommonsIo_whenConvertingAnInputStreamToAString_thenCorrect () baca IOException {String originalString = randomAlphabetic (8); InputStream inputStream = novi ByteArrayInputStream (originalString.getBytes ()); Tekst niza = IOUtils.toString (inputStream, StandardCharsets.UTF_8.name ()); assertThat (text, jednakTo (originalString)); }

Također možemo koristiti i StringWriter za pretvorbu:

@Test javna praznina givenUsingCommonsIoWithCopy_whenConvertingAnInputStreamToAString_thenCorrect () baca IOException {String originalString = randomAlphabetic (8); InputStream inputStream = novi ByteArrayInputStream (originalString.getBytes ()); StringWriter Writer = novi StringWriter (); Kodiranje niza = StandardCharsets.UTF_8.name (); IOUtils.copy (inputStream, zapisnik, kodiranje); assertThat (writer.toString (), jednakTo (originalString)); }

4. Konvertiranje s Javom - InputStream

Pogledajmo sada pristup niže razine koji koristi običnu Javu - an InputStream i jednostavan StringBuilder:

@Test javna praznina givenUsingJava5_whenConvertingAnInputStreamToAString_thenCorrect () baca IOException {String originalString = randomAlphabetic (DEFAULT_SIZE); InputStream inputStream = novi ByteArrayInputStream (originalString.getBytes ()); StringBuilder textBuilder = novi StringBuilder (); probajte (Reader čitač = novi BufferedReader (novi InputStreamReader (inputStream, Charset.forName (StandardCharsets.UTF_8.name ())))) {int c = 0; while ((c = reader.read ())! = -1) {textBuilder.append ((char) c); }} assertEquals (textBuilder.toString (), originalString); }

4.1. Korištenje Jave 8

Java 8 donosi novi linije () metoda za BufferedReader. Pogledajmo kako to možemo iskoristiti za pretvaranje InputStream do a Niz:

@Test javna praznina givenUsingJava8_whenConvertingAnInputStreamToAString_thenCorrect () {String originalString = randomAlphabetic (DEFAULT_SIZE); InputStream inputStream = novi ByteArrayInputStream (originalString.getBytes ()); Tekst niza = novi BufferedReader (novi InputStreamReader (inputStream, StandardCharsets.UTF_8))) .lines () .collect (Collectors.joining ("\ n")); assertThat (text, jednakTo (originalString)); }

Važno je to spomenuti linije () koristi readLine () metoda ispod haube. readLine () pretpostavlja da je linija završena bilo kojim od dodavanja linije ("\ n"), povratom kočije ("\ r") ili povratom kočije nakon čega odmah slijedi uvlačenje linije. Drugim riječima, podržava sve zajedničko Kraj retka stilovi - Unix, Windows, pa čak i stari Mac OS.

S druge strane, kad koristimo Kolekcionari.joining (), moramo izričito odlučiti koju vrstu EOL-a želimo koristiti za stvoreno Niz.

Također bismo mogli koristiti Collectors.joining (System.lineSeparator ()), u tom slučaju izlaz ovisi o postavkama sustava.

5. Konvertiranje s Javom i a Skener

Dalje - pogledajmo običan primjer Jave - koristeći standardni tekst Skener:

@Test javna praznina givenUsingJava7_whenConvertingAnInputStreamToAString_thenCorrect () baca IOException {String originalString = randomAlphabetic (8); InputStream inputStream = novi ByteArrayInputStream (originalString.getBytes ()); Tekst niza = null; probajte (Scanner scanner = novi Scanner (inputStream, StandardCharsets.UTF_8.name ())) {text = scanner.useDelimiter ("\ A"). next (); } assertThat (text, jednakTo (originalString)); }

Imajte na umu da InputStream bit će zatvoreno zatvaranjem Skener.

Također vrijedi razjasniti što useDelimiter (“\ A”) čini. Ovdje smo prošli '\ A' koji je granični regularni izraz koji označava početak unosa. U osnovi, to znači da Sljedeći() poziv čita čitav ulazni tok.

Jedini razlog zašto je ovo primjer Java 7, a ne Java 5, jest upotreba pokušajte s resursima izjava - pretvaranje toga u standard probaj-napokon blok izvrsno će se kompajlirati s Javom 5.

6. Pretvaranje pomoću ByteArrayOutputStream

Na kraju, pogledajmo još jedan običan Java primjer, ovaj put koristeći ByteArrayOutputStream razred:

@Test javna praznina givenUsingPlainJava_whenConvertingAnInputStreamToString_thenCorrect () baca IOException {String originalString = randomAlphabetic (8); InputStream inputStream = novi ByteArrayInputStream (originalString.getBytes ()); ByteArrayOutputStream buffer = novi ByteArrayOutputStream (); int nRead; bajt [] podaci = novi bajt [1024]; while ((nRead = inputStream.read (data, 0, data.length))! = -1) {buffer.write (data, 0, nRead); } buffer.flush (); byte [] byteArray = buffer.toByteArray (); Tekst niza = novi String (byteArray, StandardCharsets.UTF_8); assertThat (text, jednakTo (originalString)); }

U ovom primjeru, prvo, InputStream pretvara se u ByteArrayOutputStream čitanjem i pisanjem bajt blokova, a zatim Izlazni tok transformira se u bajtni niz koji se koristi za stvaranje a Niz.

7. Pretvaranje sa java.nio

Drugo rješenje je kopiranje sadržaja InputStream u datoteku, a zatim pretvorite ovo u Niz:

@Test javna praznina givenUsingTempFile_whenConvertingAnInputStreamToAString_thenCorrect () baca IOException {String originalString = randomAlphabetic (DEFAULT_SIZE); InputStream inputStream = novi ByteArrayInputStream (originalString.getBytes ()); Put tempFile = Files.createTempDirectory (""). Razrješenje (UUID.randomUUID (). ToString () + ".tmp"); Files.copy (inputStream, tempFile, StandardCopyOption.REPLACE_EXISTING); Rezultat niza = novi niz (Files.readAllBytes (tempFile)); assertThat (rezultat, jednakTo (originalString)); }

Ovdje koristimo java.nio.file.File klase za stvaranje privremene datoteke, kao i kopiranje sadržaja datoteke InputStream u datoteku. Zatim se ista klasa koristi za pretvaranje sadržaja datoteke u Niz s readAllBytes () metoda.

8. Zaključak

Nakon što sam sastavio najbolji način za jednostavnu pretvorbu - InputStream u String - na ispravan i čitljiv način - i nakon što sam vidio toliko divlje različitih odgovora i rješenja - mislim da za to se traži jasna i sažeta najbolja praksa.

Implementacija svih ovih primjera i isječaka koda može se naći na GitHubu - ovo je projekt zasnovan na Mavenu, pa bi ga trebalo biti lako uvesti i pokrenuti kakav jest.


$config[zx-auto] not found$config[zx-overlay] not found