我正在尝试将我的StringReader
back 转换为常规String
,如图所示:
String string = reader.toString();
但是当我尝试读出这个字符串时,像这样:
System.out.println("string: "+string);
我得到的只是一个指针值,如下所示:
java.io.StringReader@2c552c55
我在读回字符串时做错了什么?
我正在尝试将我的StringReader
back 转换为常规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 重载。批量读取比单字符读取快。
IE。
//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
或使用CharStreams
Googles Guava 库:
CharStreams.toString(stringReader);
调用 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();
}
}
}
对于教程,您可以使用此链接。
reader.toString();
将为您提供从类中调用泛型toString()
方法的结果。Object
您可以使用以下read()
方法:
int i;
do {
i = reader.read();
char c = (char) i;
// do whatever you want with the char here...
} while (i != -1);
另一个本机(Java 8+)解决方案可能是将StringReader
对象传递给 aBufferedReader
并通过以下行进行流式传输:
try (BufferedReader br = new BufferedReader(stringReader)) {
br.lines().forEach(System.out::println);
}
您正在打印toString()
实际StringReader
对象的,而不是正在读取的String
内容StringReader
。
您需要使用read()
和/或read(char[] cbuf, int off, int len)
方法来读取字符串中的实际字符。
如果您toString()
在StringReader
对象中使用该方法,您将打印对象的内存位置。你有你使用这种方法之一:
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());