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 à ifis.read() et l' fis.read() à i puis vérifions i != -1Mais 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
InputStreamReadersi 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 == cil 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é