2010-01-24 2 views
12

Kann außer einer anonymen Klasse (new OutputStream() { ... }) jemand ein moralisches Äquivalent von new FileOutputStream("/dev/null") vorschlagen, das auch unter Windows funktioniert?plattformunabhängig/dev/null Ausgabe-Senke für Java

Falls jemand sich fragt, wofür ist das?

Ich habe ein Programm, das eine Konsistenzanalyse für eine Datei durchführt. Es hat eine 'verbose' Option. Wenn die ausführliche Option aktiviert ist, möchte ich eine Menge Ausgaben sehen. Das Programm ist nicht in Eile, es ist ein Werkzeug, also anstatt alle diese extra if Anweisungen zu schreiben, um zu testen, ob ich die Ausgabe möchte, möchte ich es nur in den Bit-Bucket schreiben, wenn nicht gewünscht.

+0

Warum wollen Sie sich nicht nur um die Daten zu verwerfen? –

+0

@Tom Hawtin - Tackline bearbeitet um zu erklären. – bmargulies

+0

Okay. Ich dachte, du würdest "anonyme Klasse" machen, was @iseletsk vorgeschlagen hat. –

Antwort

18

können Sie NullOutputStream verwenden, um von Apache Commons https://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/output/NullOutputStream.html

Oder einfach implementieren Ihre eigenen

package mypackage; 

import java.io.OutputStream; 
import java.io.IOException; 

public class NullOutputStream extends OutputStream { 
    public void write(int i) throws IOException { 
     //do nothing 
    } 
} 
+3

(Das Null-Objektmuster, ein Sonderfall des Sonderfallmusters.) (Ich würde eine Überschreibung hinzufügen (mit @ Überschreiben) von 'write (int, int, byte [])' für zusätzliche (obwohl wahrscheinlich irrelevante) Leistung Ich habe immer eine einzige Instanz für das Null-Objekt verwendet, aber ich nehme an, dass Sie externe Sperrprobleme ('Reader') bekommen könnten/'Writer's haben hier ein Problem mit Decorators.) (Dieser Kommentar enthält einen absichtlichen Fehler.) –

+0

Guter Punkt über '@ Override', der den absichtlichen Fehler fängt. – trashgod

+0

Ich würde alle "write()" Methoden überschreiben wollen. Ich schätze, die JVM könnte schlau genug sein, um herauszufinden, dass ein geschachtelter Schreibvorgang eines Arrays immer noch ein No-Op ist und diese auch als Nicht-Ops behandelt, aber ich hasse es, von JVM-Laufzeitoptimierungen abhängig zu sein. –

4

NUL funktioniert für Windows NT, aber das funktioniert nicht in * NIX.

output = new FileOutputStream("NUL"); 

Bessere Nutzung NullOutputStream der Commons IO stattdessen Plattform unabhängig zu sein.

+1

NUL funktioniert nicht unter Unix. Es ist eine DOS Remniscence. –

+0

Vielen Dank für die Bestätigung. Hatte keine Nix-Plattform direkt zur Hand, um zu testen :) – BalusC

+0

Kopf, wenn ich bearbeite, um nur den Commons IO-Vorschlag zu behalten? – bmargulies