2014-04-06 9 views
6

Ich verwende diesen Code undjava Druck char-Array

char[] str = { 'a', 'b', 'c', 0, 'c', 'c', 'f' }; 
System.out.print(str); 
System.out.println(" adksjfhak"); 

Diese Drucke nur "abc". während

char[] str = { 'a', 'b', 'c', 0, 'c', 'c', 'f' }; 
System.out.print(str); 
System.out.println("\n adksjfhak"); 

druckt

abc 
adksjfhak 

Warum Druckpuffer Stopp bei null (0) Zeichen? Bedeutet das, dass Java einfach nur Zeichen an Puffer anlegt und diesen Puffer druckt? Und da dieser Puffer 0 dazwischen hat, verwirft er natürlich den Rest der Kette.

Wahrscheinlich habe ich einen Teil meiner eigenen Frage beantwortet. Aber ich würde gerne mehr Details darüber wissen. Hows JVM behandelt das? Wo ist dieser Ausgabepuffer? Und jeden Grund, um 0 zu stoppen? Warum wird das Hinzufügen von \ n dieses Verhalten auch stoppen?

Edit 1: Verwendung von JDK 1.7, Eclipse-3.8.1 und Ubuntu 13.10

Edit 2: Merkwürdigerweise tut dieses nicht das Problem haben. https://ideone.com/VwFbRr

Bearbeiten 3: lief ich das gleiche auf der Kommandozeile

[bin]$ java com.sakura.C 
abcccf adksjfhak 
+0

Das funktioniert gut für mich (JDK 1.7) – Christian

+0

@Christian du meinst im ersten Fall, erhalten Sie sowohl abc und adksjfhak? – sakura

+1

Beziehungsweise, ich drucke 'abc ccf adksjfhak' und' abc ccf \ n adksjfhak' für mich aus. Ich bin mir nicht sicher, was das Problem ist. – Matthew

Antwort

0

Wahrscheinlich alles davon wird in beiden Fällen „gedruckt“ auf das Betriebssystem immer, aber im ersten Fall, Ihr Betriebssystem oder Shell nimmt das Zeichen "0" als Signal, um den Rest der Zeile nicht anzuzeigen. Im ersten Fall erscheinen beide Strings in derselben Zeile, so dass auch der zweite String unterdrückt wird. Im zweiten Fall befindet sich die zweite Zeichenfolge in einer neuen Zeile und wird somit angezeigt.

+0

Haben Sie versucht, den Code auszuführen? Wenn überhaupt, könnte der Terminalemulator in Frage kommen, aber da das OP in Eclipse läuft, ist das nicht wahrscheinlich. Genauso wie die anderen, die mich ausprobiert haben und das Problem nicht reproduzieren konnten - es druckt in beiden Fällen nur "abcccf" und zeigt keine Ausgabe für das 0-Zeichen an. –

+0

Ja, sieht aus wie Linux macht hier etwas. Irgendwelche Referenzen, irgendjemand? – sakura

+0

@ErwinBolwidt Das Zeichen 0 ist kein druckbares Zeichen, daher wird nicht erwartet, dass es angezeigt wird. –

3

Das Verhalten, das Sie sehen kann nicht erklärt werden, indem Sie nur auf den Java-Code. Ich vermute eher, dass es etwas damit zu tun hat, was Sie verwenden, um die Ausgabe zu betrachten.

Zuerst dies:

char[] str = { 'a', 'b', 'c', 0, 'c', 'c', 'f' }; 
    System.out.print(str); 

Nach der Printwriter javadoc,

System.out.print(str); 

würde

System.out.print(str[i]); 

für jedes Zeichen zu fordern gleichwertig sein. (Ja jeder, einschließlich des Nullzeichens!). Und das Verhalten von write(char), um nur das Zeichen nach der Standard-Plattform-Codierung zu kodieren, und schreiben Sie es. Für ein Null-Zeichen (Codepunkt Null) und einen typischen 7- oder 8-Bit-Zeichensatz wird das das NUL-Zeichen schreiben.

Auf der Java-Seite gibt es keine funky "null Mittel zum Ende der Zeichenfolge" Zeug mit Standard-Java-Strings von Standard-Java-I/O-Klassen. Zeitraum.

Ich denke an 3 können mögliche Erklärungen:

  1. Sie irren. Ihr tatsächlicher Code schreibt etwas anderes. (Zum Beispiel haben Sie vielleicht vergessen, ... neu zu kompilieren, wenn Sie Ihre Tests über die Befehlszeile ausführen.)

  2. Das seltsame Verhalten, das Sie sehen, geschieht, weil Ihre Konsole und/oder das Dienstprogramm, das Sie verwenden, um die Ausgabe anzuzeigen, etwas "spezielles" mit NUL-Zeichen tut. (Ich erinnere mich jedoch nicht, von einer Konsole usw. zu hören, die NUL auf diese seltsame Art behandelt hat)

  3. Ihre Anwendung hat einen benutzerdefinierten Subtyp von PrintWriter erstellt, der einige spezielle Behandlung für Codepunkt Null implementiert, und Es hat System.setOut(...) verwendet, um die Ausgabe über diese Klasse umzuleiten.


Having said that, es ist wahrscheinlich eine schlechte Idee zu versuchen, Strings oder Zeichen-Arrays zu drucken, die Null/NUL-Zeichen enthalten. Das NUL-Zeichen ist ein "Steuercode" und wird allgemein als nicht druckbar eingestuft. Was Sie sehen werden, wenn Sie versuchen, es zu drucken, ist ... unvorhersehbar.

Wenn Sie dies weiter verfolgen möchten, schlage ich vor, dass Sie die verdächtige Ausgabe in eine Datei umleiten und dann ein (OS-spezifisches) Dienstprogramm verwenden, um die Bytes der Datei anzuzeigen; z.B. od auf einem Unix/Linux-System. Ich würde erwarten, die Null-Bytes in der Datei zu sehen ...

+0

Ich denke, es sollte 2 hier sein. Es ist nur eine eigenständige Klasse. Aber ich benutze JDK 1.7, Eclipse 3.8.1 und Ubuntu 13.10, was ziemlich üblich ist. Ich habe auch nichts mit JVM-Einstellungen oder irgendwelchen Änderungen an Linux gemacht. – sakura