2015-04-29 16 views
8

Ho un String che contiene alcuni caratteri di controllo ASCII (ovvero RS (0x1e) e US (0x1f)). Li ho definito nel mio codice in quanto tale:Dividere una stringa di un byte

static public final byte RS = 0x1E; 
static public final byte US = 0x1F; 

avanti nel mio codice, voglio dividere una stringa utilizzando questi caratteri:

String[] records = content.split(String.valueOf(RS)); 

ma, che non funziona correttamente. Dopo un po 'ho trovato che questo

String[] records = content.split("\u001e"); 

funziona, ma in tal caso, devo ricordare i codici. Io uso il byte statico RS anche in altre parti, quindi cambiando semplicemente non è un'opzione reale. Ovviamente potrei creare uno RS_STRING o qualcosa del genere, ma questo significa doppio lavoro.

Qualsiasi soluzione pulita per questo?

+1

Perché non usare solo 'public static final String RS_STRING = new String (nuovo byte [] {RS}, StandardCharsets.US_ASCII)'? –

+1

'split()' prende un'espressione regolare, potrebbe essere necessario sfuggire al valore con 'Pattern.compile()'? – berry120

+1

@ berry120 non ci sono caratteri speciali nella sua sequenza. – Maroun

risposta

5

Dichiarare il personaggio come un char piuttosto che un byte fisso per me - il seguente funziona bene:

char RS = 0x1E; 
String s = new String(new char[]{'d', RS, 'e'}); 
System.out.println(s.split(String.valueOf(RS)).length); //Prints 2 

Tuttavia, utilizzando un byte come tipo induce a fallire:

byte RS = 0x1E; 
String s = new String(new char[]{'d', (char)RS, 'e'}); 
System.out.println(s.split(String.valueOf(RS)).length); //Prints 1 

Ovviamente è possibile trasmettere lo char allo byte se è necessario fare riferimento ad esso in altre parti del codice.

2

Il problema è l'utilizzo di String.valueOf(), perché non è String.valueOf (byte).

Invece il byte viene ampliato in modo silenzioso su uno int e String.valueOf(int) viene chiamato. E questo metodo restituisce la rappresentazione della stringa decimale dell'int.

Ecco perché il suggerimento di dichiarare RS come un char lo corregge, String.valueOf (char) effettivamente fa quello che ci si aspetta (dà una stringa con quel carattere in esso).

In alternativa, è possibile aggiungere un cast esplicito durante la trasformazione nella rappresentazione String: String.valueOf((char) RS) e mantenere dichiarato il costante RS come byte.