Pb de compilation

quader58 Messages postés 3 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 18 octobre 2009 - 14 oct. 2009 à 16:17
 Utilisateur anonyme - 19 oct. 2009 à 01:17
Bonjour,
Je souhaiterais que quelqu'un puisse m'expliquer, voir me donner la syntaxe exacte de javac pour arriver à compiler une class dans laquelle il y a un import java.io. Mon problème est le suivant, je developpe une appli sous webdev et je voudrais appeler une class Java qui me permettrais de copier un fichier d'un poste sur le serveur. J'ai trouvé sur le net une class qui copie un fichier que j'ai mis en copie ci dessous. Apparemment lorsque je compile ma classe je me demande si il fait bien l'import. Sinon est ce qu'il faut que j'utilise un autre fichier que ma classe lorsque je l'utilise à partir de webdev.

Merci pour votre aide

import java.io.*;

public class TransfertFichier {

public static boolean copyFile(File in, File out) throws IOException {
FileInputStream fis = new FileInputStream(in);
FileOutputStream fos = new FileOutputStream(out,true);

try {
int i;
byte[] buf = new byte[1024];
fis.skip(out.length());
while ((i = fis.read(buf)) != -1) {
fos.write(buf,0, i);
//System.out.println(out.length());
}
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (fis != null) fis.close();
if (fos != null) fos.close();
}
return true;
}

}

7 réponses

kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
15 oct. 2009 à 09:35
Salut,

j'ai pas compris ton problème. T'as une erreur de compil, c'est ça ? quel est le message ?
0
Utilisateur anonyme
15 oct. 2009 à 09:54
Salut,

Quel est le problème?

Dis nous au moins ce qui se passe quand tu veux compiler (et donc quel est la commande javac que tu utilises)

As tu un ou des messages d'erreur.

Ce qui est certain, c'est que la classe TransfertFichier compile sans erreur, ce qui ne veut pas dire que le résultat sera correct (on n'en est pas encore là...)

Une certitude:
On ne peut pas exécuter directement cette classe qui n'as pas de méthode main mais il faut le faire depuis le programme utilisateur, en lui passant le nom du fichier in et le nom du fichier out en paramètres, donc modifier ...copyFile(File in, File out)... en ...copyFile(String in, String out)... Plus exactement, c'est la méthode copyFile de la classe TransfertFichier qu'on doit appeler.

 boolean b = TransfertFichier.copyFile("nomDuFichierIn.type", "nomDuFichierOut.type");
            System.out.println("b = " + b);


Pourquoi boolean b = ...
Parcequ'il y a return ...

Mais encore une fois, celà ne veut pas dire que que la classe TransfertFichier fonctionne même si elle compile.

Cordialement,

...\ Dan /...
0
quader58 Messages postés 3 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 18 octobre 2009
15 oct. 2009 à 22:44
Bonjour kirua12 et danimo merci de vouis interesser a mon problème.

Je vais essayer vous donner tous les infos nécessaire pour comprendre mon problème mais n'oublier pas que mon programme est fait sous Webdev et qu'il permet d'appeler du code java.

Commençons par une petite explication de webdev.
Il existe deux instructions pour utiliser JAVA
- JAVAEXECUTE : Lance une application ou une applet Java en appelant la méthode "Main" d'une classe Java donnée.
JavaExécute(<Nom de la classe> [,])

- JAVAEXECUTEFONCTION : Lance une fonction statique spécifique d'une classe Java donnée.
JavaExécuteFonction(<Nom de la classe>, <Nom de la fonction>, <Type de retour> [, ... [, ]])

J'ai fait un essai avec la fonction JAVAEXECUTE et le code suivant et cela fonctionne le fichier est copier.

import java.io.*;

public class TransfertFichier {

public static boolean copyFile(File in, File out) throws IOException {
FileInputStream fis = new FileInputStream(in);
FileOutputStream fos = new FileOutputStream(out,true);
try {
int i;
byte[] buf = new byte[1024];
fis.skip(out.length());
while ((i = fis.read(buf)) != -1) {
fos.write(buf,0, i);
//System.out.println(out.length());
}
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (fis != null) fis.close();
if (fos != null) fos.close();
}
return true;
}

public static void main(String args[]) throws Exception{
try{
copyFile(new File("C:/temp/ping/toto.tmp"), new File("C:/essai/toto.tmp"));
}
catch (IOException e) {
e.printStackTrace();
}
}
}

