เป็นไปได้ไหมที่จะสร้างวัตถุไฟล์จาก InputStream


124

มีวิธีใดในการสร้างjava.io.Fileวัตถุจากjava.io.InputStream?

ความต้องการของฉันคือการอ่านไฟล์จาก RAR ฉันไม่ได้พยายามเขียนไฟล์ชั่วคราวฉันมีไฟล์อยู่ในไฟล์เก็บถาวร RAR ซึ่งฉันกำลังพยายามอ่าน


1
ความต้องการของฉันคือการอ่านไฟล์จาก RAR สมมติว่าฉันไม่ได้พยายามเขียนไฟล์ชั่วคราวจาก RAR ภายใน RAR ฉันมีไฟล์เพียงแค่ต้องอ่าน
androidgalaxyman

ฉันไม่เข้าใจคำถาม กรุณาชี้แจง. หากคุณต้องการไฟล์ต้นฉบับจาก InputStream ไม่มีเลยนั่นคือคุณกำลังอ่านไฟล์ RAR ไม่ใช่ไฟล์ ถ้าคุณต้องการอย่างอื่นคืออะไร?
Marquis of Lorne

คำตอบ:


90

คุณต้องสร้างไฟล์ใหม่และคัดลอกเนื้อหาจากInputStreamไปยังไฟล์นั้น:

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

ฉันใช้สะดวกIOUtils.copy()เพื่อหลีกเลี่ยงการคัดลอกสตรีมด้วยตนเอง นอกจากนี้ยังมีบัฟเฟอร์ในตัว


3
ไม่สามารถแก้ไข IOUtils ใน Android Studio และลิงก์ที่คุณอ้างถึงคือ 404
Shahraiz T.

3
ต้องเพิ่ม org.apache.directory.studio:org.apache.commons.io เป็นการอ้างอิง ความผิดฉันเอง. :)
Shahraiz T.

7
โปรดปิด OutputStream ให้ถูกต้องใช้การลองกับทรัพยากรหรือ IOUtils.closeQuietly ฉันรู้ว่ามันเป็นเพียงตัวอย่าง แต่ผู้เริ่มต้นจะคัดลอกตามตัวอักษร
Rafael Membrives


29

สร้างไฟล์ชั่วคราวก่อน

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

โปรดระบุชื่อแพ็กเกจของ IOUtils
Ridhuvarshan

org.apache.commons.io
Shehan Simen

นอกจากนี้ยังมีอยู่ใน org.apache.axis2.util ด้วยพารามิเตอร์ที่สามสำหรับฟังก์ชันคัดลอก ฟังก์ชั่นทำงานที่นั่นด้วย มีการเปรียบเทียบว่าจะใช้อะไรบ้าง?
Ridhuvarshan

27

ตั้งแต่ Java 7 คุณสามารถทำได้ในบรรทัดเดียวโดยไม่ต้องใช้ไลบรารีภายนอก:

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

ดูเอกสาร API


2
หากคุณใช้สิ่งนี้กับ Android จำเป็นต้องมี SDK ขั้นต่ำ 26
Neph

3

หากคุณไม่ต้องการที่จะใช้ห้องสมุดอื่น ๆ ที่นี่เป็นฟังก์ชั่นง่ายๆในการแปลงไปInputStreamOutputStream

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);
    }
}

ตอนนี้คุณสามารถเขียนInputstreamลงในไฟล์ได้อย่างง่ายดายโดยใช้FileOutputStream-

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

1

โซลูชัน Java 11 ที่ใช้งานง่ายด้วยการลองใช้บล็อกทรัพยากร

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พร้อมใช้งานตั้งแต่ Java 9


0

หากคุณใช้ Java เวอร์ชัน 7 ขึ้นไปคุณสามารถใช้try-with-resourcesเพื่อปิดไฟล์FileOutputStream. การใช้รหัสต่อไปนี้IOUtils.copy()จากคอมมอน-io

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

คุณไม่จำเป็นต้องปิด OutputStream หรือ? ชอบในคำตอบจาก Tomasz N.
trinity420

3
@ trinity420 ทรัพยากรที่ระบุในtryส่วนการเริ่มต้นจะถูกปิดโดยอัตโนมัติเมื่อtryออกจากบล็อก
h3xStream
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.