2014-04-06 17 views
6

Sono in esecuzione questo codice ejava stampa char serie

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

Questo stampa solo "abc". mentre,

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

stampe

abc 
adksjfhak 

Perché fermata buffer di stampa a zero (0) personaggio? Questo significa che Java continua semplicemente ad accorciare il carattere e a stampare quel buffer? E, naturalmente, poiché il buffer ha 0 in mezzo, elimina il resto della stringa.

Probabilmente ho risposto a una parte della mia domanda. Ma mi piacerebbe sapere maggiori dettagli su questo. Come gestisce JVM? Dov'è questo buffer di uscita? E qualche motivo per fermarsi a 0? ANCHE perché aggiungere \ n arresta questo comportamento?

Edit 1: Utilizzando JDK 1.7, Eclipse 3.8.1 e Ubuntu 13.10

Edit 2: Stranamente, questo non ha questo problema. https://ideone.com/VwFbRr

Edit 3: ho incontrato lo stesso su riga di comando

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

Questo funziona bene per me (JDK 1.7) – Christian

+0

@Christian intendi nel primo caso, ottieni sia abc che adksjfhak? – sakura

+1

Rispettivamente, sta stampando 'abc ccf adksjfhak' e' abc ccf \ n adksjfhak' per me. Non sono sicuro di quale sia il problema. – Matthew

risposta

0

Molto probabilmente, tutti si sta facendo "stampato" per il sistema operativo in entrambi i casi, ma nel primo caso, il sistema operativo o shell prende il carattere '0' come segnale per non visualizzare il resto della linea. Nel primo caso, entrambe le stringhe appaiono sulla stessa riga in modo che anche la seconda stringa venga soppressa. Nel secondo caso, la seconda stringa è su una nuova riga e quindi viene visualizzata.

+0

Hai provato a eseguire il codice? Se non altro, l'emulatore di terminale potrebbe essere in discussione, ma poiché l'OP è in esecuzione in Eclipse, non è probabile. Proprio come gli altri, incluso me che ci hanno provato, e non siamo stati in grado di riprodurre il problema - in entrambi i casi si sta stampando 'abcccf', non mostrando alcun output per il carattere 0. –

+0

Sì, sembra che Linux stia facendo qualcosa qui. Qualche riferimento, qualcuno? – sakura

+0

@ErwinBolwidt Il carattere 0 non è un carattere stampabile quindi non dovrebbe essere visualizzato. –

3

Il comportamento che si sta vedendo non può essere spiegato con guardando solo il codice Java. Piuttosto, sospetto che sia qualcosa a che fare con ciò che stai usando per guardare l'output.

Prima questo:

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

Secondo il javadoc PrintWriter,

System.out.print(str); 

sarebbe equivalente alla chiamata

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

per ogni personaggio. (Sì, ognuno, incluso il carattere zero!). E il comportamento di write(char) per codificare il carattere in base alla codifica della piattaforma predefinita e scriverlo. Per un carattere Zero (punto zero del codice) e un tipico set di caratteri a 7 o 8 bit, verrà scritto il carattere NUL.

Non ci sono elementi "zero mezzi di fine stringa" funky sul lato Java con stringhe Java standard di classi I/O Java standard. Periodo.

mi viene in mente 3 possibili spiegazioni:

  1. Ti sbagli. Il tuo codice attuale sta scrivendo qualcosa di diverso. (Ad esempio, potresti aver dimenticato di ricompilare ... se stai eseguendo il test dalla riga di comando.)

  2. Lo strano comportamento che si sta verificando sta accadendo perché la tua console e/o l'utility che stai usando per visualizzare l'output sta facendo qualcosa di "speciale" con i caratteri NUL. (Tuttavia, non ricordo di aver sentito un programma console, ecc. Che ha gestito NUL in questo strano modo ...)

  3. L'applicazione ha creato un sottotipo personalizzato di PrintWriter che implementa una gestione speciale per il punto zero, e ha utilizzato System.setOut(...) per reindirizzare l'output tramite quella classe.


Detto questo, è probabilmente una cattiva idea di provare a stampare stringhe o array di caratteri che contengono caratteri zero/NUL. Il carattere NUL è un "codice di controllo" ed è generalmente classificato come non stampabile. Quello che vedrai quando proverai a stamparlo è ... imprevedibile.

Se si desidera proseguire ulteriormente, suggerisco di reindirizzare l'output sospetto su un file, quindi utilizzare una utility (specifica per il sistema operativo) per visualizzare i byte del file; per esempio. od su un sistema Unix/Linux. Mi aspetto di vedere i byte zero nel file ...

+0

Penso che dovrebbe essere 2 qui. È solo uno stand-alone, una singola classe. Ma sto usando JDK 1.7, Eclipse 3.8.1 e Ubuntu 13.10, che è una configurazione abbastanza comune. Inoltre non ho fatto nulla per le impostazioni JVM, o eventuali modifiche a Linux. – sakura