วิธีแปลง FileInputStream เป็น InputStream [ปิด]


116

ฉันแค่ต้องการแปลง a เป็นFileInputStreaman InputStreamฉันจะทำได้อย่างไร

เช่น

FileInputStream fis = new FileInputStream("c://filename");
InputStream is = ?; 
fis.close();

3
Ranjan คุณช่วยเปลี่ยนคำตอบที่ถูกต้องของโพสต์นี้ได้ไหม คำตอบปัจจุบันคือ subpar หากคุณเปลี่ยนเป็นแบบด้านล่างจะดีที่สุด
Whitecat

มันเป็นเพียงคำถามโง่ ๆ .. ฉันไม่มีความคิดที่ถูกต้องเกี่ยวกับการทำให้เป็นอนุกรม ... ใคร ๆ ก็อ้างถึง @sudocode
ranjan

4
อาจเป็นคำถามโง่ ๆ แต่หลายคนยังคงอ้างถึงคำถามนี้เพราะมีประโยชน์
Whitecat

1
@WilliMentzel ผมมาที่นี่ค้นหาแปลงที่เกิดขึ้นจริงจากชั้นเรียนFile InputStreamการแก้ไขของคุณแสดงให้เห็นว่าเป็นสิ่งที่ผู้เขียนขอ (อย่างน้อยก็บางส่วน) และไม่ถูกต้อง
สาย

@Line ฉันแค่เปลี่ยนการจัดรูปแบบฉันไม่คิดว่าฉันเปลี่ยนความหมาย หากคุณยังคัดค้านโปรดย้อนกลับการเปลี่ยนแปลงของฉัน สิ่งนี้จะถูกตรวจสอบโดยชุมชนจากนั้น โดยวิธีการ: คุณรู้ได้อย่างไรว่าผู้เขียนหมายถึงอะไรยกเว้นคำถามตอนนี้คืออะไร?
Willi Mentzel

คำตอบ:


7

โดยทั่วไปคุณจะอ่านจากอินพุตสตรีมก่อนแล้วจึงปิด คุณสามารถตัด FileInputStream ใน InputStream (หรือ Reader) อื่นได้ ระบบจะปิดโดยอัตโนมัติเมื่อคุณปิดสตรีมการห่อ / เครื่องอ่าน

หากนี่เป็นวิธีที่ส่งคืน InputStream ไปยังผู้โทรผู้โทรมีหน้าที่ปิดสตรีมเมื่อดำเนินการเสร็จสิ้น หากคุณปิดด้วยวิธีการของคุณผู้โทรจะไม่สามารถใช้งานได้

เพื่อตอบความคิดเห็นของคุณ ...

ในการส่งเนื้อหา InputStream ไปยังผู้บริโภคระยะไกลคุณจะต้องเขียนเนื้อหาของ InputStream ไปยัง OutputStream จากนั้นปิดทั้งสองสตรีม

ผู้บริโภคระยะไกลไม่ทราบอะไรเกี่ยวกับวัตถุสตรีมที่คุณสร้างขึ้น เขาเพิ่งได้รับเนื้อหาใน InputStream ซึ่งเขาจะสร้างอ่านและปิด


จะเกิดอะไรขึ้นถ้าฉันต้องการส่งกระแสข้อมูลทางอีเมล .. เป็นไปได้ไหมที่จะปิดอีกด้านหนึ่ง .. หรือไม่จำเป็นต้องปิด
ranjan

2
ออบเจ็กต์สตรีมเองไม่สามารถต่ออนุกรมได้ เนื้อหาของสตรีมสามารถทำให้เป็นอนุกรม - โดยการเขียนเนื้อหาไปยัง OutputStream
sudocode

จริงๆแล้ววัตถุประสงค์ของฉันคือการส่งไฟล์ .. ฉันไม่ต้องการให้มีอะไรทำงานเมื่อฉันส่ง .. เช่นราวกับว่าฉันกำลังส่งสตริง .. เพื่อให้อีกฝ่ายไม่ต้องกังวลกับการปิดอะไรเลย
ranjan

1
ไฟล์ไม่สามารถต่ออนุกรมได้เช่นกัน แต่เนื้อหาของไฟล์สามารถทำให้เป็นอนุกรมได้โดยใช้ OutputStream
sudocode

เป็นไปได้ไหมที่ฉันจะรอเป็นระยะเวลาหนึ่งแล้วปิด
สตรีมอินพุต

136
InputStream is;

try {
    is = new FileInputStream("c://filename");

    is.close(); 
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

return is;

12
เหตุใด "is.close ()" จึงถูกเรียกก่อนที่ "is" จะถูกส่งกลับในตอนท้าย
Talespin_Kit


36

FileInputStream เป็น inputStream

FileInputStream fis = new FileInputStream("c://filename");
InputStream is = fis;
fis.close();  
return is;

ของหลักสูตรนี้จะไม่ทำสิ่งที่คุณต้องการจะทำ ; สตรีมที่คุณส่งคืนถูกปิดไปแล้ว เพียงส่งคืน FileInputStream และดำเนินการให้เสร็จสิ้น รหัสการโทรควรปิด


หรือเพียงแค่กลับfisแม้ว่าฉันไม่แน่ใจว่าจะส่งคืนสตรีมแบบปิด
Bala R

6
นี่มันโง่ - ถ้าคุณปิดfis- คุณก็ปิดด้วยis
RonK

1
ถ้าฉันปิดข้อมูลไฟล์จะไม่ส่ง
ranjan

2
@RonK แน่นอน. นั่นเป็นเหตุผลที่ฉันพูดถึงมัน
Joeri Hendrickx

3
เพียงรหัสสั้น ๆ เพิ่มเติมreturn FileInputStream("c://filename");ในวิธีการที่มีประเภทการส่งคืนInputStream
Yatendra Goel

2

หากคุณรวมสตรีมหนึ่งเข้ากับสตรีมอื่นคุณจะไม่ปิดสตรีมระดับกลางและสำคัญมาก: อย่าปิดสตรีมก่อนที่จะจบโดยใช้สตรีมด้านนอก เพราะคุณจะปิดกระแสด้านนอกด้วย

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