Konwertuj InputStream na BufferedReader


149

Próbuję odczytać plik tekstowy wiersz po wierszu przy użyciu InputStream z katalogu zasobów w systemie Android.

Chcę przekonwertować InputStream na BufferedReader, aby móc korzystać z readLine ().

Mam następujący kod:

InputStream is;
is = myContext.getAssets().open ("file.txt");
BufferedReader br = new BufferedReader (is);

Trzecia linia pomija następujący błąd:

Wiele znaczników w tej linii
Konstruktor BufferedReader (InputStream) jest niezdefiniowany.

To, co próbuję zrobić w C ++, to coś takiego:

StreamReader file;
file = File.OpenText ("file.txt");

line = file.ReadLine();
line = file.ReadLine();
...

Co robię źle lub jak mam to zrobić? Dzięki!

Odpowiedzi:


281

BufferedReadernie można zawinąć InputStreambezpośrednio. Otacza innego Reader. W takim przypadku chciałbyś zrobić coś takiego:

BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

Tak, zawijanie InputStream za pomocą InputStreamReader, które jest zawijane przez BufferedReader to typowa „sztuczka” przy użyciu funkcji readLine ().
Konfiguracja

14
Polecam: BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));dodane w Javie 7
brcolow

StandardCharsets nie działają na poziomie API> 19. @brcolow
Floryda

1
Myślę, że chcesz powiedzieć, że nie działa, chyba że poziom API> = 19?
brcolow

23

Konstruktor BufferedReader przyjmuje czytnik jako argument, a nie InputStream. Najpierw powinieneś utworzyć Czytnik ze swojego strumienia, na przykład:

Reader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);

Najlepiej jest również podać Charset lub nazwę kodowania znaków do konstruktora StreamReader. Ponieważ strumień dostarcza tylko bajtów, konwersja ich na tekst oznacza, że ​​kodowanie musi być znane. Jeśli tego nie określisz, przyjmowana jest wartość domyślna systemu.


20
InputStream is;
InputStreamReader r = new InputStreamReader(is);
BufferedReader br = new BufferedReader(r);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.