2015-04-29 5 views
8

Mam String, który ma pewne znaki kontrolne ASCII w nim (a mianowicie RS (0x1e) i US (0x1f)). I one zdefiniowane w moim kodu, takich jak:Podziel ciąg znaków przez bajt

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

później w moim kodu, chcę podzielić ciąg za pomocą tych znaków:

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

jednak, że nie działa poprawnie. Po kilku błahostkach stwierdziłem, że to działa, ale w takim przypadku muszę zapamiętać kody. Używam statycznego bajtu RS również w innych częściach, więc po prostu zmieniając to nie jest prawdziwa opcja. Mógłbym oczywiście stworzyć RS_STRING lub coś takiego, ale to oznacza podwójną pracę.

Jakieś dobre, dobre rozwiązanie do tego?

+1

Dlaczego po prostu nie używać 'public static final String RS_STRING = new String (nowy bajt [] {RS}, StandardCharsets.US_ASCII)'? –

+1

'split()' pobiera wyrażenie regularne, może być konieczne pominięcie wartości za pomocą 'Pattern.compile()'? – berry120

+1

@ berry120 W jego sekwencji nie ma znaków specjalnych. – Maroun

Odpowiedz

5

Deklarowanie charakter jako char raczej niż byte stacjonarnej to dla mnie - dodaje działa dobrze:

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

Jednak użycie bajt jako typ Powoduje to niepowodzenie:

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

Możesz oczywiście odrzucić char z powrotem do byte, jeśli chcesz odwołać się do niego w innych częściach kodu.

2

Problem polega na użyciu String.valueOf(), ponieważ tam nie ma wartości String.valueOf (byte).

Zamiast tego po cichu rozszerza się bajt na int i nazywa się String.valueOf(int). I ta metoda zwraca dziesiętną łańcuchową reprezentację int.

To dlatego sugerowanie, że RS jest znakiem, naprawia go, String.valueOf (char) rzeczywiście robi to, czego się spodziewasz (daje ciąg znaków z tym znakiem).

Można na przemian dodać tylko rzutowanie jawne podczas przekształcania do reprezentacji String: String.valueOf((char) RS) i zachować wartość RS zadeklarowaną jako bajt.