2012-01-26 27 views
13

Tuyên bố từ chối trách nhiệm: Tôi đã xem xét tất cả các câu hỏi tôi có thể tìm thấy và không có câu nào trong số họ trả lời câu hỏi chính xác này. Nếu bạn tìm thấy một trong những xin vui lòng chỉ cho tôi để nó và lịch sự.Sử dụng Tệp hoặc FileReader bằng Máy quét?

Vì vậy, Oracle I/O tutorial mở một file văn bản với Scanner như sau:

new Scanner(BufferedReader(FileReader("xanadu.txt"))); 

Nhưng Javadoc mở một file văn bản với Scanner như thế này:

new Scanner(new File("myNumbers")); 

Nó sẽ được tốt đẹp để sử dụng phương pháp đơn giản hơn, đặc biệt là khi tôi có một tệp nhỏ và có thể sống với bộ đệm nhỏ hơn, nhưng tôi cũng thấy mọi người nói rằng khi bạn mở Tệp trực tiếp, bạn can't close it. Nếu đó là trường hợp, tại sao thành ngữ đó được sử dụng trong tài liệu chính thức?

Chỉnh sửa: Tôi cũng đã xem new Scanner(FileReader("blah.txt")); nhưng điều này có vẻ giống như điều tồi tệ nhất của cả hai thế giới.

Chỉnh sửa: Tôi không cố bắt đầu cuộc tranh luận về việc có nên sử dụng Máy quét hay không. Tôi có câu hỏi về cách sử dụng Máy quét. Cảm ơn bạn.

Trả lời

5

Bạn có thể xem xét triển khai Máy quét (JDK được cung cấp kèm theo mã nguồn). Có một phương thức close() trong lớp Scanner. Về cơ bản, cả hai cách tiếp cận bạn liệt kê đều giống hệt với trường hợp sử dụng của bạn khi đọc tệp nhỏ - chỉ cần đừng quên gọi close() ở cuối.

+1

Như @Tudor đã chỉ ra, Tệp không đóng() - vì vậy tệp thực sự đóng khi bạn sử dụng Máy quét theo cách này, hoặc là tài nguyên còn lại bị treo? – orbfish

+3

Có, nếu bạn vượt qua công cụ xây dựng File into Scanner, nó được sử dụng để mở luồng sẽ được đóng lại khi gọi phương thức Scanner.close(). Không quan trọng những gì bạn sử dụng constructor nếu bạn gọi close() đúng (ví dụ: từ try/finally) thì nó sẽ được đóng lại đúng cách. – maximdim

-2

Có nhiều cách để xây dựng đối tượng Máy quét.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

Cá nhân tôi thậm chí sẽ không sử dụng Máy quét để đọc tệp. Xem hướng dẫn về BufferedReader. Nó không quá khó để tìm ra.

+0

Điều này hoàn toàn không trả lời được câu hỏi của tôi. Vui lòng đọc câu hỏi nếu bạn định trả lời câu hỏi đó. Lưu ý: có rất nhiều cuộc tranh luận về việc có nên sử dụng Scanner hoặc BufferedReader thẳng. Cả hai đều được cung cấp bởi Java, tôi đang cố gắng tìm ra cách thực hành tốt nhất khi sử dụng nó, không quyết định có nên sử dụng nó hay không. – orbfish

+0

http://docs.oracle.com/javase/tutorial/essential/io/scanning.html – bdabmxican

+0

Có, tôi đã đọc nó, không trả lời câu hỏi của tôi, mà bạn sẽ biết nếu bạn đọc câu hỏi của tôi! – orbfish

2

Lớp File không có phương thức close() vì nó chỉ tóm tắt tệp đĩa. Nó không phải là một luồng đầu vào cho tệp, vì vậy không có gì để đóng.

+0

Có, tôi biết Tệp không thể đóng được. Vì vậy, bạn để lại một nguồn tài nguyên treo xung quanh (như đề xuất bởi các liên kết trong câu hỏi) hay không? – orbfish

+2

Bạn không để lại bất cứ điều gì treo xung quanh. Lớp File chỉ là một người nắm giữ thông tin cho một tập tin vật lý. Nó không phải là một tập tin xử lý. – Tudor

1

Có bạn có thể làm điều đó.

Về cơ bản bạn cần làm:

Scanner file = new Scanner(new FileReader("file.txt")); 

Để đọc một String:

String s = file.next(); 

Khi bạn đang thực hiện với các tập tin, làm

file.close(); 
1

Ngựa cho các khóa học. Từ Máy quét javadocs, Máy quét là "Máy quét văn bản" đơn giản có thể phân tích các loại và chuỗi nguyên thủy bằng cách sử dụng cụm từ thông dụng ". Vì vậy, tôi đưa vào câu hỏi của bạn là: nó không quan trọng mà cách tiếp cận bạn sử dụng, các tùy chọn đơn giản với File chỉ là tốt như một trong tìm thấy trong hướng dẫn Oracle. Máy quét là để thuận tiện cho việc mã hóa các tệp văn bản và nếu tệp của bạn nhỏ, như bạn đã nói, thì nó phù hợp hoàn hảo.

Vì Máy quét sử dụng cụm từ thông dụng, bạn thực sự không thể mong đợi hiệu suất lớn với nó, cho dù bạn tạo trình đọc tệp đệm cho máy quét hay không.Các cơ bản có thể đọc được sẽ được đóng() d (nếu nó là một Closeable, mà nó sẽ được, nếu bạn sử dụng Scanner (File) constructor), và do đó bạn không phải lo lắng miễn là bạn đóng() đối tượng Scanner của bạn (hoặc sử dụng các tài nguyên thử).

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