2010-11-19 17 views
12

widzę wiele przykładów jak napisać obiektów String tak:zapisu i odczytu ciągów do/z pliku wewnętrznej

String FILENAME = "hello_file"; 
String string = "hello world!"; 

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
fos.write(string.getBytes()); 
fos.close(); 

ale nie jak czytać je od wewnętrznej dokumentacji zgłoszeniowej. Większość przykładów przyjmuje określoną długość łańcucha w celu obliczenia bufora bajtowego, ale nie wiem, jaka będzie długość. Czy istnieje prosty sposób na zrobienie tego? Moja aplikacja zapisuje do 50-100 ciągów do pliku

Odpowiedz

14

Pisanie ciągów w ten sposób nie umieszcza żadnych ograniczników w pliku. Nie wiesz, gdzie kończy się jeden ciąg, a zaczyna następny. Dlatego musisz określać długość napisów podczas ich odczytywania.

Zamiast tego można użyć DataOutputStream.writeUTF() i DataInputStream.readUTF(), ponieważ metody te określają długość łańcuchów w pliku i automatycznie odczytują właściwą liczbę znaków.

W Android kontekście można zrobić coś takiego:

try { 
    // Write 20 Strings 
    DataOutputStream out = 
      new DataOutputStream(openFileOutput(FILENAME, Context.MODE_PRIVATE)); 
    for (int i=0; i<20; i++) { 
     out.writeUTF(Integer.toString(i)); 
    } 
    out.close(); 

    // Read them back 
    DataInputStream in = new DataInputStream(openFileInput(FILENAME)); 
    try { 
     for (;;) { 
      Log.i("Data Input Sample", in.readUTF()); 
     } 
    } catch (EOFException e) { 
     Log.i("Data Input Sample", "End of file reached"); 
    } 
    in.close(); 
} catch (IOException e) { 
    Log.i("Data Input Sample", "I/O Error"); 
} 
+1

dziękuję, ja już próbowałem tego ale z jakiegoś powodu DataInputStream.readUTF() odczytuje tylko pierwszy łańcuch. Ale mogłem zrobić coś nie tak – mishkin

+0

Dodałem kod do mojej odpowiedzi, czy to pomaga. –

+0

fajnie, to działa! Wielkie dzięki, Alexandre! Lubię czytać do końca pliku - myślałem o czymś szybkim, aby nie utworzyć obiektu String dla każdej linii, a ty odpowiedziałeś również na moje drugie pytanie :) – mishkin

Powiązane problemy