2011-09-30 26 views
5

Cách đơn giản nhất để chuyển đổi một FileOutputStream thành FileInputStream (một đoạn mã nào là tuyệt vời)?FileOutputStream vào FileInputStream

+4

Thậm chí bạn có hiểu những gì bạn đang yêu cầu ở đây không? Ý bạn là "chuyển đổi" là gì? Họ về cơ bản là đối diện; một là để đọc và một là viết. Bạn đang cố gắng đọc tệp bạn đang ghi vào trong 'FileOutputStream'? –

+1

Chính xác bạn muốn làm gì? FileOutputStream ghi vào một tệp và một FileInputStream đọc từ một tệp. Tôi không thấy cách cái cũ có thể được biến đổi thành cái sau. –

+0

Tôi nhận được một FileOutputStream. Những gì tôi muốn là đọc nó. – Pen

Trả lời

14

Điều này có thể giúp bạn:

http://ostermiller.org/convert_java_outputstream_inputstream.html

Bài viết này đề cập đến 3 khả năng:

  • viết đầu ra hoàn chỉnh thành một mảng byte sau đó đọc nó một lần nữa
  • ống sử dụng
  • sử dụng bộ đệm byte tròn (một phần của thư viện được lưu trữ trên trang đó)


Chỉ cần để tham khảo, làm nó theo chiều ngược lại (đầu vào đến đầu ra):

Một giải pháp đơn giản với Apache Commons IO sẽ là:

IOUtils.copyLarge(InputStream, OutputStream) 

hoặc nếu bạn chỉ muốn sao chép tệp:

FileUtils.copyFile(inFile,outFile); 

Nếu bạn không muốn sử dụng Apache Commons IO, đây là wha t phương pháp copyLarge làm:

public static long copyLarge(InputStream input, OutputStream output) throws IOException 
{ 
    byte[] buffer = new byte[4096]; 
    long count = 0L; 
    int n = 0; 
    while (-1 != (n = input.read(buffer))) { 
    output.write(buffer, 0, n); 
    count += n; 
    } 
    return count; 
} 
+1

Liên kết bị hỏng, nhưng bạn vẫn có thể tìm thấy câu trả lời gốc tại đây: https://web.archive.org/web /20110929161214/http://ostermiller.org/convert_java_outputstream_inputstream.html – GregT

1

Nếu bạn có thể sử dụng @Thomas ví dụ đưa ra, nếu không bạn có thể làm:

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 

public class FileInputOutputExample { 
    public static void main(String[] args) throws Exception { 

    InputStream is = new FileInputStream("in.txt"); 
    OutputStream os = new FileOutputStream("out.txt"); 
    int c; 
    while ((c = is.read()) != -1) { 
     System.out.print((char) c); 
     os.write(c); 
    } 
    is.close(); 
    os.close(); 

    } 
} 

ví dụ từ java2s.com

EDIT:

Như @ Thomas đã xóa câu trả lời của mình, tôi sẽ chỉ thêm tham chiếu Commons IO để xử lý vấn đề này:

IOUtils.copy(InputStream is, OutputStream os) 
+0

Tôi không thấy cách này "chuyển đổi một' FileOutputStream' thành 'FileInputStream'." –

+0

Thực ra ví dụ của tôi là vòng khác (đầu vào cho đầu ra), vì vậy tôi đã xóa nó. Nếu nó vẫn còn có liên quan, tôi có thể phục hồi nó để tham khảo. – Thomas

+0

@Mark: đó là sự thật, tôi chỉ cho rằng anh ấy muốn đọc một cái khác vào – Kris

2

Nếu bạn muốn nói rằng bạn có thể đọc nội dung sau khi viết (không xả đĩa), hãy sử dụng ByteArrayOutputStream và ByteArrayInputStream. Khi bạn đã hoàn thành việc ghi vào ByteArrayOutputStream, bạn có thể lấy dữ liệu byte bên dưới và sử dụng ByteArrayInputStream để đọc nó.

ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
// do any output onto outStream you need 
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray()); 
// you can read back the output with inStream now 

Nếu bạn muốn có bộ đệm (nhà sản xuất/vấn đề loại người tiêu dùng), hãy xem Bộ đệm được cung cấp với gói nio của java.

4

Tôi nhận được một FileOutputStream. Những gì tôi muốn là đọc nó.

Bạn chắc chắn không thể đọc từ số OutputStream. Tôi nghĩ bạn có nghĩa là bạn muốn đọc từ tập tin được viết bởi FileOutputStream. Tôi không nghĩ rằng bạn có thể làm điều đó. Các FileOutputStream dường như không giữ một tham chiếu đến các tập tin được ghi vào.

Những gì bạn cần làm là khám phá những gì File hoặc đường dẫn (một String) đã được thông qua vào FileOutputStream và sử dụng cùng một File hoặc String để tạo ra một mới FileInputStream.

+3

Tôi nghĩ rằng anh ấy có thể sử dụng FileOutputStream.getFD() để lấy FileDescriptor; hơn là xây dựng một FileInputStream xung quanh nó. Không chắc chắn nếu bạn có thể đồng thời đọc và viết từ cùng một FileDescriptor mặc dù. –

+0

@ S.L.Barth: Điểm tốt, tôi đã thực sự nhìn vào đó nhưng bỏ lỡ thực tế là 'FileInputStream' có một hàm tạo có một' FileDescriptor'. –

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