2008-11-12 14 views
29

Tôi có một tệp (được gọi là "number.txt") mà tôi muốn đọc đến một mảng trong Java. Làm thế nào chính xác để tôi đi trước và làm điều này? Đây là tệp "1 chiều" thẳng về phía trước, chứa 100 số.Java: Đọc một tệp vào một mảng

Vấn đề là tôi nhận được ngoại lệ mỗi lần. Rõ ràng nó không thể tìm thấy nó (tôi chắc chắn chính tả của nó đúng). Khi xem xét các ví dụ mã, nó không chỉ định toàn bộ đường dẫn tệp của tệp, chỉ tên của tệp đó. Tôi sẽ làm thế nào nếu cần thiết?

Ngoài ra, khi đọc tệp, mảng sẽ tự động chứa tất cả các dòng của tệp hay tôi sẽ tạo vòng lặp sao chép mọi dòng tới chỉ số tương ứng i?

Tôi đã nghe nói về lớp BufferedReader, mục đích của nó là gì và nó hoạt động như thế nào để đọc đầu vào?

Trả lời

63

Dưới đây là một số mã ví dụ để giúp bạn bắt đầu:

package com.acme; 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

public class FileArrayProvider { 

    public String[] readLines(String filename) throws IOException { 
     FileReader fileReader = new FileReader(filename); 
     BufferedReader bufferedReader = new BufferedReader(fileReader); 
     List<String> lines = new ArrayList<String>(); 
     String line = null; 
     while ((line = bufferedReader.readLine()) != null) { 
      lines.add(line); 
     } 
     bufferedReader.close(); 
     return lines.toArray(new String[lines.size()]); 
    } 
} 

Và một thử nghiệm đơn vị ví dụ:

package com.acme; 

import java.io.IOException; 

import org.junit.Test; 

public class FileArrayProviderTest { 

    @Test 
    public void testFileArrayProvider() throws IOException { 
     FileArrayProvider fap = new FileArrayProvider(); 
     String[] lines = fap 
       .readLines("src/main/java/com/acme/FileArrayProvider.java"); 
     for (String line : lines) { 
      System.out.println(line); 
     } 
    } 
} 

Hope this helps.

+17

quay lại để quay lại với bạn! – toolkit

+2

Không nên 'bufferedReader.close()' được bao bọc bên trong 'try {} finally {}' block? – LukeGT

+0

@ LukeGT- Có, nó cần cho mã sản xuất. Những phương pháp ví dụ này chỉ đơn giản là ném một ngoại lệ. – toolkit

0

Bạn sẽ có thể sử dụng dấu gạch chéo chuyển tiếp trong Java để tham khảo vị trí tệp.

Lớp BufferedReader được sử dụng để gói các trình đọc tệp khác mà phương pháp đọc có thể không hiệu quả lắm. Bạn có thể tìm thấy mô tả chi tiết hơn trong số Java APIs.

Việc sử dụng Bộ công cụ BufferedReader có lẽ là những gì bạn cần.

3

Apache Commons I/O cung cấp FileUtils # readLines(), điều này sẽ tốt cho tất cả trừ các tệp lớn: http://commons.apache.org/io/api-release/index.html. Bản phân phối 2.1 bao gồm FileUtils.lineIterator(), sẽ phù hợp với các tệp lớn. Thư viện Guava của Google bao gồm các tiện ích tương tự.

32
import java.io.File; 

import java.nio.charset.Charset; 
import java.nio.file.Files; 
import java.nio.file.Path; 

import java.util.List; 

// ... 

Path filePath = new File("fileName").toPath(); 
Charset charset = Charset.defaultCharset();   
List<String> stringList = Files.readAllLines(filePath, charset); 
String[] stringArray = stringList.toArray(new String[]{}); 
+0

@Northener đã đề cập rằng họ đã xem các ví dụ. Câu trả lời này không giải quyết bất kỳ câu hỏi nào mà họ đã hỏi. – allingeek

+3

Điều này là dành cho JAVA 7+ –

+3

Trong Java 8, bạn có thể chỉ cần gọi 'Files.readAllLines (filePath)' tương đương với việc chuyển 'StandardCharsets.UTF_8' làm bộ ký tự. – emlai