2012-06-27 16 views
18

Tôi có một tệp có thể là bất kỳ nội dung nào như ZIP, RAR, txt, CSV, tài liệu, v.v. Tôi muốn tạo ByteArrayInputStream từ đó.
Tôi đang sử dụng tệp để tải tệp lên FTP qua FTPClient từ Apache Commons Net.Làm thế nào để tạo ByteArrayInputStream từ một tệp trong Java?

Có ai biết cách thực hiện không?

Ví dụ:

String data = "hdfhdfhdfhd"; 
ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes()); 

Mã của tôi:

public static ByteArrayInputStream retrieveByteArrayInputStream(File file) { 
    ByteArrayInputStream in; 

    return in;  
} 
+0

Để đọc tập tin trong byte tôi sử dụng RandomAccessFile và chuyển các tập tin byte toàn bộ vào một mảng byte đầu tiên. Tôi thấy đây là một cách cực kỳ nhanh để đọc các tập tin theo byte. –

+3

Tại sao bạn cần phải làm điều này? Bạn có thể làm điều này bằng cách sao chép một FileInputStream đến một ByteArrayOutputStream và sau đó tạo ra một ByteArrayInputStream từ đó. Dĩ nhiên là vô nghĩa. –

+0

Vui lòng giải thích trường hợp sử dụng của bạn. Bạn có thể chỉ muốn một FileInputStream. Làm thế nào để bạn có kế hoạch sử dụng nó một khi bạn có nó? –

Trả lời

28

Sử dụng FileUtils#readFileToByteArray(File) từ Apache Commons IO, và sau đó tạo ra các ByteArrayInputStream sử dụng constructor ByteArrayInputStream(byte[]).

public static ByteArrayInputStream reteriveByteArrayInputStream(File file) { 
    return new ByteArrayInputStream(FileUtils.readFileToByteArray(file)); 
} 
+16

Như đã lưu ý trong câu trả lời của tôi, Java 7 đã chứa một readFileToByteArray trong lớp Files, không cần thư viện bổ sung. –

+6

Trên thực tế, trong Java 7, đó là 'Files.readAllBytes' –

13

Ý tưởng chung là một tập tin sẽ mang lại một FileInputStreambyte[] một ByteArrayInputStream. Cả hai thực hiện InputStream do đó chúng phải tương thích với bất kỳ phương pháp nào sử dụng tham số InputStream làm thông số.

Đưa toàn bộ nội dung tập tin trong một ByteArrayInputStream thể được thực hiện tất nhiên:

  1. đọc đầy đủ các tập tin vào một byte[]; Phiên bản Java> = 7 chứa convenience method called readAllBytes để đọc tất cả dữ liệu từ một tệp;
  2. tạo một ByteArrayInputStream xung quanh nội dung tệp, hiện có trong bộ nhớ.

Lưu ý rằng đây có thể không phải là giải pháp tối ưu cho các tệp rất lớn - tất cả tệp sẽ được lưu trữ trong bộ nhớ tại cùng một thời điểm. Sử dụng đúng luồng cho công việc là quan trọng.

3

Đây không phải là chính xác những gì bạn đang yêu cầu, nhưng là một cách nhanh chóng để đọc tệp theo byte.

File file = new File(yourFileName); 
RandomAccessFile ra = new RandomAccessFile(yourFileName, "rw"): 
byte[] b = new byte[(int)file.length()]; 
try { 
    ra.read(b); 
} catch(Exception e) { 
    e.printStackTrace(); 
} 

//Then iterate through b 
+0

hãy hoàn thành mã nếu bạn có thể? – itro

4

ByteArrayInputStreamInputStream trình bao bọc xung quanh mảng byte. Điều này có nghĩa là bạn sẽ phải đọc toàn bộ tệp vào một byte[] và sau đó sử dụng một trong các nhà thầu ByteArrayInputStream.

Bạn có thể cung cấp thêm chi tiết về những gì bạn đang làm với ByteArrayInputStream không? Nó có khả năng có những cách tốt hơn xung quanh những gì bạn đang cố gắng để đạt được.

Edit:
Nếu bạn đang sử dụng Apache FTPClient để tải lên, bạn chỉ cần một InputStream. Bạn có thể làm được việc này;

String remote = "whatever"; 
InputStream is = new FileInputStream(new File("your file")); 
ftpClient.storeFile(remote, is); 

Tất nhiên, bạn nên nhớ đóng luồng đầu vào khi bạn đã hoàn tất.

+0

Tôi đang sử dụng nó để tải tệp lên ftp qua FTPClient commons Apache. – itro

+0

@itro - cập nhật câu trả lời của tôi với chi tiết FTPClient – Qwerky

1

Đoạn mã này đi kèm tiện dụng:

private static byte[] readContentIntoByteArray(File file) 
{ 
    FileInputStream fileInputStream = null; 
    byte[] bFile = new byte[(int) file.length()]; 
    try 
    { 
    //convert file into array of bytes 
    fileInputStream = new FileInputStream(file); 
    fileInputStream.read(bFile); 
    fileInputStream.close(); 
    } 
    catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 
    return bFile; 
} 

tham khảo: http://howtodoinjava.com/2014/11/04/how-to-read-file-content-into-byte-array-in-java/

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