L'objet FileInputStream ne fonctionne pas

Résolu
Bonjour,
d'après le tutoriel de site du zéro "pour que l'objet FileInputStream fonctionne, le fichier doit exister ! "Mon problème c'est que le fichier "test.txt" existe mais le programme ne compile pas, je ne vois pas pour quoi ?

2 réponses

  1. Contributeur
    Hello,

    Peux-tu mettre ton code, ainsi que les messages d'erreur de compilation que tu as ?
    1. merci pour ta réponse :)

      Voici le code:

      package IO;

      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileNotFoundException;
      import java.io.FileOutputStream;
      import java.io.IOException;

      public class Main2 {

      public static void main(String[] args) {

      // Nous déclarons nos objets en dehors du bloc try/catch
      FileInputStream fis = null;
      FileOutputStream fos = null;

      try {

      // On instancie nos objets :
      // fis va lire le fichier
      // fos va écrire dans le nouveau !
      fis = new FileInputStream(new File("test.txt"));
      fos = new FileOutputStream(new File("test2.txt"));

      // On crée un tableau de byte pour indiquer le nombre de bytes lus à chaque tour de boucle
      byte[] buf = new byte[8];

      // On crée une variable de type int pour y affecter le résultat de la lecture, Vaut -1 quand c'est fini
      int n = 0;

      // Tant que l'affectation dans la variable est possible,on boucle/ Lorsque la lecture du fichier est terminée l'affectation n'est plus possible !
      // On sort donc de la boucle
      while ((n = fis.read(buf)) >= 0) {

      // On écrit dans notre deuxième fichier avec l'objet adéquat
      fos.write(n);

      // On affiche ce qu'a lu notre boucle au format byte et au format char
      for (byte bit : buf) {
      System.out.print("\t" + bit + "(" + (char) bit + ")");
      System.out.println("");
      }
      //Nous réinitialisons le buffer à vide
      //au cas où les derniers byte lus ne soient pas un multiple de 8
      //Ceci permet d'avoir un buffer vierge à chaque lecture et ne pas avoir de doublon en fin de fichier

      buf = new byte[8];
      }
      System.out.println("Copie terminée !");

      }
      catch (FileNotFoundException e) {

      // Cette exception est levée si l'objet FileInputStream ne trouve
      // aucun fichier
      e.printStackTrace();

      }
      catch (IOException e) {

      // Celle-ci se produit lors d'une erreur d'écriture ou de lecture
      e.printStackTrace();

      }
      finally {

      // On ferme nos flux de données dans un bloc finally pour s'assurer
      // que ces instructions seront exécutées dans tous les cas même si
      // une exception est levée !
      try {

      if (fis != null)
      fis.close();

      }
      catch (IOException e) {
      e.printStackTrace();
      }
      try {

      if (fos != null)
      fos.close();

      }
      catch (IOException e) {

      e.printStackTrace();

      }

      }

      }

      }

      Et voici le message d'erreur:

      java.io.FileNotFoundException: test.txt (Le fichier spécifié est introuvable)
      at java.io.FileInputStream.open(Native Method)
      at java.io.FileInputStream.<init>(Unknown Source)
      at IO.Main2.main(Main2.java:23)

      Sachant que
      j'ai un fichier test.txt dans la racine de mon projet Eclipse .
      1. Modérateur
        Au lieu de mettre ton fichier à la racine du projet, mets le dans le répertoire bin (ou mieux : mets un chemin absolu genre C:/test.txt)
      2. mmmm ça n'a pas fonctionné, moi ce que j'ai pas compris est qu'est ce qu'il veut dire par "Pour que l'objet FileInputStream fonctionne, le fichier doit exister " [cette phrase est écrit dans le tutoriel] , l'existence de fichier est dans le pc ou bien où exactement ?
      3. Modérateur
        Dans le classpath. En effet tu utilises une location relative, tu considères donc que tu as un répertoire courant, celui-ci est défini dans les configuration du projet (c'est Eclipse qui gère).
        D'habitude Eclipse défini le répertoire courant à la racine du projet, même si par défaut c'est dans le bin qu'il est. Ici tu as peut-être une configuration particulière donc tu devrais faire un affichage du répertoire courant comme ceci :

        System.out.println(new File("").getAbsolutePath());
        Ton fichier test.txt devra être mis dans le dossier qui est affiché.
      4. en fin le programme a compilé, c'est dans le fichier où j'ai le bin - src- .settings
        Merci beaucoup KX c'est gentil :)
      5. Modérateur
        Le dossier où tu as le bin, src, .settings, c'est ça qu'on appelle la racine du projet...