Apache Commons IO memiliki metode kemudahan yang bagus IOUtils.toString () untuk membaca InputStream
ke sebuah String.
Karena saya mencoba beralih dari Apache Commons dan ke Guava : apakah ada padanannya di Guava? Saya melihat semua kelas dalam com.google.common.io
paket dan saya tidak dapat menemukan sesuatu yang sesederhana itu.
Sunting: Saya memahami dan menghargai masalah dengan charsets. Kebetulan saya tahu bahwa semua sumber saya dalam ASCII (ya, ASCII, bukan ANSI dll.), Jadi dalam kasus ini, pengkodean bukan masalah bagi saya.
java
io
inputstream
guava
Sean Patrick Floyd
sumber
sumber
Charsets.US_ASCII
) daripada membiarkan Anda mengatakan "eh, charset apa yang saya kira?" yang bagi banyak orang tampaknya senang melakukannya. Terutama karena Java tidak menggunakan default yang masuk akal, seperti UTF-8.Jawaban:
Anda menyatakan dalam komentar Anda atas jawaban Calum yang akan Anda gunakan
Kode ini bermasalah karena kelebihan beban
CharStreams.toString(Readable)
menyatakan:Ini berarti Anda
InputStreamReader
, dan dengan ekstensi yangInputStream
dikembalikan olehsupplier.get()
, tidak akan ditutup setelah kode ini selesai.Sebaliknya, jika Anda memanfaatkan fakta bahwa Anda tampaknya sudah memiliki
InputSupplier<InputStream>
dan menggunakan kelebihan bebanCharStreams.toString(InputSupplier<R extends Readable & Closeable>
),toString
metode ini akan menangani pembuatan dan penutupanReader
untuk Anda.Ini persis seperti yang disarankan Jon Skeet, kecuali bahwa sebenarnya tidak ada kelebihan beban
CharStreams.newReaderSupplier
yang membutuhkanInputStream
masukan ... Anda harus memberikannyaInputSupplier
:Intinya
InputSupplier
adalah untuk membuat hidup Anda lebih mudah dengan mengizinkan Jambu untuk menangani bagian-bagian yang membutuhkantry-finally
blok jelek untuk memastikan bahwa sumber daya ditutup dengan benar.Sunting: Secara pribadi, saya menemukan yang berikut (begitulah sebenarnya saya menulisnya, baru saja memecah langkah-langkah dalam kode di atas)
menjadi jauh lebih verbose dari ini:
Kurang lebih apa yang harus Anda tulis untuk menangani ini sendiri dengan benar.
Edit: Februari 2014
InputSupplier
danOutputSupplier
dan metode yang menggunakannya sudah tidak digunakan lagi di Guava 16.0. Pengganti merekaByteSource
,CharSource
,ByteSink
danCharSink
. DiberikanByteSource
, Anda sekarang bisa mendapatkan isinyaString
seperti ini:sumber
InputStream
, dan Anda ingin mendapatkannya sebagaiString
,CharStreams.toString(new InputStreamReader(inputStream, charset))
adalah caranya.ByteSource
danCharSource
secara khusus untuk kasus di mana Anda memiliki sesuatu yang dapat bertindak sebagai sumberInputStream
s atauReader
s.Jika Anda punya,
Readable
Anda bisa menggunakanCharStreams.toString(Readable)
. Jadi, Anda mungkin dapat melakukan hal berikut:Memaksa Anda untuk menentukan himpunan karakter, yang menurut saya harus Anda lakukan.
sumber
InputSupplier<InputStream>
saya sangat menyarankan untuk menggunakanCharStreams.newReaderSupplier(supplier, Charsets.UTF_8)
daripadanew InputStreamReader
. Alasannya adalah bahwa ketika diberiInputStreamReader
, tidaktoString
akan menutup itu (dan dengan demikian bukan aliran yang mendasarinya!). Dengan menggunakan for the , metode akan menangani penutupan untuk Anda.Reader
InputSupplier
Reader
toString
Reader
UPDATE : Melihat ke belakang, saya tidak suka solusi lama saya. Selain itu sekarang sudah 2013 dan sekarang ada alternatif yang lebih baik untuk Java7. Jadi inilah yang saya gunakan sekarang:
atau jika dengan InputSupplier
sumber
Hampir. Anda bisa menggunakan sesuatu seperti ini:
Secara pribadi saya tidak berpikir itu
IOUtils.toString(InputStream)
"bagus" - karena selalu menggunakan pengkodean default platform, yang hampir tidak pernah Anda inginkan. Ada kelebihan beban yang mengambil nama penyandian, tetapi menggunakan nama bukanlah ide yang bagus IMO. Itu sebabnya saya sukaCharsets.*
.EDIT: Bukan berarti di atas membutuhkan
InputSupplier<InputStream>
sebagaistreamSupplier
. Jika Anda sudah memiliki streaming, Anda dapat menerapkannya dengan cukup mudah:sumber
Charsets.UTF_8.name()
- lebih tahan kesalahan ketik.Pilihan lainnya adalah membaca byte dari Stream dan membuat String darinya:
Ini bukan Jambu Biji 'murni', tapi sedikit lebih pendek.
sumber
ByteStreams.toByteArray()
tidak menutup aliran, menurut Javadoc.Berdasarkan jawaban yang diterima, berikut adalah metode utilitas yang meniru perilaku
IOUtils.toString()
(dan versi yang kelebihan beban dengan charset, juga). Versi ini seharusnya aman, bukan?sumber
Ada solusi penutupan otomatis yang jauh lebih pendek jika aliran input berasal dari resource classpath:
Menggunakan Sumber Jambu Biji , terinspirasi oleh IOExplained .
sumber
EDIT (2015): Okio adalah abstraksi dan alat terbaik untuk I / O di Java / Android yang saya ketahui. Saya menggunakannya sepanjang waktu.
FWIW inilah yang saya gunakan.
Jika saya sudah memiliki aliran di tangan, maka:
Jika saya membuat aliran:
Sebagai contoh konkret, saya bisa membaca aset file teks Android seperti ini:
sumber
Untuk contoh konkret, berikut ini cara saya membaca aset file teks Android:
sumber