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.
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.
Câu trả lời:
Bạn cần tạo tệp mới và sao chép nội dung từ InputStream
tệ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.
Trong một dòng:
FileUtils.copyInputStreamToFile(inputStream, file);
(org.apache.commons.io)
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;
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 .
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 InputStream
sang 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 Inputstream
tệp vào tệp bằng cách sử dụng FileOutputStream
-
FileOutputStream out = new FileOutputStream(outFile);
copyStream (inputStream, out);
out.close();
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.
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);
}
}
try
khởi tạo sẽ tự động đóng khi try
khối được thoát.