SpringのStreamUtilsの概要
1. 概要
この記事では、StreamUtilsクラスとその使用方法について説明します。
簡単に言えば、 StreamUtils はSpringのクラスであり、ストリームを処理するためのユーティリティメソッドがいくつか含まれています–パッケージにあるInputStreamとOutputStream ] java .io であり、Java8のStreamAPIとは関係ありません。
2. Mavenの依存関係
StreamUtils クラスはspringコアモジュールで使用できるので、pom.xmlに追加しましょう。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
ライブラリの最新バージョンは、 Maven CentralRepositoryにあります。
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()は、 InputStream 、 OutputStream 、コピーの開始位置、および終了位置の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 、およびの3つのパラメーターを取ります。 Stringのコンテンツをコピーする]OutputStream。
特定の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を引数としてこれらのメソッドに渡して、InputStreamまたはOutputStreamの呼び出しを無視するバリアントを取得できます。 close()メソッド:
public InputStream getNonClosingInputStream() throws IOException {
InputStream in = new FileInputStream("src/test/resources/input.txt");
return StreamUtils.nonClosing(in);
}
5. 結論
このクイックチュートリアルでは、StreamUtilsとは何かを見てきました。 StreamUtils クラスのすべてのメソッドについても説明し、それらの使用方法を確認しました。
このチュートリアルの完全な実装は、GitHubのにあります。