Вот полное объяснение того, как это работает, насколько мне известно (теперь, когда я понял это):
public class MyWriter extends BufferedWriter {
При создании класса MyWriter, расширяющего BufferedWriter, MyWriter становится идентичным классу с BufferedWriter, пока вы что-то не измените.
public MyWriter(Writer out)
{
super(out);
}
Это конструктор. Он выглядит как метод / функция, но вызывается только при создании «нового MyWriter» и используется для определения этого нового объекта в соответствии с этими инструкциями. В этом случае для создания нового экземпляра MyWriter требуется входной параметр «(Writer out)», который является StringWriter с именем «writer» в действии. То есть он требует другого Writer в качестве входных данных и вызывает его 'out'. «Супер» отправляет «до» BufferedWriter. При этом вы «обернули» StringWriter в BufferedWriter. Другими словами, вы поместили StringWriter в BufferedWriter. Результат объединяет функциональность обоих типов Writer; "Buffered-String-Writer", если хотите.
public MyWriter writeTest(String repeatthis) throws IOException {
this.write(repeatthis);
this.newLine();
this.write("along with this other stuff.");
Здесь важно отметить, что «this» относится к BufferedWriter. По сути, он добавляет каждую строку к неназванной строке, которая существует внутри BufferedWriter.
Самым важным является то, что вы должны использовать flush (), чтобы выгрузить все из BufferedWriter, чтобы получить его там, куда он должен идти. В этом случае flush () наконец отправляет строку в StringWriter, где она будет оставаться, пока вы не вытянете ее оттуда. Ниже приведен правильный рабочий код:
StringWriter writer = new StringWriter();
MyWriter myObjectWrites = new MyWriter(writer);
String myNewString = "I want to see this repeated back to me.";
try {
myObjectWrites.writeTest(myNewString);
} catch (IOException e) {
e.printStackTrace();
}
try {
myObjectWrites.flush();
myObjectWrites.close();
} catch (IOException e) {
e.printStackTrace();
}
return writer.toString();
Обратите внимание, что вы закрываете () объект BufferedWriter 'myObjectWrites', а не объект StringWriter 'Writer'. Кроме того, согласно документации, close () также сбрасывает BufferedWriter, но я все еще использую flush () для безопасности.