2016-07-12 20 views
2

Ein Teil meiner Anwendung ist ein InputStream gegeben und möchte auf diesem eine Verarbeitung durchführen, um einen anderen InputStream zu erzeugen.Umwandlung eines java.util.stream.Stream <String> in einen java.io.Reader

try (
    final BufferedReader inputReader = new BufferedReader(new InputStreamReader(inputStream, UTF_8), BUFFER_SIZE); 
    final Stream<String> resultLineStream = inputReader.lines().map(lineProcessor::processLine); 
    final InputStream resultStream = new ReaderInputStream(new StringStreamReader(resultLineStream), UTF_8); 
) { 
    s3Client.putObject(targetBucket, s3File, resultStream, new ObjectMetadata()); 
} catch (IOException e) { 
    throw new RuntimeException("Exception", e); 
} 

Ich bin mit dem neuen Java 8 BufferedReader.lines() in einen Stream, auf die ich einfach meine Verarbeitungsfunktion abbilden kann.

Das einzige, was noch fehlt, ist die Klasse StringStreamReader(), die meinen Stream in einen Reader verwandeln soll, aus dem Apache commons-io: ReaderInputStream wieder einen InputStream erzeugen kann. (Der Umweg an die Leser und wieder scheint vernünftig mit Kodierungen und Zeilenumbrüche zu befassen.)

Um sehr klar zu sein, über den Code geht davon aus

public class StringStreamReader extends Reader { 
    public StringStreamReader(Stream<String> stringStream) { ... } 

    @Overwrite 
    public int read(char cbuf[], int off, int len) throws IOException { ... } 

    // possibly overwrite other methods to avoid bad performance or high resource-consumption 
} 

So gibt es eine Bibliothek, die eine solche StringStreamReader Klasse bietet? Oder gibt es eine andere Möglichkeit, den obigen Anwendungscode zu schreiben, ohne eine benutzerdefinierte Reader- oder InputStream-Unterklasse zu implementieren?

+1

Was ist die Frage hier? – Frecklefoot

+0

Ich verstehe nicht. Sie haben bereits Zeichenfolgen, warum brauchen Sie eine andere Zeichencodierung? –

+2

Dies ist wirklich nicht wie 'java.util.stream.Stream' verwendet werden soll. –

Antwort

1

Sie können so etwas tun:

PipedWriter writer = new PipedWriter(); 
    PipedReader reader = new PipedReader(); 
    reader.connect(writer); 

    strings.stream().forEach(string -> { 
     try { 
      writer.write(string); 
      writer.write("\n"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    }); 

Aber ich denke, man irgendeine Form von faulen Verarbeitung wollen. Stream-API hilft in diesem Fall nicht wirklich, Sie benötigen einen dedizierten Thread und einen Puffer, um das zu tun.