Maintenant si j'enlève la fonction main et que j'utilise JAVAEXECUTEFONCTION j'ai une erreur sous Webdev qui dit qu'il ne trouve pas le methode copyFile dans la classe Transfertfichier.

Je ne sais pas si vous aller pouvoir m'aider mais je remercie pour le temps que vous me consacrez.
0
Utilisateur anonyme
16 oct. 2009 à 00:22
Salut,

Puisque:

- JAVAEXECUTEFONCTION : Lance une fonction statique spécifique d'une classe Java donnée. 
JavaExécuteFonction(<Nom de la classe>, <Nom de la fonction>, <Type de retour> [,  ... [, ]]) 

passe <Type de retour>, ce n'est pas copyFile que Vebdev ne trouve pas, mais copyFile(File in, File out) sans le paramètre <Type de retour>,

Il faudrait:
public static boolean copyFile(File in, File out, boolean b) throws IOException {


Cordialement,


...\ Dan /...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
16 oct. 2009 à 03:36
RE,

J'ai modifié comme ceci:

-AVEC MÉTHODE main

   import java.io.*;
   
//Avec méthode main

    public class TransfertFichierAvecMain {
      private static boolean b;
      private static FileInputStream fis;
      private static FileOutputStream fos;
      
       public static void copyFile(File in, File out) throws IOException {
         try
         {
            fis = new FileInputStream(in);
            fos = new FileOutputStream(out);
            int i; 
            byte[] buf = new byte[1024];
            fis.skip(out.length()); 
            while ((i = fis.read(buf)) != -1) { 
               fos.write(buf,0, i); 
            //System.out.println(out.length()); 
            } 
         } 
             catch (FileNotFoundException fnfe) { 
               fnfe.printStackTrace(); 
            } 
             catch (IOException ioee) { 
               ioee.printStackTrace(); 
            } 
         finally
         { 
            if (fis != null)
            {
               fis.close();
               b = true;
            }
            if (fos != null)
            {
               fos.close();
               b = true;
            }
         }
      
      } 
   
       public static void main(String args[]) throws Exception{
       
         System.out.println("b = " + b);
         try{ 
            copyFile(new File("a_lire2.txt"), new File("a_lire2Cop.txt")); 
         } 
             catch (IOException e) { 
               e.printStackTrace(); 
            }
         System.out.println("b = " + b);
      }
   }


-SANS MÉTHODE main

   import java.io.*;
   
//Sans méthode main

    public class TransfertFichier {
      private static FileInputStream fis;
      private static FileOutputStream fos;
       public static boolean copyFile(File in, File out, boolean b) throws IOException {
         System.out.println("b = " + b);
         try
         {
            fis = new FileInputStream(in);
            fos = new FileOutputStream(out);
            int i; 
            byte[] buf = new byte[1024];
            fis.skip(out.length()); 
            while ((i = fis.read(buf)) != -1) { 
               fos.write(buf,0, i); 
            //System.out.println(out.length()); 
            } 
         } 
             catch (FileNotFoundException fnfe) { 
               fnfe.printStackTrace(); 
            } 
             catch (IOException ioee) { 
               ioee.printStackTrace(); 
            } 
         finally
         { 
            if (fis != null)
            {
               fis.close();
               b = true;
            }
            else b = false;
            if (fos != null)
            {
               fos.close();
               b = true;
            }
            else b = false;
         }
         return b;
      }
   }



...\ Dan /...
0
quader58 Messages postés 3 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 18 octobre 2009
18 oct. 2009 à 22:07
Bonsoir Danimo
Désolé de ne pas avoir donné de nouvelle plutot mais week end oblige.
Merci pour ta reponse mais je dois t'apporter un complement d'info concernant la fonction Javaexecutefonction de webdev. Le parametre type de retour concerne le format la variable que la fonction va retourer. Voici l'explication du paramatre type de retour:
<Type de retour> : Constante de type Entier
Type de retour de la fonction Java parmi les valeurs suivantes :
javaBooléen Valeur de retour de type Booléen
javaCaractère Valeur de retour de type Caractère
javaChaîne Valeur de retour de type Chaîne
javaChaîneUnicode Valeur de retour de type Chaîne Unicode
javaChaîneUTF8 Valeur de retour de type Chaîne au format UTF8
javaEntier Valeur de retour de type Entier
javaEntierCourt Valeur de retour de type Entier court
javaEntierLong Valeur de retour de type Entier long
javaOctet Valeur de retour de type Octet
javaRéel Valeur de retour de type Réel
javaRéelDouble Valeur de retour de type Réel Double
javaVoid Valeur de retour de type Void

: Type correspondant à chaque paramètre

Paramètres attendus par la fonction Java. Ces paramètres doivent être du même type que les paramètres attendus par la fonction Java. Seuls les types simples sont utilisables (voir notes)

comme l'instruction javaexecute fonctionne et que je peux passer un paramètre, je pourrais envoyer a la fonction java comme parametre cheminsource\fichiersource-chemindestination\fichierdestination le signe- serait le symbole de séparation. Dans le programme java dans la fonction main on paurait séparer le paramètre envoyé par rapport au signe- et envoyer les deux paramètres a la fonction copie. J'espère être claire dans mes explications.

Sinon j'ai quelques questions a poser car quelques chose m'echappe concernant la compilation sous java avaec les imports

- je fait mon prog .java dans lequel je met un import, je fait ma compilation avec javac, si je fait un parallele avec un compilateur C et ces includes, lors de la compilation le comilateur C intègre les codes des includes nécessaire au programme. Pourquoi lorsque je compile le prog avec javac on retrouve encore l'import dans le fichier .class?
- est que mon .class a besoin que je lui associe d'autres fichiers pour fonctionner?
- dans mon cas le programme java a besoin de l'io pour fonctionner. si je fait une recherche d'un dossier io sur mon micro je ne le trouve que dans un zip qui est sous mon dossier d'installation\jdk1.5.0601\src.zip. est ce que je dois le deziper?

Je sais que ces questions vont paraitre tres basiques mais comme on est dans la rubrique débutante j'en profite, et elle pouront aider d'autres personnes. J'ai pourtant lu plusieurs tuto sur le java mais je n'en ai pas trouvé un qui donnait clairement les réponses a mes questions. Si vous en connaisez un donner le lien
Desolé d'avoir été un peu long.
Et encore merci pour votre aide.
0
Utilisateur anonyme
19 oct. 2009 à 01:17
Salut,

Parmi toutes les classes du package java.io ton programme n'utilise que les classes FileInputStream et FileOutputStream.

Il y a 2 manières d'indiquer les imports nécessaires:

1- import java.io.*; (celle utilisée dans ton programme) et qui signifie que javac doit importer les classes (2 dans notre cas) utilisées dans le programme et uniquement ces 2 classes.

2- import java.io.FileInputStream;
import java.io.FileOutputStream;

La différence entre 1- et 2 est minimale (concernant les performances) le temps de compilation sera un peu plus long avec 1- mais c'est négligeable et de toutes manières (sauf en phase de mise au point) on compile beaucoup moins souvent.

Avec 2- on a un petit plus:

À la lecture des imports du programme on sait quelles classes sont utilisées.

Il existe une 3ème méthode (si l'on peut dire...) c'est de ne pas faire d'import et attendre que le compilateur nous dise ce qui manqe. Mais bon...

Pour info:
Il y a plusieurs type declasses dans le packages java.io:
Les classes Interface,
Les classes entrée/sortie
Les classes Exception
Et la classe Error (IOError)

Il faut noter que les classes du package java.lang sont importées de manière automatique (implicite) par tous les programmes.

Comment savoir dans quel package se trouve par exemple la classe FileInputStream:
En utilisant la JavaDoc:
[url]http://java.sun.com/javase/6/docs/api//url

-Cliquer sur le lien,
-Rechercher FileInputStream dans la fenêtre de gauche All Classes,
-Positionner le curseur (sans cliquer) sur FileInputStream pour connaître le nom de package dans lequel se trouve notre classe.
-pour obtenir la doc cliquer sur FileInputStream.

C'est tout en supposant que java est correctement installé ce qui semble le cas.

Maintenant concernant <Type de retour> l'erreur signalée est due au fait que l'on veut appeler la fonction (méthode) copyFile(File in, File out)... de la classe TransfertFichier n'attendant que 2 paramètres en lui en passant 3, le 3ème étant donné par <Type de retour> donc il faut ajouter ce paramètre:
public static boolean copyFile(File in, File out, boolean b)...
et pourquoi boolean b: parceque le type de retour est boolean (public static boolean ... ce n'est qu'un problème de syntaxe.

Cordialement,

...\ Dan /...
0
Rejoignez-nous