1

Dans le code source de FileDescriptor.java nous variables statiques suivantes:Comportement inattendu des classes FileInputStream et FileOutputStream, lorsqu'il est utilisé avec et des membres statiques de FileDescriptor en JAVA

/** 
    * 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); 

J'utilise ici directement , pas comme System.out. Vérifiez maintenant le programme suivant:

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

Entrée

hello 

Sortie

6 
    104 
    101 
    108 
    108 
    111 
    10 
    0 
    0 

Notez que, même si j'utilise FileDescriptor.out dans le constructeur, il ne donne aucune erreur et fonctionne parfaitement pour le flux d'entrée standard.

Vérifiez un programme plus:

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

Sortie

ABC 

Notez que, même si j'utilise FileDescriptor.in dans le constructeur, il ne donne aucune erreur et fonctionne parfaitement pour la flux de sortie standard.

Je sais que FileDescriptor dans Java est opaque, et je ne devrais pas le comparer avec le concept de descripteur de fichier sous Linux. Je veux juste savoir comment il est créé en Java. Et si une variable statique peut lire et écrire, alors quel est le besoin de trois (in, out et err).

+0

J'ai essayé vos deux extraits de code et dans les deux cas j'ai une exception java.io.IOException: l'accès est refusé. Quelle est exactement votre question? – Armine

+0

En outre, vérifiez ceci: http://tutorials.jenkov.com/java-io/system-in-out-error.html pour plus de détails sur System.in, System.out et System.err. – Armine

+0

Il montre une erreur sur Windows mais s'exécute sous Linux. –

Répondre

3

Si vous exécutez votre test à partir d'un shell, sans redirections, les descripteurs de fichier 0, 1 et 2 sont probablement le même fichier:/dev/tty ou quelque chose comme ça (votre terminal).

Cela expliquerait pourquoi vous pouvez lire/écrire à partir de l'un de ces descripteurs.