มี Null OutputStream ใน Java หรือไม่?


คำตอบ:


21

ตั้งแต่ Java 11 มียูทิลิตี้แบบคงที่ที่ตอบสนองสิ่งที่คุณต้องการวิธีการโรงงานแบบคงที่OutputStream.nullOutputStream():

ส่งคืน OutputStream ใหม่ซึ่งละทิ้งไบต์ทั้งหมด สตรีมที่ส่งคืนจะเปิดในตอนแรก สตรีมถูกปิดโดยเรียกเมธอด close () การเรียกเพื่อปิด () ในภายหลังจะไม่มีผล


เยี่ยมมากขอบคุณที่ชี้ให้เห็น! แต่ "ตั้งแต่ Java 11"? ฉันคิดว่า Java 11 ออกมาได้เพียงหนึ่งสัปดาห์เท่านั้น
Brandon Yarbrough

116
/**Writes to nowhere*/
public class NullOutputStream extends OutputStream {
  @Override
  public void write(int b) throws IOException {
  }
}

15
นอกจากนี้ยังสามารถใช้งานได้อย่างง่ายดายทุกที่ที่คุณต้องการโดยใช้สิ่งนี้: OutputStream nullOutputStream = new OutputStream() { @Override public void write(int b) { } };
Hank Schultz


42

มันไม่ได้กล่าวถึงยังดังนั้นฉันยังจะเพิ่มฝรั่ง 's ByteStreams nullOutputStream ()เนื่องจากบางคนอาจชอบ Guava มากกว่า Apache Commons IO หรือมีอยู่แล้วในโครงการของตน

หมายเหตุ:หากคุณใช้รุ่นเก่าของฝรั่ง (1.0-13.0), คุณต้องการที่จะใช้com.google.io.NullOutputStream


15

ทบทวนคำตอบที่ให้ไว้แล้ว -

Java ไม่มีNullOutputStreamคลาส อย่างไรก็ตามคุณสามารถม้วนของคุณเองโดยOutputStreamไม่สนใจข้อมูลใด ๆ ที่เขียนลงไป - กล่าวอีกนัยหนึ่งwrite(int b)คือwrite(byte[] b)และwrite(byte[] b, int off, int len)จะมีเนื้อหาของวิธีการที่ว่างเปล่า นี่คือสิ่งที่NullOutputStreamคลาสIO ทั่วไปทำ



3

ไม่ได้อยู่ในไลบรารีมาตรฐาน AFAIK แต่ไม่ควรยากที่จะสร้างขึ้นมาใหม่โดยการลบล้างการเขียนใน OutputStream


เหตุใดจึงได้รับการโหวตลดลง การใช้โซลูชันนี้เป็นเรื่องเล็กน้อยตามที่ McDowell แสดงไว้ข้างต้น
pdxleif

3

ไม่ แต่มันค่อนข้างง่ายที่จะนำไปใช้

ดูคำถามนี้"วิธีลบ System.out.println จาก codebase"

จากนั้นคุณต้อง:

System.setOut( DevNull.out );

หรืออะไรทำนองนั้น :)

System.setOut (PrintStream)


ฉันได้รับข้อผิดพลาด: "ไม่สามารถกำหนดค่าให้กับตัวแปรสุดท้าย"
David Grayson


1

มีเด็กใหม่ในเมืองที่ดูแลอย่างมีเสน่ห์รหัสเพียงไม่กี่บรรทัดก็น่าจะใช้ได้ มันJDK 11และnullWriter ()ได้รับการแนะนำที่นั่นที่จะดูแลเรื่องนี้ ต่อไปนี้เป็นรหัสเพื่อจัดการกับปัญหาเดิม ๆ วิธีใหม่โดยไม่ต้องกังวลเกี่ยวกับระบบปฏิบัติการ (OS)

String fileContent = "Welcome to StackOverflow readers !! Here goes the question link...";
Writer writer = Writer.nullWriter();
writer.write(fileContent);
writer.close();

หวังว่านี่อาจช่วยใครบางคนได้!


0

ฉันเชื่อว่านี่คือสิ่งที่คุณกำลังมองหาฉันกำลังมองหาสิ่งเดียวกัน: นี่คือการเปลี่ยนเส้นทางสตรีมเอาต์พุตจากข้อผิดพลาดมาตรฐานออกมาตรฐานในอ็อบเจ็กต์ ProcessBuilder

Blockquote

pb.redirectError( ProcessBuilder.Redirect.appendTo( new File( "NUL:" ) ) );
  • ดอม

นี่คือ Windows เฉพาะ
peterh

-4

ByteArrayOutputStreamคือสิ่งที่คุณต้องการ (สมมติว่า API จะส่งออกข้อความ) เพียงแค่สร้างอินสแตนซ์ใหม่


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