次のように、StringReader
を通常のString
に変換しようとしています。
String string = reader.toString();
しかし、この文字列を読み込もうとすると、次のようになります。
System.out.println("string: "+string);
私が得るすべては、次のようなポインター値です:
Java.io.StringReader@2c552c55
文字列を読み戻すときに何か問題がありますか?
StringReader
のtoString
メソッドは、StringReader
内部バッファーを返しません。
これを取得するには、StringReader
から読み取る必要があります。
文字配列を受け付ける読み取りのオーバーロードを使用することをお勧めします。一括読み取りは、単一文字の読み取りよりも高速です。
すなわち。
//use string builder to avoid unnecessary string creation.
StringBuilder builder = new StringBuilder();
int charsRead = -1;
char[] chars = new char[100];
do{
charsRead = reader.read(chars,0,chars.length);
//if we have valid chars, append them to end of string.
if(charsRead>0)
builder.append(chars,0,charsRead);
}while(charsRead>0);
String stringReadFromReader = builder.toString();
System.out.println("String read = "+stringReadFromReader);
import org.Apache.commons.io.IOUtils;
String string = IOUtils.toString(reader);
外部ライブラリを使用したくない場合:
_ Scanner scanner = new Scanner(reader).useDelimiter("\\A");
String str = scanner.hasNext() ? scanner.next() : "";
_
hasNext()
チェックの理由は、リーダーが空白(長さゼロ)の文字列をラップすると、next()
がNoSuchElementException
で爆発するためです。
または、GoogleのGuavaライブラリのCharStreams
を使用します。
CharStreams.toString(stringReader);
reader.toString();
は、Object
クラスから汎用のtoString()
メソッドを呼び出した結果を提供します。
read()
メソッドを使用できます。
int i;
do {
i = reader.read();
char c = (char) i;
// do whatever you want with the char here...
} while (i != -1);
ToString()メソッドを呼び出すと、StringReaderクラスのオブジェクトが提供されます。コンテンツが必要な場合は、次のようにStringReaderのreadメソッドを呼び出す必要があります。
public class StringReaderExample {
public static void main(String[] args) {
String s = "Hello World";
// create a new StringReader
StringReader sr = new StringReader(s);
try {
// read the first five chars
for (int i = 0; i < 5; i++) {
char c = (char) sr.read();
System.out.print("" + c);
}
// close the stream
sr.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
チュートリアルでは、これを使用できます link 。
別のネイティブ(Java 8+)ソリューションは、StringReader
オブジェクトを BufferedReader
および stream の行に渡すことです。
try (BufferedReader br = new BufferedReader(stringReader)) {
br.lines().forEach(System.out::println);
}
StringReader
が読み取っているString
の内容ではなく、実際のStringReader
オブジェクトのtoString()
を出力しています。
文字列内の実際の文字を読み取るには、read()
およびread(char[] cbuf, int off, int len)
メソッドを使用する必要があります。
StringReader
オブジェクトでメソッドtoString()
を使用すると、オブジェクトのメモリ位置が出力されます。この方法の1つを使用する必要があります。
read()
単一の文字を読み取ります。
read(char[] cbuf, int off, int len)
文字を配列の一部に読み取ります。
ここに例を示します:
String s = "Hello World";
// create a new StringReader
StringReader sr = new StringReader(s);
try {
// read the first five chars
for (int i = 0; i < s.length(); i++) {
char c = (char) sr.read();
System.out.print("" + c);
}
// close the stream
sr.close();
} catch (IOException ex) {
ex.printStackTrace();
}