System.out.write y System.out.println
System.out.println('a'); lo que en realidad se llama es el método println(char c) de PrintStream; c) el método es:
public void println(String x) {
sincronizado (esto) {
print(x)
newLine();
}
}
Mira que Println llama al método print(char c). El código fuente del método print(char c) es el siguiente:
public void print(char c) {
write(String.valueOf(c));
}
Se puede ver que se llama al método write(String s). El código para escribir (String s) es el siguiente:
private void write(String s) {
prueba {
sincronizado (esto) { p>
asegurarOpen();
textOut.write( s);
textOut.flushBuffer()
charOut.flushBuffer(); /p>
if (autoFlush; amp; (s.indexOf('\n') gt; = 0))
out.flush ();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().println(String s) finalmente llama al método newLine().
El código de newLine() es el siguiente:
private void newLine() {
try {
sincronizado (esto) {
asegurarOpen( );
textOut.newLine();
textOut.flushBuffer()
si (autoFlush)
.flush( );
}
}
captura (InterruptedIOException x) {
Thread.currentThread().interrupt() ;
p>
}
captura (IOException x) {
problema = verdadero
}
}
newLine() se actualiza.
System.out.write(a) llama al método PrintStream.write(int b)
El código fuente de write(int b) es el siguiente:
public void write(int b) {
try {
sincronizado (esto) {
asegurarOpen();
p>
out.write(b);
if ((b == '\n') amp; amp ; autoFlush)
out.flush();
target="_blank" target="_blank">moreflush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().println(String s) no solo se actualizará, sino que también actualizará textOut y charOut al mismo tiempo. tiempo. Es por eso que después de agregar System.out.write('\n'); se muestra, el problema es que no se actualiza.
La segunda pregunta del autor está bien explicada, porque en print(String s), textOut y charOut se actualizan.
¿Qué son textOut y charOut? Consulte la definición en PrintStream:
private BufferedWriter textOut;
private OutputStreamWriter charOut;
textOut y charOut se definen en el método init(OutputStreamWriter osw). El código de init(OutputStreamWriter osw) es el siguiente:
private void init(OutputStreamWriter osw) {
this.charOut = osw;
this.textOut = nuevo BufferedWriter;
this.charOut = nuevo BufferedWriter.
textOut = new BufferedWriter(osw);
}
La función init() se llama en el constructor
public PrintStream(OutputStream out, boolean autoFlush) {
this(autoFlush, out);
init(new OutputStreamWriter(this));
}
Se puede ver que textOut y El flujo de salida operado por charOut es el mismo que out, por lo que los flujos de salida de textOut y charOut también se actualizarán cuando se actualice out, por lo que print (String s) se generará directamente incluso sin "\ n".