Einführung in Spring’s StreamUtils

Einführung in Spring's StreamUtils

1. Überblick

In diesem Artikel sehen wir uns die Klasse vonStreamUtilsan und wie wir sie verwenden können.

Einfach ausgedrückt istStreamUtils eine Spring-Klasse, die einige Dienstprogrammmethoden für den Umgang mit Streams enthält -InputStream undOutputStream, die sich im Paketjava.io befinden und nicht mit den Java 8 verwandt sind Stream-API.

2. Maven-Abhängigkeit

Die KlasseStreamUtils ist im Spring-Core-Modul verfügbar. Fügen wir sie also zu unserenpom.xml hinzu:


    org.springframework
    spring-core
    5.1.4.RELEASE

Die neueste Version der Bibliothek finden Sie unterMaven Central Repository.

3. Streams kopieren

Die KlasseStreamUtils enthält mehrere überladene Methoden mit dem Namencopy() sowie einige andere Variationen:

  • copyRange ()

  • copyToByteArray ()

  • copyString ()

Wir können Streams ohne Bibliotheken kopieren. Der Code wird jedoch umständlich und viel schwerer zu lesen und zu verstehen sein.

Beachten Sie, dass wir der Einfachheit halber das Schließen von Streams weglassen.

Mal sehen, wie wir den Inhalt einesInputStream in ein bestimmtesOutputStream kopieren können:

@Test
public void whenCopyInputStreamToOutputStream_thenCorrect() throws IOException {
    String inputFileName = "src/test/resources/input.txt";
    String outputFileName = "src/test/resources/output.txt";
    File outputFile = new File(outputFileName);
    InputStream in = new FileInputStream(inputFileName);
    OutputStream out = new FileOutputStream(outputFile);

    StreamUtils.copy(in, out);

    assertTrue(outputFile.exists());
    String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName));
    String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName));
    assertEquals(inputFileContent, outputFileContent);
}

Die erstellte Datei enthält den Inhalt derInputStream.

Beachten Sie, dassgetStringFromInputStream() eine Methode ist, dieInputStream nimmt und ihren Inhalt alsString zurückgibt. Die Implementierung der Methode ist in der Vollversion des Codes verfügbar.

Wir müssen nicht den gesamten Inhalt derInputStream kopieren, sondern können einen Bereich des Inhalts mit dercopyRange()-Methode in eine bestimmteOutputStream kopieren:

@Test
public void whenCopyRangeOfInputStreamToOutputStream_thenCorrect() throws IOException {
    String inputFileName = "src/test/resources/input.txt";
    String outputFileName = "src/test/resources/output.txt";
    File outputFile = new File(outputFileName);
    InputStream in = new FileInputStream(inputFileName);
    OutputStream out = new FileOutputStream(outputFileName);

    StreamUtils.copyRange(in, out, 1, 10);

    assertTrue(outputFile.exists());
    String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName));
    String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName));

    assertEquals(inputFileContent.substring(1, 11), outputFileContent);
}

Wie wir hier sehen können, nimmtcopyRange() vier Parameter an,InputStream,OutputStream, die Position, von der aus mit dem Kopieren begonnen werden soll, und die Position, an der das Kopieren beendet werden soll. Was aber, wenn der angegebene Bereich die Länge vonInputStream überschreitet? Die MethodecopyRange() kopiert dann bis zum Ende des Streams.

Mal sehen, wie wir den Inhalt vonString in ein bestimmtesOutputStream kopieren können:

@Test
public void whenCopyStringToOutputStream_thenCorrect() throws IOException {
    String string = "Should be copied to OutputStream.";
    String outputFileName = "src/test/resources/output.txt";
    File outputFile = new File(outputFileName);
    OutputStream out = new FileOutputStream("src/test/resources/output.txt");

    StreamUtils.copy(string, StandardCharsets.UTF_8, out);

    assertTrue(outputFile.exists());

    String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName));

    assertEquals(outputFileContent, string);
}

Die Methodecopy() verwendet drei Parameter - die zu kopierendenString, dieCharset, die zum Schreiben in die Datei verwendet werden sollen, und dieOutputStream, die kopiert werden sollen der Gehalt derString bis.

So können wir den Inhalt eines bestimmtenInputStream in ein neuesString kopieren:

@Test
public void whenCopyInputStreamToString_thenCorrect() throws IOException {
    String inputFileName = "src/test/resources/input.txt";
    InputStream is = new FileInputStream(inputFileName);
    String content = StreamUtils.copyToString(is, StandardCharsets.UTF_8);

    String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName));
    assertEquals(inputFileContent, content);
}

Wir können auch den Inhalt eines bestimmten Byte-Arrays inOutputStream kopieren:

public void whenCopyByteArrayToOutputStream_thenCorrect() throws IOException {
    String outputFileName = "src/test/resources/output.txt";
    String string = "Should be copied to OutputStream.";
    byte[] byteArray = string.getBytes();
    OutputStream out = new FileOutputStream("src/test/resources/output.txt");

    StreamUtils.copy(byteArray, out);

    String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName));

    assertEquals(outputFileContent, string);
}

Oder wir können den Inhalt eines bestimmtenInputStream in ein neues Byte-Array kopieren:

public void whenCopyInputStreamToByteArray_thenCorrect() throws IOException {
    String inputFileName = "src/test/resources/input.txt";
    InputStream is = new FileInputStream(inputFileName);
    byte[] out = StreamUtils.copyToByteArray(is);

    String content = new String(out);
    String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName));

    assertEquals(inputFileContent, content);
}

4. Andere Funktionen

EinInputStream kann als Argument an die Methodedrain() übergeben werden, um alle verbleibenden Daten im Stream zu entfernen:

StreamUtils.drain(in);

Wir können auch die MethodeemptyInput() verwenden, um ein effizientes leeresInputStream zu erhalten:

public InputStream getInputStream() {
    return StreamUtils.emptyInput();
}

Es gibt zwei überladene Methoden mit dem NamennonClosing(). EinInputStream oder einOutputStream kann als Argument an diese Methoden übergeben werden, um eine Variante vonInputStream oderOutputStream zu erhalten, die Aufrufe derclose()-Methode ignoriert:

public InputStream getNonClosingInputStream() throws IOException {
    InputStream in = new FileInputStream("src/test/resources/input.txt");
    return StreamUtils.nonClosing(in);
}

5. Fazit

In diesem kurzen Tutorial haben wir gesehen, wasStreamUtilsind. Wir haben auch alle Methoden derStreamUtils-Klasse behandelt und gesehen, wie wir sie verwenden können.

Die vollständige Implementierung dieses Tutorials finden Sie inover on GitHub.