Le package Java.io contient presque toutes les classes nécessaires au fonctionnement des entrées et des sorties. Toutes ces classes de flux représentent des sources d'entrée et des destinations de sortie.
Les flux du package Java.io prennent en charge de nombreux formats, tels que les types de base, les objets, les jeux de caractères localisés, etc.
Un flux peut être compris comme une séquence de données. Un flux d'entrée représente la lecture de données à partir d'une source et un flux de sortie représente l'écriture de données vers une destination.
Java offre une prise en charge puissante et flexible des E/S, ce qui le rend plus largement utilisé dans le transfert de fichiers et la programmation réseau.
Mais cette section couvre les fonctions les plus élémentaires liées aux flux et aux E/S. Nous apprendrons ces fonctions à travers des exemples un par un.
La saisie de la console Java est effectuée par System.in.
Pour obtenir un flux de caractères lié à la console, vous pouvez envelopper System.in dans un objet BufferedReader pour créer un flux de caractères.
Voici la syntaxe de base pour créer un BufferedReader :
BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in));
Une fois l'objet BufferedReader créé, nous pouvons utiliser la méthode read() pour lire un caractère depuis la console, ou la méthode readLine() pour lire une chaîne.
Pour lire un caractère d'un objet BufferedReader, utilisez la méthode read(), dont la syntaxe est la suivante :
intread()throwsIOException
Chaque fois que la méthode read() est appelée, elle lit un caractère du flux d'entrée et renvoie ce caractère sous forme de valeur entière. Renvoie -1 à la fin du flux. Cette méthode lève IOException.
Le programme suivant montre l'utilisation de la méthode read() pour lire en continu les caractères de la console jusqu'à ce que l'utilisateur saisisse « q ».
//使用BufferedReader在控制台读取字符importjava.io.*; publicclassBRRead{ publicstaticvoidmain(Stringargs[])throwsIOException { charc; //使用System.in创建BufferedReader BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in)); System.out.println("输入字符, 按下'q' 键退出."); //读取字符do{ c=(char)br.read(); System.out.println(c); }while(c!='q'); } }
Les résultats de compilation et d'exécution de l'exemple ci-dessus sont les suivants :
输入字符, 按下'q' 键退出. 123abcq 1 2 3 a b c q
La lecture d'une chaîne à partir d'une entrée standard nécessite l'utilisation de la méthode readLine() de BufferedReader.
Son format général est :
StringreadLine()throwsIOException
Le programme suivant lit et affiche des lignes de caractères jusqu'à ce que vous saisissiez le mot « fin ».
//使用BufferedReader在控制台读取字符importjava.io.*; publicclassBRReadLines{ publicstaticvoidmain(Stringargs[])throwsIOException { //使用System.in创建BufferedReader BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in)); Stringstr; System.out.println("Enterlinesoftext."); System.out.println("Enter'end'toquit."); do{ str=br.readLine(); System.out.println(str); }while(!str.equals("end")); } }
Les résultats de compilation et d'exécution de l'exemple ci-dessus sont les suivants :
Enterlinesoftext. Enter'end'toquit. Thisislineone Thisislineone Thisislinetwo Thisislinetwo end end
Comme mentionné précédemment, la sortie de la console est complétée par print() et println(). Ces méthodes sont définies par la classe PrintStream et System.out est une référence à l'objet de cette classe.
PrintStream hérite de la classe OutputStream et implémente la méthode write(). De cette façon, write() peut également être utilisé pour écrire des opérations sur la console.
PrintStream définit write() dans sa forme la plus simple comme suit :
voidwrite(intbyteval)
Cette méthode écrit les octets inférieurs en octets dans le flux.
L'exemple suivant utilise write() pour imprimer le caractère « A » suivi d'un caractère de nouvelle ligne à l'écran :
importjava.io.*; //演示System.out.write(). publicclassWriteDemo{ publicstaticvoidmain(Stringargs[]){ intb; b='A'; System.out.write(b); System.out.write('n'); } }
Exécutez l'exemple ci-dessus pour afficher le caractère « A » dans la fenêtre de sortie.
A
Remarque : La méthode write() n'est pas souvent utilisée car les méthodes print() et println() sont plus pratiques à utiliser.
Comme mentionné précédemment, un flux est défini comme une séquence de données. Le flux d'entrée est utilisé pour lire les données de la source et le flux de sortie est utilisé pour écrire des données sur la cible.
La figure suivante est un diagramme hiérarchique de classes décrivant le flux d'entrée et le flux de sortie.
Les deux flux importants qui seront abordés ci-dessous sont FileInputStream et FileOutputStream :
Ce flux est utilisé pour lire les données d'un fichier et ses objets peuvent être créés à l'aide du mot-clé new.
Il existe différentes méthodes de constructeur utilisées pour créer des objets.
Vous pouvez utiliser un nom de fichier chaîne pour créer un objet de flux d'entrée afin de lire le fichier :
InputStreamf=newFileInputStream("C:/java/hello");
Vous pouvez également utiliser un objet fichier pour créer un objet de flux d'entrée afin de lire le fichier. Nous devons d'abord créer un objet fichier en utilisant la méthode File() :
Filef=newFile("C:/java/hello"); InputStreamf=newFileInputStream(f);
Après avoir créé un objet InputStream, vous pouvez utiliser les méthodes suivantes pour lire le flux ou effectuer d'autres opérations sur le flux.
numéro de série | Méthodes et description |
---|---|
1 | public void close() throws IOException{} Ferme ce flux d'entrée de fichier et libère toutes les ressources système liées à ce flux. Lève une IOException. |
2 | protected void finalize()throws IOException {} Cette méthode efface la connexion au fichier. Assurez-vous d'appeler la méthode close du flux d'entrée du fichier lorsqu'il n'est plus référencé. Lève une IOException. |
3 | public int read(int r)throws IOException{} Cette méthode lit les octets de données spécifiés à partir de l'objet InputStream. Renvoyé sous forme de valeur entière. Renvoie l'octet de données suivant, ou -1 si la fin a été atteinte. |
4 | public int read(byte[] r) throws IOException{} Cette méthode lit les octets r.length du flux d'entrée. Renvoie le nombre d'octets lus. Si c'est la fin du fichier, -1 est renvoyé. |
5 | public int available() throws IOException{} Renvoie le nombre d'octets pouvant être lus à partir de ce flux d'entrée sans blocage par le prochain appel de méthode sur ce flux d'entrée. Renvoie une valeur entière. |
En plus d'InputStream, il existe d'autres flux d'entrée. Pour plus de détails, veuillez consulter le lien ci-dessous :
ByteArrayInputStream
Flux d'entrée de données
Cette classe est utilisée pour créer un fichier et écrire des données dans le fichier.
Si le fichier cible n'existe pas avant que le flux n'ouvre le fichier pour la sortie, le flux crée le fichier.
Deux constructeurs peuvent être utilisés pour créer des objets FileOutputStream.
Créez un objet de flux de sortie à l'aide d'un nom de fichier chaîne :
OutputStreamf=newFileOutputStream("C:/java/hello")
Vous pouvez également utiliser un objet fichier pour créer un flux de sortie à écrire dans le fichier. Nous devons d'abord créer un objet fichier en utilisant la méthode File() :
Filef=newFile("C:/java/hello"); OutputStreamf=newFileOutputStream(f);
Après avoir créé l'objet OutputStream, vous pouvez utiliser les méthodes suivantes pour écrire dans le flux ou effectuer d'autres opérations sur le flux.
numéro de série | Méthodes et description |
---|---|
1 | public void close() throws IOException{} Ferme ce flux d'entrée de fichier et libère toutes les ressources système liées à ce flux. Lève une IOException. |
2 | protected void finalize()throws IOException {} Cette méthode efface la connexion au fichier. Assurez-vous d'appeler la méthode close du flux d'entrée du fichier lorsqu'il n'est plus référencé. Lève une IOException. |
3 | public void write(int w)throws IOException{} Cette méthode écrit les octets spécifiés dans le flux de sortie. |
4 | public void write(byte[] w) écrit les octets de longueur w.length dans le tableau spécifié dans OutputStream. |
En plus d'OutputStream, il existe d'autres flux de sortie. Pour plus de détails, veuillez consulter le lien ci-dessous :
ByteArrayOutputStream
DataOutputStream
Voici un exemple illustrant l'utilisation de InputStream et OutputStream :
import java.io.*; public class fileStreamTest { public static void main(String args[]) { try { byte bWrite[] = { 11, 21, 3, 40, 5 }; OutputStream os = new FileOutputStream("test.txt"); for (int x = 0; x < bWrite.length; x++) { os.write(bWrite[x]); // writes the bytes } os.close(); InputStream is = new FileInputStream("test.txt"); int size = is.available(); for (int i = 0; i < size; i++) { System.out.print((char) is.read() + " "); } is.close(); } catch (IOException e) { System.out.print("Exception"); } } }
Le programme ci-dessus crée d'abord le fichier test.txt, écrit le numéro donné dans le fichier sous forme binaire et l'affiche sur la console.
Étant donné que le code ci-dessus est écrit en binaire, il peut y avoir des caractères tronqués. Vous pouvez utiliser les exemples de code suivants pour résoudre le problème de code tronqué :
//文件名:fileStreamTest2.java importjava.io.*; publicclassfileStreamTest2{ publicstaticvoidmain(String[]args)throwsIOException{ Filef=newFile("a.txt"); FileOutputStreamfop=newFileOutputStream(f); //构建FileOutputStream对象,文件不存在会自动新建OutputStreamWriterwriter=newOutputStreamWriter(fop,"UTF-8"); //构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk writer.append("中文输入"); //写入到缓冲区writer.append("rn"); //换行writer.append("English"); //刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入writer.close(); //关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉fop.close(); //关闭输出流,释放系统资源 FileInputStreamfip=newFileInputStream(f); //构建FileInputStream对象InputStreamReaderreader=newInputStreamReader(fip,"UTF-8"); //构建InputStreamReader对象,编码与写入相同 StringBuffersb=newStringBuffer(); while(reader.ready()){ sb.append((char)reader.read()); //转成char加到StringBuffer对象中 } System.out.println(sb.toString()); reader.close(); //关闭读取流fip.close(); //关闭输入流,释放系统资源 } }
Il existe également quelques cours sur les fichiers et les E/S que nous devons également connaître :
Classe de fichier (classe)
Classe FileReader (classe)
Classe FileWriter (classe)
Il existe deux méthodes dans la classe File qui peuvent être utilisées pour créer des dossiers :
La méthode mkdir() crée un dossier et renvoie true en cas de succès et false en cas d'échec. Un échec indique que le chemin spécifié par l'objet File existe déjà ou que le dossier ne peut pas être créé car le chemin complet n'existe pas encore.
La méthode mkdirs() crée un dossier et tous ses dossiers parents.
L'exemple suivant crée le dossier "/tmp/user/java/bin" :
importjava.io.File; publicclassCreateDir{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp/user/java/bin"; Filed=newFile(dirname); //现在创建目录d.mkdirs(); } }
Compilez et exécutez le code ci-dessus pour créer le répertoire "/tmp/user/java/bin".
Remarque : Java résout automatiquement les séparateurs de chemin de fichier par convention sous UNIX et Windows. Si vous utilisez le délimiteur (/) dans la version Windows de Java, le chemin sera toujours analysé correctement.
Un répertoire est en fait un objet File qui contient d'autres fichiers et dossiers.
Si vous créez un objet File et qu'il s'agit d'un répertoire, l'appel de la méthode isDirectory() renverra true.
Vous pouvez extraire la liste des fichiers et dossiers qu'il contient en appelant la méthode list() sur l'objet.
L'exemple ci-dessous illustre comment utiliser la méthode list() pour vérifier le contenu d'un dossier :
importjava.io.File; publicclassDirList{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp"; Filef1=newFile(dirname); if(f1.isDirectory()){ System.out.println("Directoryof"+dirname); Strings[]=f1.list(); for(inti=0;i<s.length;i++){ Filef=newFile(dirname+"/"+s[i]); if(f.isDirectory()){ System.out.println(s[i]+"是一个目录"); }else{ System.out.println(s[i]+"是一个文件"); } } }else{ System.out.println(dirname+"不是一个目录");
} } }
importjava.io.File; publicclassDirList{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp"; Filef1=newFile(dirname); if(f1.isDirectory()){ System.out.println("Directoryof"+dirname); Strings[]=f1.list(); for(inti=0;i<s.length;i++){ Filef=newFile(dirname+"/"+s[i]); if(f.isDirectory()){ System.out.println(s[i]+"是一个目录"); }else{ System.out.println(s[i]+"是一个文件"); } } }else{ System.out.println(dirname+"不是一个目录");
} } }
Les résultats de compilation et d'exécution de l'exemple ci-dessus sont les suivants :
目录/tmp bin 是一个目录lib 是一个目录demo 是一个目录test.txt 是一个文件README 是一个文件index.html 是一个文件include 是一个目录
Pour supprimer un fichier, utilisez la méthode java.io.File.delete().
Le code suivant supprimera le répertoire /tmp/java/. Il convient de noter que lors de la suppression d'un certain répertoire, vous devez vous assurer qu'il n'y a pas d'autres fichiers dans le répertoire pour le supprimer correctement, sinon la suppression échouera.
Structure du répertoire de test :
/tmp/java/ |-- 1.log |-- tester
import java.io.File; public class DeleteFileDemo { public static void main(String args[]) { // 这里修改为自己的测试目录File folder = new File("/tmp/java/"); deleteFolder(folder); } // 删除文件及目录public static void deleteFolder(File folder) { File[] files = folder.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { deleteFolder(f); } else { f.delete(); } } } folder.delete(); } }