2012-12-31 55 views
5

Tôi có một tệp văn bản và tôi muốn đọc toàn bộ nội dung của nó thành một biến Chuỗi. Tệp đang được mở dưới dạng InputStream khi tôi đang sử dụng phương thức assetManager.open() của Android.Cách thích hợp nhất để đọc tất cả dữ liệu từ một tệp văn bản trong một lần là gì?

Cách thực hành tốt nhất để đọc toàn bộ nội dung vào chuỗi là gì? Tôi hiện đang gói InputStream với một InputStreamReader và sau đó là một BufferedReader và sử dụng một vòng lặp while tôi đã đọc trong dòng văn bản theo phương thức readLine().

Có cách nào tốt hơn về đọc trong văn bản này xem xét tôi không có yêu cầu để đọc nó trong từng dòng, tôi muốn làm cho nó tất cả trong một đi nếu có thể

+0

'đầu vào mớiStreamReader (inputStream," UTF-8 ")' với thông số mã hóa rõ ràng là tốt. @assylias tip của 'Files.readAllLines' là tốt đẹp quá. –

Trả lời

2

Một bình thường không nên phát minh lại bánh xe, vì vậy sử dụng thư viện commons apache, nếu chi phí là có thể chịu đựng trên Android. Sử dụng org.apache.commons.io.IOUtils.toString.

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

Đây là những gì Java 7 Files.readAllLines method làm - tôi mong chờ nó là một cách rất tốt để làm việc đó (nó sử dụng một cú pháp thử-với-nguồn lực mà có thể dễ dàng chuyển vị để làm việc trên android):

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; 
    } 
} 

trong trường hợp của bạn, bạn có thể nối thêm các dây vào một StringBuilder thay vì thêm chúng vào một danh sách.

+0

Android AssetManager chỉ mở tệp dưới dạng InpuStream do đó đó là những gì tôi đang làm việc. – sonicboom

+0

Có cách nào khác để truy cập nội dung trong Android chỉ bằng cách sử dụng đường dẫn không? Tôi không thể nhìn thấy điểm có một lớp AssetManager ở nơi đầu tiên nếu nó không thực thi một phương thức nghiêm ngặt để truy cập các tài sản của ứng dụng? – sonicboom

-1

Bạn cũng có thể sử dụng lớp Scanner

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

Thao tác quét mã thông báo tiếp theo chứ không quét toàn bộ tệp. – TechSpellBound

0

Đây là một cách tốt để làm việc đó.

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(); 
Các vấn đề liên quan