Как мне преобразовать StringReader в String?
Я пытаюсь преобразовать мой StringReader
вернуться к обычному String
, как показано:
String string = reader.toString();
Но когда я пытаюсь прочитать эту строку, вот так:
System.out.println("string: "+string);
Все, что я получаю, это значение указателя, например:
java.io.StringReader@2c552c55
Я делаю что-то не так, читая строку назад?
10 ответов
StringReader
"s 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
если читатель переносит пустую строку (нулевой длины).
Или используя CharStreams
из библиотеки Googles Guava:
CharStreams.toString(stringReader);
Согласно 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());
Другим нативным (Java 8+) решением может быть передача StringReader
возражать против BufferedReader
и поток через линии:
try (BufferedReader br = new BufferedReader(stringReader)) {
br.lines().forEach(System.out::println);
}
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);
Вызов метода toString() даст объект класса StringReader. Если вам нужно его содержимое, вам нужно вызвать метод read в StringReader следующим образом:
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();
}
}
}
Для обучения вы можете использовать эту ссылку.
Если вы используете метод 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();
}
Вы распечатываете toString()
фактического StringReader
объект, а не содержимое String
что StringReader
читает.
Вам нужно использовать read()
и / или read(char[] cbuf, int off, int len)
методы для чтения фактических символов в строке.