3
votes

Que faire exactement si ((i = fis.read ())! = -1) signifie dans ce programme?

package IO;
import java.io.*;
public class test {

public static void main(String[] args) throws IOException {
    File f1 = new File("C:\\Users\\rs\\New folder\\myname.txt");
    try {
        FileInputStream fis = new FileInputStream(f1);
        int i = fis.read();     
        System.out.print((char)i);
        while((i = fis.read())!= -1) {
            System.out.print((char) i );
        }
        
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    

 }

}
I am a new java programmer and i have a trouble in this code. This code reads bytes from my file (f1) and I can cast this bytes to char and print them, but something is here that I do not understand and its the condition in my while loop. What it exactly means? I mean what exactly if ((i = fis.read()) != -1) means??? And the second question is why we put
i = fis.read() in a paranthesis???
My file has a text (1 line) in it.

5 commentaires

probablement, for (int i = fis.read(), i >= 0, i = fis.read()) { System.out.print((char) i ); } est plus lisible


Notez que 1) les flux d'entrée sont destinés à la lecture d'octets, pas de caractères: utilisez un InputStreamReader si vous souhaitez lire des caractères; 2) la lecture sur la déclaration de variable et l'impression immédiatement suivante ne doivent pas être là: si le fichier est vide, la lecture donnera -1.


"pourquoi nous mettons i = fis.read () entre parenthèses" à cause de la priorité des opérateurs . L'opérateur d'affectation = a une priorité inférieure à l'opérateur de comparaison != Ou == donc si nous avons du code comme a = b == c il serait interprété comme s'il était écrit comme a = (b == c) mais dans le cas de votre exemple vous voulez d'abord attribuer la valeur de fis.read() à i , puis la comparer à -1 .


De plus, votre code ne contient pas if ((i = fis.read()) != -1) mais while ((i = fis.read()) != -1) .


mec apprécié


4 Réponses :


3
votes

Première question

Cela signifie que vous continueriez à lire à partir du flux jusqu'à ce que vous ayez atteint la fin. Lorsque fis.read() renvoie -1 , cela signifie que vous avez atteint la fin du flux et qu'il n'y a plus de données à lire.

Deuxième question

i = fis.read() != -1

Vous pourriez avoir l'impression que le compilateur ne connaît pas le bon ordre d'exécution et il existe deux scénarios:

  • On vérifie fis.read() != -1 (résultat boolean ) puis on l'assigne à i
  • Nous obtenons fis.read() et l' fis.read() à i puis vérifions i != -1

Mais java a des règles bien définies, il n'y en a qu'une à cause de la priorité des opérateurs.

Consultez le tableau à l' adresse : https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

L'affectation a une priorité inférieure à != , Donc le premier scénario se produira certainement. Mais ce n'est pas ce que nous voulons. (Nous ne voulons pas que i soit le résultat booléen de fis.read() != -1 )

Voir également: https://introcs.cs.princeton.edu/java/11precedence/#:~:text=Java%20has%20well-defined%20rules,be%20overridden%20by%20explicit%20parentheses .

"Les règles de préséance peuvent être remplacées par des parenthèses explicites"

Nous mettons donc explicitement les parenthèses pour nous assurer que l'instruction à l'intérieur ( i = fis.read() ) est exécutée en premier et que le deuxième scénario se produit.


0 commentaires

2
votes

Ça veut dire

"lire jusqu'à trouver la fin du fichier char".

Et pour la deuxième question:

while((i = fis.read())!= -1) {
    System.out.print((char) i );
}

Le (i = fis.read()) définit cette "variable i" pour l'impression ci-dessous tout en vérifiant si elle est différente de -1 .


0 commentaires

2
votes

Vous pouvez penser à (i = fis.read())!= -1 comme faisant deux choses distinctes.

Le premier i = fis.read() est exécuté. Autrement dit, vous lisez un octet dans le flux d'entrée. S'il n'y a rien à lire, alors i est mis à -1.

Deuxièmement, cette comparaison se produit: i != -1 Si c'est vrai, la boucle continue. Si c'est faux, la boucle se termine.


0 commentaires

3
votes

FileInputStream read() FileInputStream suit cette logique:

Lit un octet de données à partir de ce flux d'entrée. Cette méthode bloque si aucune entrée n'est encore disponible.

La méthode retournera :

L'octet suivant de données, ou -1 si la fin du fichier est atteinte.

Donc -1 est son drapeau pour le contrôle EOF . Dans cet esprit, cet extrait de code

while((i = fis.read())!= -1) 
      System.out.print((char) i);
  

Dit que:

1 . Assignez fis.read() à la var i

2a . Si i != -1 , affichez le ASCII char représentant l'entier que vous venez de lire dans le flux d'entrée et continuez la boucle .

2b . Si i == -1 , terminer la boucle / arrêter la lecture, car elle a atteint la fin du fichier.


0 commentaires