SpringのStreamUtilsの紹介

SpringのStreamUtilsの概要

1. 概要

この記事では、StreamUtilsクラスとその使用方法について説明します。

簡単に言えば、StreamUtilsは、ストリームを処理するためのいくつかのユーティリティメソッドを含むSpringのクラスです–パッケージjava.ioに存在し、Java 8とは関係のないInputStreamOutputStreamストリームAPI。

2. メーベン依存

StreamUtilsクラスはspring-coreモジュールで使用できるので、pom.xmlに追加しましょう。


    org.springframework
    spring-core
    5.1.4.RELEASE

ライブラリの最新バージョンはMaven Central Repositoryにあります。

3. ストリームのコピー

StreamUtilsクラスには、copy()という名前のオーバーロードされたメソッドと、その他のバリエーションがいくつか含まれています。

  • copyRange()

  • copyToByteArray()

  • copyString()

ライブラリを使用せずにストリームをコピーできます。 ただし、コードは扱いにくくなり、読みやすく、理解しにくくなります。

簡単にするために、ストリームの終了を省略していることに注意してください。

InputStreamのコンテンツを特定のOutputStreamにコピーする方法を見てみましょう。

@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);
}

作成されたファイルには、InputStreamの内容が含まれています。

getStringFromInputStream()は、InputStreamを受け取り、その内容をStringとして返すメソッドであることに注意してください。 メソッドの実装は、コードの完全版で利用可能です。

InputStreamのコンテンツ全体をコピーする必要はありません。copyRange()メソッドを使用して、コンテンツの範囲を特定のOutputStreamにコピーできます。

@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);
}

ここでわかるように、copyRange()は、InputStreamOutputStream、コピーを開始する位置、およびコピーを終了する位置の4つのパラメーターを取ります。 しかし、指定された範囲がInputStreamの長さを超えた場合はどうなりますか? 次に、メソッドcopyRange()は、ストリームの最後までコピーします。

Stringのコンテンツを特定のOutputStreamにコピーする方法を見てみましょう。

@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);
}

メソッドcopy()は、コピーされるString、ファイルへの書き込みに使用するCharset、およびコピーするOutputStreamの3つのパラメーターを取ります。 Stringの内容。

指定されたInputStreamのコンテンツを新しいStringにコピーする方法は次のとおりです。

@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);
}

特定のバイト配列の内容をOutputStreamにコピーすることもできます。

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);
}

または、指定されたInputStreamの内容を新しいバイト配列にコピーできます。

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. その他の機能

InputStreamを引数としてメソッドdrain()に渡して、ストリーム内の残りのすべてのデータを削除できます。

StreamUtils.drain(in);

メソッドemptyInput()を使用して、効率的な空のInputStreamを取得することもできます。

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

nonClosing()という名前の2つのオーバーロードされたメソッドがあります。 InputStreamまたはOutputStreamを引数としてこれらのメソッドに渡して、close()メソッドの呼び出しを無視するInputStreamまたはOutputStreamのバリアントを取得できます。

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

5. 結論

このクイックチュートリアルでは、StreamUtilsが何であるかを見てきました。 また、StreamUtilsクラスのすべてのメソッドについても説明し、それらの使用方法を確認しました。

このチュートリアルの完全な実装はover on GitHubにあります。