我正在尝试将我的StringReader
转换回常规String
,如图所示:
String string = reader.toString();
但当我试着读出这个字符串时,就像这样:
System.out.println("string: "+string);
我得到的只是一个指针值,像这样:
java.io.StringReader@2c552c55
我在读回字符串时做错了什么吗?
import org.apache.commons.io.IOUtils;
String string = IOUtils.toString(reader);
StringReader
的toString
方法不返回StringReader
内部缓冲区。
你需要阅读StringReader
才能得到这个。
我建议使用接受字符数组的read重载。大容量读取比单个字符读取快。
即。
//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);
如果您不喜欢使用外部库:
Scanner scanner = new Scanner(reader).useDelimiter("\A");
String str = scanner.hasNext() ? scanner.next() : "";
hasNext()
检查的原因是,如果读取器包装空白(零长度)字符串,则next()
会爆炸为NoSuchElementException
。
或者使用谷歌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();
}
}
}
对于教程,您可以使用此链接。
另一个本机(Java 8+)解决方案可以将StringReader
对象传递给BufferedReader
,并通过以下行进行流式传输:
try (BufferedReader br = new BufferedReader(stringReader)) {
br.lines().forEach(System.out::println);
}
您打印的是实际StringReader
对象的toString()
,而不是StringReader
正在读取的String
的内容。
您需要使用read()
和/或read(char[] cbuf, int off, int len)
方法来读取String中的实际字符。
如果在StringReader
对象中使用方法toString()
,则将打印对象的内存位置。你必须使用以下方法之一:
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();
}
根据https://www.tutorialspoint.com/java/io/stringwriter_tostring.htm
StringReader sr = new StringReader("hello");
StringWriter sw = new StringWriter();
sr.transferTo(sw);
System.out.println(sw.toString());