1

Im Quellcode von FileDescriptor.java verwendet:unerwartetes Verhalten von Fileinputstream & Outputstream-Klassen, wenn sie mit in die und aus statischen Mitgliedern FileDescriptor in JAVA haben wir folgende statische Variablen

/** 
    * A handle to the standard input stream. Usually, this file 
    * descriptor is not used directly, but rather via the input stream 
    * known as <code>System.in</code>. 
    * 
    * @see java.lang.System#in 
    */ 
    public static final FileDescriptor in = new FileDescriptor(0); 

    /** 
    * A handle to the standard output stream. Usually, this file 
    * descriptor is not used directly, but rather via the output stream 
    * known as <code>System.out</code>. 
    * @see java.lang.System#out 
    */ 
    public static final FileDescriptor out = new FileDescriptor(1); 

Hier habe ich es direkt bin mit , nicht als System.out. Überprüfen Sie nun das folgende Programm:

import java.io.*; 
public class First 
{ 
    public static void main(String[] args) throws Exception 
    { 
     FileInputStream fis = new FileInputStream(FileDescriptor.out); 
     byte[] b = new byte[8]; 
     System.out.println(fis.read(b));//6 
     for(byte b1: b) 
     { 
      System.out.println(b1); 
     } 
    } 
} 

Eingang

hello 

Ausgabe

6 
    104 
    101 
    108 
    108 
    111 
    10 
    0 
    0 

Beachten Sie, dass, auch wenn ich FileDescriptor.out im Konstruktor verwende, es keine Fehler geben und funktioniert perfekt für den Standard-Eingangsstrom.

prüfen ein weiteres Programm:

import java.io.*; 
public class First 
{ 
    public static void main(String[] args) throws Exception 
    { 
     FileOutputStream fos = new FileOutputStream(FileDescriptor.in); 
     byte[] b = {65, 66, 67}; 
     fos.write(b); 
    } 
} 

Ausgabe

ABC 

Beachten Sie, dass, auch wenn ich FileDescriptor.in im Konstruktor verwende, es wird keine Störungen geben und perfekt für die Arbeit Standard-Ausgabestrom

Ich weiß, FileDescriptor in Java ist undurchsichtig, und ich sollte es nicht mit dem Datei-Deskriptor-Konzept in Linux vergleichen. Ich möchte nur wissen, wie es in JAVA erstellt wird. Und wenn eine statische Variable sowohl lesen als auch schreiben kann, dann braucht es drei (in, out und err).

+0

Ich habe versucht, beide Code-Schnipsel und in beiden Fällen habe ich eine java.io.IOException: Zugriff verweigert. Was genau ist deine Frage? – Armine

+0

Überprüfen Sie auch diese: http://tutorials.jenkov.com/java-io/system-in-out-error.html für weitere Details über System.in, System.out und System.err. – Armine

+0

Es zeigt einen Fehler unter Windows an, läuft aber unter Linux. –

Antwort

3

Wenn Sie Ihren Test von einer Shell ohne Umleitungen ausführen, dann sind die Dateideskriptoren 0, 1 und 2 wahrscheinlich die gleiche Datei:/dev/tty oder etwas ähnliches (Ihr Terminal).

Das würde erklären, warum Sie von jedem dieser Deskriptoren lesen/schreiben können.

Verwandte Themen