2012-12-31 11 views
5

Mam plik tekstowy i chcę przeczytać całą jego zawartość w zmiennej String. Plik jest otwierany jako InputStream, ponieważ korzystam z metody assetManager.open() systemu Android.Jaki jest najlepszy sposób, aby za jednym razem odczytać wszystkie dane z pliku tekstowego?

Jaki jest najlepszy sposób na odczytanie całej zawartości w ciągu znaków? Obecnie zawijam InputStream za pomocą InputStreamReader, a następnie BufferedReader i za pomocą pętli while czytam wiersz tekstu po linii za pomocą metody readLine().

Czy istnieje lepszy sposób na czytanie w tym tekście Biorąc pod uwagę, nie ma wymogu, aby przeczytać go linia po linii, chciałbym dostać to wszystko za jednym razem, jeśli to możliwe

+0

'new InputStreamReader (inputStream," UTF-8 ")' z jawnym parametrem kodowania jest w porządku. Wskazówka @assylias 'Files.readAllLines' też jest fajna. –

Odpowiedz

2

normalnie nie powinno wyważać otwartych drzwi, więc korzystać z biblioteki commons apache, jeśli koszt jest znośny na Androida. Użyj org.apache.commons.io.IOUtils.toString.

InputStream in = new FileInputStream(new File("a.txt")); 
String s = IOUtils.toString(in, "UTF-8"); 
4

To co robi Java 7 Files.readAllLines method - Spodziewam się, że jest to bardzo dobry sposób to zrobić (używa składni try-with-zasobów, które jest łatwo przenieść na działa na Androidzie):

public static List<String> readAllLines(Path path, Charset cs) throws IOException { 
    try (BufferedReader reader = newBufferedReader(path, cs)) { 
     List<String> result = new ArrayList<String>(); 
     for (;;) { 
      String line = reader.readLine(); 
      if (line == null) 
       break; 
      result.add(line); 
     } 
     return result; 
    } 
} 

w Twoim przypadku można dołączyć ciągi do StringBuilder zamiast dodawać je do listy.

+0

Android AssetManager otwiera plik tylko jako InpuStream, więc właśnie z nim pracuję. – sonicboom

+0

Czy istnieje inny sposób uzyskiwania dostępu do zasobów w systemie Android przy użyciu tylko ścieżek? Nie widzę sensu posiadania klasy AssetManager w pierwszej kolejności, jeśli nie ma to na celu egzekwowania ścisłej metody dostępu do zasobów aplikacji? – sonicboom

-1

Można również użyć klasy Scanner

Scanner scan = new Scanner(file); 
String content = scan.next(); 
+0

To skanuje następny token, a nie cały plik. – TechSpellBound

0

Jest to kolejny możliwy sposób to zrobić.

BufferedReader br = new BufferedReader(new FileReader("a.txt")); 
char[] cbuf = new char[500]; 
br.read(cbuf); 
String fileContents = new String(cbuf); 
0
Scanner scanner = new Scanner(file, encoding);  
scanner.useDelimiter("\\A"); 
if (!scanner.hasNext()) {  // corner case -- file is empty 
    return ""; 
} 
String result = scanner.next(); 
scanner.close();