Java で InputStream を String に変換するコード解説
Java で InputStream を String に変換する方法
Java では、InputStream はバイト列のストリームであり、直接文字列として扱うことはできません。そのため、InputStream を文字列に変換する際には、いくつかの方法があります。
方法
InputStreamReader と BufferedReader を使う
最も一般的な方法です。
import java.io.*;
public class InputStreamToStringExample {
public static String convertStreamToString(InputStream is) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader reader = new Buf feredReader(new InputStreamReader(is, "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
reader .close();
return sb.toString();
}
}
InputStreamReader
はバイトストリームを文字ストリームに変換します。BufferedReader
は効率的に文字を読み込むためのバッファリングを行います。StringBuilder
は文字列を効率的に構築します。
Apache Commons IO の IOUtils を使う
便利なライブラリを使う方法です。
import org.apache.commons.io.IOUtils;
public class InputStreamToStringExample {
public static String convertStreamToString(InputStream is) throws IOException {
return IOUtils.toString(is, "UTF-8");
}
}
IOUtils.toString
メソッドは InputStream を簡単に String に変換します。
Java 9 以降の InputStream.readAllBytes() を使う
Java 9 以降で使える方法です。
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class InputStreamToStringExample {
public static String convertStreamToString(InputStream is) throws IOException {
return new String(is.readAllBytes(), StandardCharsets.UTF_8);
}
}
注意点
- エンコーディングを指定することが重要です。ここでは UTF-8 を使用していますが、適切なエンコーディングに合わせてください。
- 例外処理を適切に行う必要があります。
選択
どの方法を選ぶかは、プロジェクトの要件や好みによって異なります。Apache Commons IO を使用する場合にはライブラリの依存関係が発生しますが、コードが簡潔になります。Java 9 以降であれば readAllBytes()
がシンプルで使いやすいです。
import java.io.*;
public class InputStreamToStringExample {
public static String convertStreamToString(InputStream is) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader reader = new Buf feredReader(new InputStreamReader(is, "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
reader .close();
return sb.toString();
}
}
- import java.io.*;: 必要となる入出力クラスをインポートします。
- public class InputStreamToStringExample: クラスを定義します。
- public static String convertStreamToString(InputStream is) throws IOException: InputStream を入力として受け取り、String を返すメソッドを定義します。IOException をスローする可能性があるため、throws 句で宣言します。
- StringBuilder sb = new StringBuilder();: 文字列を効率的に構築するための StringBuilder オブジェクトを作成します。
- BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));: InputStream を文字ストリームに変換する InputStreamReader オブジェクトを作成し、それをバッファリングする BufferedReader オブジェクトを作成します。エンコーディングとして UTF-8 を指定しています。
- String line; while ((line = reader.readLine()) != null): BufferedReader から一行ずつ読み込み、null でなければループを続けます。
- sb.append(line).append("\n");: 読み込んだ行を StringBuilder に追加します。
- reader.close();: BufferedReader を閉じます。
- return sb.toString();: StringBuilder の内容を String に変換して返します。
import org.apache.commons.io.IOUtils;
public class InputStreamToStringExample {
public static String convertStreamToString(InputStream is) throws IOException {
return IOUtils.toString(is, "UTF-8");
}
}
- import org.apache.commons.io.IOUtils: Apache Commons IO ライブラリをインポートします。
- return IOUtils.toString(is, "UTF-8");: IOUtils.toString メソッドを使って InputStream を直接 String に変換します。エンコーディングとして UTF-8 を指定しています。
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class InputStreamToStringExample {
public static String convertStreamToString(InputStream is) throws IOException {
return new String(is.readAllBytes(), StandardCharsets.UTF_8);
}
}
- return new String(is.readAllBytes(), StandardCharsets.UTF_8);: InputStream をバイト配列に変換し、それを String に変換します。エンコーディングとして UTF-8 を指定しています。
注意:
- エンコーディングは適切なものを選択してください。
- Apache Commons IO を使用する場合は、ライブラリを追加する必要があります。
- Java 9 以降の
readAllBytes()
メソッドは簡潔ですが、大きな InputStream の場合、メモリ使用量に注意が必要です。
代替方法
Scanner クラスを使う
単純なケースで便利な方法です。
import java.util.Scanner;
public class InputStreamToStringExample {
public static String convertStreamToString(InputStream is) {
Scanner scanner = new Scanner(is);
return scanner.useDelimiter("\\A").next();
}
}
Scanner
クラスは入力ストリームからトークンを読み取ることができます。useDelimiter("\\A")
で入力全体を一つのトークンとして扱います。next()
メソッドでトークンを取得します。
ByteArrayOutputStream を使う
低レベルな操作が必要な場合に使える方法です。
import java.io.*;
public class InputStreamToStringExample {
public static String convertStreamToString(InputStream is) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
return new String(baos.toByteArray(), " UTF-8");
}
}
ByteArrayOutputStream
にバイトデータを書き込みます。toByteArray()
メソッドでバイト配列を取得し、String に変換します。
Guava の CharStreams を使う
Guava ライブラリを使用する場合に便利な方法です。
import com.google.common.io.CharStreams;
public class InputStreamToStringExample {
public static String convertStreamToString(InputStream is) throws IOException {
return CharStreams.toString(new InputStreamReader(is, "UTF-8"));
}
}
CharStreams.toString
メソッドで簡単に変換できます。
Java 8 の Stream API を使う
関数型スタイルで処理したい場合に使える方法です。
import java.io.*;
import java.util.stream.Collectors;
public class InputStreamToStringExample {
public static String convertStreamToString(InputStream is) throws IOException {
return new BufferedReader(new InputStreamReader(is ))
.lines()
.collect(Collectors.joining("\n"));
}
}
どの方法を選ぶかは、プロジェクトの要件や好み、使用するライブラリによって異なります。
- 単純なケース: Scanner
- 低レベルな操作: ByteArrayOutputStream
- Guava ライブラリを使用: CharStreams
- 関数型スタイル: Java 8 Stream API
- ライブラリを使用する場合は、ライブラリの依存関係に注意してください。
- パフォーマンスやメモリ使用量を考慮して選択してください。
java string io