2010-11-19 29 views
12

Tôi nhìn thấy rất nhiều ví dụ về cách viết các đối tượng String như thế:ghi và đọc chuỗi đến/từ tập tin nội bộ

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

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

nhưng không làm thế nào để đọc chúng trở lại từ tập tin ứng dụng nội bộ. Hầu hết các ví dụ giả định độ dài chuỗi cụ thể để tính toán bộ đệm byte nhưng tôi không biết chiều dài sẽ là bao nhiêu. Có cách nào dễ dàng để làm như vậy không? Ứng dụng của tôi sẽ ghi tối đa 50-100 chuỗi vào tệp

Trả lời

14

Viết chuỗi theo cách này không đặt bất kỳ loại dấu phân tách nào trong tệp. Bạn không biết nơi một chuỗi kết thúc và bắt đầu tiếp theo. Đó là lý do tại sao bạn phải xác định độ dài của các chuỗi khi đọc chúng trở lại.

Bạn có thể sử dụng DataOutputStream.writeUTF()DataInputStream.readUTF() thay vì các phương pháp này đặt độ dài của chuỗi trong tệp và tự động đọc lại số lượng ký tự phù hợp.

Trong một bối cảnh Android bạn có thể làm một cái gì đó như thế này:

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

cảm ơn, tôi đã cố gắng đó, nhưng vì một lý do DataInputStream.readUTF() chỉ đọc chuỗi đầu tiên. Nhưng tôi có thể làm điều gì đó sai trái ở đó – mishkin

+0

Tôi đã thêm một số mã vào câu trả lời của tôi nếu điều đó có ích. –

+0

đẹp, nó hoạt động! cảm ơn rất nhiều, Alexandre! Tôi thích làm thế nào để đọc cho đến khi kết thúc tập tin - Tôi đã suy nghĩ về một cái gì đó nhanh chóng không tạo ra một đối tượng String cho mỗi dòng và bạn trả lời câu hỏi thứ hai của tôi là tốt :) – mishkin

Các vấn đề liên quan