web-dev-qa-db-ja.com

StringReaderをStringに変換するにはどうすればよいですか?

次のように、StringReaderを通常のStringに変換しようとしています。

String string = reader.toString();

しかし、この文字列を読み込もうとすると、次のようになります。

System.out.println("string: "+string);

私が得るすべては、次のようなポインター値です:

Java.io.StringReader@2c552c55

文字列を読み戻すときに何か問題がありますか?

17
Zibbobz

StringReadertoStringメソッドは、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);
11
import org.Apache.commons.io.IOUtils;

String string = IOUtils.toString(reader);
26
ottago

外部ライブラリを使用したくない場合:

_ Scanner scanner = new Scanner(reader).useDelimiter("\\A");
 String str = scanner.hasNext() ? scanner.next() : "";
_

hasNext()チェックの理由は、リーダーが空白(長さゼロ)の文字列をラップすると、next()NoSuchElementExceptionで爆発するためです。

5
Bohemian

または、GoogleのGuavaライブラリのCharStreamsを使用します。

CharStreams.toString(stringReader);
4
johnm

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);   
1
jh314

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

1
Ankur Lathi

別のネイティブ(Java 8+)ソリューションは、StringReaderオブジェクトを BufferedReader および stream の行に渡すことです。

try (BufferedReader br = new BufferedReader(stringReader)) {
  br.lines().forEach(System.out::println);
}
1
Jasper de Vries

StringReaderが読み取っているStringの内容ではなく、実際のStringReaderオブジェクトのtoString()を出力しています。

文字列内の実際の文字を読み取るには、read()およびread(char[] cbuf, int off, int len)メソッドを使用する必要があります。

0
Kirsten Koa

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();
    }
0
amatellanes