Come convertire un Lettore di InputStream e Scrittore di OutputStream?

C’è un modo semplice per evitare di affrontare il testo dei problemi di codifica?

 

12 Replies
  1. 43

    Non si può davvero evitare di affrontare il testo di un problema di codifica, ma ci sono soluzioni esistenti:

    Hai solo bisogno di scegliere la codifica della vostra scelta.

  2. 93

    Se si comincia con una Stringa è possibile, inoltre, effettuare le seguenti operazioni:

    new ByteArrayInputStream(inputString.getBytes("UTF-8"))
    • Questo risolve un problema con la stringa, ma non quello originale
    • Buona ReaderInputStream attuazione richiederebbe meno memoria — non ci dovrebbe essere bisogno di memorizzare tutti i byte in un array in una sola volta.
    • Mi piace questa soluzione funziona quando si ha bisogno di test delle unità di codice che accetta in ingresso (ad esempio) lo standard input.
  3. 41

    Bene, un Lettore offerte con caratteri e InputStream si occupa di byte. La codifica consente di specificare come si desidera rappresentare il tuo caratteri a byte, così non si può davvero ignorare il problema. Per evitare problemi, il mio parere è: scegliere un set di caratteri (ad esempio, “UTF-8”) e bastone con esso.

    Su come farlo, come è stato sottolineato, “l’ovvio nomi per queste classi sono ReaderInputStream e WriterOutputStream.” Sorprendentemente, “questi non sono inclusi nella libreria Java“, anche se il ‘fronte’ classi, InputStreamReader e OutputStreamWriter sono incluso.

    Così, un sacco di persone sono venuti con le loro implementazioni, tra cui Apache Commons IO. A seconda dei problemi di licenza, si sarà probabilmente in grado di comprendere l’commons-io in libreria nel progetto, o anche copiare una parte del codice sorgente (che è scaricabile qui).

    Come si può vedere, entrambe le classi di documentazione, dichiara che “tutti i charset codifiche supportate da JRE vengono gestiti correttamente”.

    N. B. Un commento su una delle altre risposte qui cita questo bug. Ma che influenza il Apache Ant ReaderInputStream classe (qui), non Apache Commons IO ReaderInputStream classe.

  4. 19

    Anche notare che, se si sta partendo con una Stringa, è possibile saltare la creazione di un StringReader e creare un InputStream in un unico passaggio, grazie org.apache.commons.io.IOUtils da Commons IO in questo modo:

    InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");

    Naturalmente, è ancora necessario pensare la codifica del testo, ma almeno la conversione sta accadendo in un unico passaggio.

    • Questo metodo non ha fondamentalmente new ByteArrayInputStream(report.toString().getBytes("utf-8")), che comporta l’assegnazione di ulteriori due copie della relazione in memoria. Se il rapporto è di grandi dimensioni, non è male. Vedi la mia risposta.
  5. 8

    Uso:

    new CharSequenceInputStream(html, StandardCharsets.UTF_8);

    In questo modo non richiede un anticipo di conversione per String e poi byte[], che assegna molta più memoria heap, nel caso in cui il rapporto è di grandi dimensioni. Si converte in byte al volo, in quanto il flusso è leggere, fin da StringBuffer.

    Utilizza CharSequenceInputStream da Apache Commons IO progetto.

  6. 5

    L’ovvio nomi per queste classi sono ReaderInputStream e WriterOutputStream. Purtroppo questi non sono inclusi nella libreria Java. Tuttavia, google è tuo amico.

    Non sono sicuro che sta andando a ottenere intorno a tutto il testo dei problemi di codifica, che sono da incubo.

    C’è un RFE, ma è Chiuso, non verrà risolto.

    • bugs.openjdk.java.net/browse/JDK-4103785 contiene il commento: “abbiamo una API pubblica per il set di caratteri di codifica … non validi motivi per aggiungere queste classi” – così come si fa in Java 7, senza librerie aggiuntive, dodici anni lungo la strada?
  7. 4

    Stai cercando di scrivere il contenuto di un Reader per un OutputStream? Se è così, avrete un tempo più facile avvolgere il OutputStream in un OutputStreamWriter e scrivere il char dal Reader per il Writer, invece di cercare di convertire il lettore a una InputStream:

    final Writer writer = new BufferedWriter(new OutputStreamWriter( urlConnection.getOutputStream(), "UTF-8" ) );
    int charsRead;
    char[] cbuf = new char[1024];
    while ((charsRead = data.read(cbuf)) != -1) {
        writer.write(cbuf, 0, charsRead);
    }
    writer.flush();
    //don't forget to close the writer in a finally {} block
  8. 1

    Un avviso quando si utilizza WriterOutputStream – non sempre gestire la scrittura di dati binari in un file correttamente il/la stessa di un normale flusso di output. Ho avuto un problema con questo che mi ha preso un po ‘ di tempo per rintracciare.

    Se è possibile, mi consiglia di utilizzare un flusso di output di base, e se avete bisogno di scrivere le stringhe, utilizzare un OUtputStreamWriter wrapper intorno al flusso di farlo. È molto più affidabile di convertire il testo in byte che l’altro senso intorno, che è probabilmente perché WriterOutputStream non è una parte della libreria standard di Java

  9. 0

    Per la Lettura di una stringa in un flusso utilizzando solo ciò che java forniture.

    InputStream s = new BufferedInputStream( new ReaderInputStream( new StringReader("a string")));
    • ReaderInputStream è in Apache Commons IO.

Lascia un commento