2012-03-30 37 views
11

Tôi có hai phương pháp để đọc Text File Trong một java sử dụng FileReader và khác file InputStreamLựa chọn giữa FileReader và InputStreamReader

FileReader fr=new FileReader("C:\\testq\\test.txt"); 
BufferedReader br=new BufferedReader(fr); 
String s; 
while((s=br.readLine())!=null){ 
    System.out.println("value are "+s); 
} 

và khác là

FileInputStream fstream = new FileInputStream("C:\\testnew\\out.text"); 
DataInputStream in = new DataInputStream(fstream); 
BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
String strLine; 
while ((strLine = br.readLine()) != null){ 
    System.out.println (strLine); 
} 

Mặc dù cả hai đầu ra cho tôi ... Tôi chỉ muốn biết đó là cách tốt nhất để làm điều đó.

+1

'DataInputStream' trong ví dụ thứ hai của bạn không đóng góp bất cứ điều gì: mã sẽ hoạt động bình thường mà không có mã. – EJP

Trả lời

17

Tôi sẽ mạnh khuyên sử dụng InputStreamReader thay vì FileReader, nhưng chỉ định rõ ràng mã hóa ký tự. Đó thực sự là lợi ích lớn nhất khi sử dụng InputStreamReader (và thiếu khả năng chỉ định mã hóa cho FileReader là một lỗ hổng lớn trong API, IMO).

Tôi cũng sẽ xóa "lớp" bằng cách sử dụng DataInputStream - chỉ cần chuyển số FileInputStream tới hàm tạo InputStreamReader.

Cách khác, hãy cân nhắc sử dụng một số phương pháp tiện lợi trong Guava có thể làm cho loại điều này trở thành đơn giản hơn nhiều. Ví dụ:

File file = new File("C:\\testnew\\out.text"); 
List<String> lines = Files.readLines(file, Charsets.UTF_8)); 
+0

Cảm ơn bạn .. nó đã làm việc nhưng chính xác những gì u có nghĩa là "rõ ràng xác định mã hóa ký tự" .. lời cầu xin có thể giải thích chi tiết nhỏ –

+0

@ Sebs_Jedi: Vâng, một chút của nó không bạn hiểu? Hiện tại bạn đang gọi hàm tạo sử dụng mã hóa ký tự * mặc định *, nhưng bạn có thể chỉ định một (UTF-8, UTF-16 vv) thay thế. Đó là * hiếm khi * một ý tưởng tốt để sử dụng mã hóa mặc định, mặc dù rõ ràng là bạn cần phải sử dụng bất kỳ mã hóa tệp văn bản nào đã được viết. –

+0

cảm ơn bạn. –

-1

Vâng, bạn tạo một BufferedReader từ FileInputStream ban đầu. Bạn nên làm như sau:

FileInputStream fstream = new FileInputStream("C:\\testnew\\out.text"); 
BufferedInputStream bstream = new BufferedInputStream(fstream); 

Để có được cách tiếp cận thích hợp liên quan đến luồng.

+0

Tại sao? Anh ấy muốn đọc văn bản, vì vậy một đầu đọc * thích hợp hơn - và tôi nghi ngờ rằng nó đáng giá đệm trong * hai * lớp. –

+1

Tôi không có nghĩa là anh ta nên sử dụng phương pháp này cho tình huống này. Tôi có nghĩa là cách tiếp cận liên quan đến luồng phải được sử dụng theo cách này :) –

+0

-1 như Jon Skeet nghi ngờ nó không tốt. –

2

Cả hai cách tiếp cận đều ổn bởi vì bạn sử dụng BufferedReader giúp cải thiện hiệu suất cao theo cách tiếp cận không có bộ đệm. Trong trường hợp thứ hai của bạn, không cần phải bọc FileInputStream trong một DataInputStream. Cách tiếp cận cuối cùng, chúng ta hãy chỉ định mã hóa tệp thông qua InputStreamReader thường là một điều quan trọng.

1

Nó phụ thuộc, nếu bạn muốn đọc tệp chỉ chứa văn bản (nghĩa là tệp văn bản) thì bạn nên sử dụng trường hợp đầu tiên.

Nếu bạn muốn đọc một số tệp đại diện cho dữ liệu nhị phân (có nghĩa là tệp hình ảnh hoặc tệp video v.v.), bạn nên sử dụng trường hợp thứ hai.

+0

cảm ơn bạn đã trả lời nhưng bạn có thể cho biết phương thức thay thế –

+0

Không, mã trong bài viết không sử dụng' DataInputStream. readLine'. Nó sử dụng 'BufferedReader.readLine' - nhìn kỹ nó. –

+0

@Sebs_Jedi bạn đã sử dụng nó một cách chính xác, mã của bạn hoàn toàn viết. Tôi đã hiểu sai điều đó trước đây. Lấy làm tiếc. –

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