Załóżmy, że właśnie użyłem a BufferedInputStream
do odczytania bajtów pliku tekstowego zakodowanego w UTF-8 do tablicy bajtów. Wiem, że mogę użyć poniższej procedury do konwersji bajtów na ciąg, ale czy istnieje bardziej wydajny / mądrzejszy sposób na zrobienie tego niż tylko iteracja po bajtach i konwersja każdego z nich?
public String openFileToString(byte[] _bytes)
{
String file_string = "";
for(int i = 0; i < _bytes.length; i++)
{
file_string += (char)_bytes[i];
}
return file_string;
}
String fileString = new String(_bytes,"UTF-8");
?byte[]
do pamięci i konwertuje ją przeznew String(_bytes,"UTF-8")
(lub nawet fragmenty za pomocą+=
ciągiem) jest najbardziej wydajna. Łączenie strumieni wejściowych i czytników może działać lepiej, szczególnie w przypadku dużych plików.Odpowiedzi:
Spójrz na konstruktor String
A jeśli czujesz się leniwy, możesz skorzystać z biblioteki Apache Commons IO do bezpośredniej konwersji InputStream na String:
źródło
java.nio.charset.Charset.availableCharsets()
mapę wszystkich zestawów znaków, a nie tylko zestawów znaków wStandardCharsets
. A jeśli chcesz użyć innego zestawu znaków i nadal chcesz zapobiec rzucaniu się konstruktora StringUnsupportedEncodingException
, możesz użyćjava.nio.charset.Charset.forName()
Klasa Java String ma wbudowany konstruktor do konwersji tablicy bajtów na ciąg znaków.
źródło
Aby przekonwertować dane utf-8, nie można zakładać zgodności 1-1 między bajtami i znakami. Spróbuj tego:
(Bah. Widzę, że wolę naciskać przycisk Opublikuj swoją odpowiedź).
Aby odczytać cały plik jako ciąg znaków, wykonaj coś takiego:
źródło
Możesz do tego użyć
String(byte[] bytes)
konstruktora. Zobacz ten link, aby uzyskać szczegółowe informacje. EDYCJA Musisz także wziąć pod uwagę domyślny zestaw znaków swojej płyty zgodnie z dokumentacją java:źródło
Charset
argumentem, aby upewnić się, że konwersja jest poprawna.Możesz użyć metod opisanych w tym pytaniu (zwłaszcza, że zaczynasz od InputStream): Odczyt / konwersja InputStream na Ciąg
W szczególności, jeśli nie chcesz polegać na bibliotekach zewnętrznych, możesz wypróbować tę odpowiedź , która odczytuje
InputStream
viaInputStreamReader
dochar[]
bufora i dołącza go doStringBuilder
.źródło
Wiedząc, że masz do czynienia z tablicą bajtów UTF-8, na pewno będziesz chciał użyć konstruktora String, który akceptuje nazwę zestawu znaków . W przeciwnym razie możesz narazić się na pewne luki w zabezpieczeniach oparte na kodowaniu zestawu znaków. Pamiętaj, że rzuca, z
UnsupportedEncodingException
czym będziesz musiał sobie poradzić. Coś takiego:źródło
Oto uproszczona funkcja, która odczytuje bajty i tworzy ciąg znaków. Zakłada się, że prawdopodobnie już wiesz, w jakim kodowaniu znajduje się plik (a poza tym domyślnie).
źródło
Łańcuch ma konstruktor, który przyjmuje parametry byte [] i charsetname jako parametry :)
źródło
Obejmuje to również iterację, ale jest to znacznie lepsze niż łączenie łańcuchów, ponieważ są one bardzo bardzo kosztowne.
źródło
String str = new String(byte[])
zrobi dobrze.Dlaczego nie wziąć tego, czego szukasz od samego początku i przeczytać ciąg z pliku zamiast tablicy bajtów? Coś jak:
następnie czytaj Linia od wewnątrz, aż się skończy.
źródło
Używam w ten sposób
String strIn = new String(_bytes, 0, numBytes);
źródło