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.
4 Réponses :
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:
fis.read() != -1
(résultat boolean
) puis on l'assigne à i
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.
Ç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
.
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.
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.
probablement,
for (int i = fis.read(), i >= 0, i = fis.read()) { System.out.print((char) i ); }
est plus lisibleNotez 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 commea = b == c
il serait interprété comme s'il était écrit commea = (b == c)
mais dans le cas de votre exemple vous voulez d'abord attribuer la valeur defis.read()
ài
, puis la comparer à-1
.De plus, votre code ne contient pas
if ((i = fis.read()) != -1)
maiswhile ((i = fis.read()) != -1)
.mec apprécié