Có thể tạo một đối tượng Tệp từ InputStream không


121

Có cách nào để tạo một java.io.Fileđối tượng từ một java.io.InputStream?

Yêu cầu của tôi là đọc Tệp từ RAR. Tôi không cố gắng viết một Tệp tạm thời, tôi có một tệp bên trong kho lưu trữ RAR mà tôi đang cố đọc.


1
yêu cầu của tôi là đọc Tệp từ RAR. Giả sử tôi không cố gắng ghi Tệp tạm thời từ RAR, bên trong RAR tôi đang có Tệp, chỉ cần tôi đọc.
androidgalaxyman

Tôi không hiểu câu hỏi. Vui lòng làm rõ. Nếu bạn muốn Tệp gốc từ InputStream, thì không có: bạn đang đọc tệp RAR, không phải Tệp. Nếu bạn muốn thứ gì khác, thì sao?
Marquis of Lorne,

Câu trả lời:


87

Bạn cần tạo tệp mới và sao chép nội dung từ InputStreamtệp đó:

File file = //...
try(OutputStream outputStream = new FileOutputStream(file)){
    IOUtils.copy(inputStream, outputStream);
} catch (FileNotFoundException e) {
    // handle exception here
} catch (IOException e) {
    // handle exception here
}

Tôi đang sử dụng tiện lợi IOUtils.copy()để tránh sao chép thủ công các luồng. Ngoài ra nó có bộ đệm tích hợp.


3
Không thể giải quyết IOUtils trong Android Studio và liên kết bạn đã tham chiếu là 404.
Shahraiz T.

3
org.apache.directory.studio:org.apache.commons.io cần được thêm vào dưới dạng phụ thuộc. Lỗi của tôi. :)
Shahraiz T.

7
Vui lòng đóng đúng OutputStream, sử dụng thử với tài nguyên hoặc IOUtils.closeQuietly. Tôi biết nó chỉ là một ví dụ nhưng người mới bắt đầu sẽ sao chép nó theo nghĩa đen.
Rafael Membrives

59

Trong một dòng:

FileUtils.copyInputStreamToFile(inputStream, file);

(org.apache.commons.io)


29

Tạo một tệp tạm thời trước.

File tempFile = File.createTempFile(prefix, suffix);
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
return tempFile;

Vui lòng bao gồm tên gói của IOUtils
Ridhuvarshan 11/09/18

org.apache.commons.io
Shehan Simen

Nó cũng tồn tại trong org.apache.axis2.util với tham số thứ ba cho hàm sao chép. Chức năng cũng hoạt động ở đó. Bất kỳ so sánh về những gì để sử dụng?
Ridhuvarshan 18/09/18

26

Kể từ Java 7, bạn có thể làm điều đó trong một dòng ngay cả khi không sử dụng bất kỳ thư viện bên ngoài nào:

Files.copy(inputStream, outputPath, StandardCopyOption.REPLACE_EXISTING);

Xem tài liệu API .


2
Nếu bạn sử dụng điều này với Android, SDK tối thiểu là 26 là bắt buộc.
Neph

3

Nếu bạn không muốn sử dụng thư viện khác, đây là một hàm đơn giản để chuyển đổi InputStreamsang OutputStream.

public static void copyStream(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
}

Giờ đây, bạn có thể dễ dàng ghi một Inputstreamtệp vào tệp bằng cách sử dụng FileOutputStream-

FileOutputStream out = new FileOutputStream(outFile);
copyStream (inputStream, out);
out.close();

1

Giải pháp Java 11 dễ dàng với thử với khối tài nguyên

public static void copyInputStreamToFile(InputStream input, File destination) {  

    try (OutputStream output = new FileOutputStream(destination)) {
        input.transferTo(output);
    } catch (IOException ioException) {
        ioException.printStackTrace();
    }

}

java.io.InputStream # transferTo khả dụng kể từ Java 9.


0

Nếu bạn đang sử dụng Java phiên bản 7 trở lên, bạn có thể sử dụng thử tài nguyên để đóng đúng cách FileOutputStream. Đoạn mã sau sử dụng IOUtils.copy()từ commons-io .

public void copyToFile(InputStream inputStream, File file) throws IOException {
    try(OutputStream outputStream = new FileOutputStream(file)) {
        IOUtils.copy(inputStream, outputStream);
    }
}  

Bạn không cần phải đóng OutputStream? Giống như trong các câu trả lời từ Tomasz N.
trinity420

3
@ trinity420 Các tài nguyên được chỉ định trong phần trykhởi tạo sẽ tự động đóng khi trykhối được thoát.
h3xStream
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.