IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Traduction C vers java


Sujet :

avec Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 3
    Points
    3
    Par défaut Traduction C vers java
    Bonjour a tous,

    Je voudrai créer un programme qui lit un log contenant du texte et qui est en écriture constante. Pour ça j'ai fait ceci ( en c++ ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
            FILE * pFile;
            pFile = fopen(log_path.c_str(), "r");
     
            if(pFile == NULL) perror("Error opening file");
     
            setvbuf(pFile, NULL, _IONBF, 0);
            fseek(pFile , 0 , SEEK_END);
     
            while(1) {
     
                if ( (void*) fgets (line , 4192 , pFile) != NULL ) {
     
                    fputs(line, stdout);
     
                }
     
            }
     
            fclose(pFile);
     
        return 0;
    }
    Je voudrai maintenant le faire en java, seulement je n'ai aucune idée de quelle fonction se servir. J'ai essayé le FileInputStream sans succès, quand à BufferedReader c'est impossible car j'ai besoin d'avoir un buffer de taille 0 pour pouvoir lire même quand le EOF est atteint afin de traiter les prochains évenements.

    Auriez-vous une idée ?

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Et si tu nous montrais le code java que tu as essayé ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Ah oui pardon, le voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
        public static void main(String[] args) throws FileNotFoundException, IOException {
     
           String log_path = "C:\\Users\\Bapiste\\Desktop\\Coyote\\minigames.log" ;
     
           FileInputStream reader;
     
           try {
     
               reader = new FileInputStream(new File(log_path));
               byte[] buffer = new byte[4196];
               int n ;
     
               while(true) {
     
                while((n = reader.read(buffer)) >= 0){
     
                for(byte bit : buffer)
                    System.out.print( (char)bit );
                    System.out.println("");
                }
     
               }
     
           } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
     
        }

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Je pense que ceci t'aidera, le tutoriel Java de jmdoudou, chapitre flux.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Ben déjà, ça compile pas. Il faut ajouter une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
            String log_path = "C:\\Users\\Bapiste\\Desktop\\Coyote\\minigames.log" ;
            
            FileInputStream reader;
            
            try {
                
                reader = new FileInputStream(new File(log_path));
                byte[] buffer = new byte[4196];
                int n ;
                
                while(true) {
                    
                    while((n = reader.read(buffer)) >= 0){
                        
                        for(byte bit : buffer)
                            System.out.print( (char)bit );
                        System.out.println("");
                    }
                    
                }
                
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  6. #6
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Ensuite, petit coquin, tu aurais du lire la FAQ sur la lecture des fichiers lignes à lignes

    ce qui te donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
            String log_path = "C:\\Users\\Bapiste\\Desktop\\Coyote\\minigames.log" ;
            Scanner scanner;
            try {
                scanner = new Scanner(new File(log_path));
                while (scanner.hasNextLine()) {
                    String line = scanner.nextLine();
     
                    System.out.println(line);
                    //faites ici votre traitement
                }
     
                scanner.close();
            } catch (FileNotFoundException ex) {
                ex.printStackTrace();
            }
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Certes très cher je ne l'ai point lu, mais cela ne peut marcher. Quand le scanner atteindra le EOF, le buffer ne se "rafraichira" pas et tout ce qui sera écrit plus tard ne sera donc pas lu.

    C'est pour ça que je cherche un moyen de ne pas bufferiser le flux.

    Peut-être me suis-je mal exprimé et je m'en excuse si vous ne m'avez pas compris.

  8. #8
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    C'est pour ça que je cherche un moyen de ne pas bufferiser le flux.
    A ma connaissance, le scanner n'est pas un buffer.
    Il lit ce qui est effectivement écrit dans le fichier.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Il doit le faire parce que quand il rencontre le EOF, il ne lit plus rien.

    edit: il le fait => http://docs.oracle.com/javase/1.5.0/...l/Scanner.html

    => In currently latest JDK6 release/build, the Scanner has a littler buffer (1KB char buffer) as opposed to the BufferedReader (8KB byte buffer), but it's more than enough.

  10. #10
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Comme le problème est de récupérer toutes les lignes,

    une solution simple (simpliste ?) consiste à regarder périodiquement (timer)
    si la taille du fichier sur disque a changé (voir File.length)
    si c'est le cas, relancer le scanner en sautant toutes les lignes déjà récupérées.

    Si tu es en Java 7, il y a le nouveau package java.nio.file
    qui permet de détecter les changements sur les fichiers (WatchService) mais je ne l'ai pas testé.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Le problème avec ta solution c'est que je dois fermer/ouvrir pour actualiser le buffer s'il trouve un changement, ce qui est un peu lourd je trouve.

    J'ai vu que bufferedreader pouvais prendre en 2e argument la taille du buffer. Je me suis dis chouette je vais le mettre à 0. A la compilation ça foirre.

    Exception in thread "main" java.lang.IllegalArgumentException: Buffer size <= 0
    J'ai alors essayé à 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    String log_path = "C:\\Users\\Bapiste\\Desktop\\Coyote\\C++\\minigames.log" ;
     
           BufferedReader reader = new BufferedReader(new FileReader(log_path),1);
     
           while(true) {
     
               Thread.sleep(500);
     
             while ((line = reader.readLine()) != null)
             {
                System.out.println(line);
             }
     
           }
    Ca à l'air de marcher mais je doute de la fiabilité. J'ai rajouté une temporisation pour pas griller le CPU

    J'ai aussi trouvé ça sur un site anglais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    File f = new File(log_path);
            FileReader fr = new FileReader(f);
            BufferedReader br = new BufferedReader(fr);
     
            String s = null;
     
            while(true) {
     
            while ((s=br.readLine())!=null)
                {
                    System.out.println(s);
                }
            }
    Ca m'a l'air bizarre mais ça marche plus ou moins aussi.

    Qu'en penses tu ? ça fait un peu bricolage non ?

  12. #12
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Les deux exemples sont fonctionnellement identiques !
    pourquoi mettre la taille à 1 ? il ne va lire qu'un seul caractère !
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Ah ben oui en effet tu as raison, je pensais qu'en mettant une valeur proche de 0 il n'utiliserait pas le buffer vu que mes lignes sont grandes.

    J'ai mis à 4196 la taille, ça marche aussi. Je comprends plus rien la.

  14. #14
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Comme c'est un fichier log, je suppose que chaque ajout est écrit sur une nouvelle ligne.
    Comme tu utilises la méthode readLine qui est censée récupérer une ligne entière, je pense que tu n'as pas intérêt à spécifier une taille de buffer.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  15. #15
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    En effet, c'est mieux ainsi. Je vais laisser ça comme c'est je verrai bien quand le traitement des events sera fait pour voir si c'est pas trop lourd.

    Je te remercie chef

  16. #16
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Ah juste une autre chose si tu connais, j'aimerai placer le curseur à la fin du fichier afin de ne pas traiter les anciens evènements. Sais tu comment je peux le placer ?

    Est ce qu'un truc genre seekg() existe en java ? La doc du bufferedreader ne dis rien a propos de pointeur ni de curseur.

    Edit : Fonction faite à l'arrache :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static long countCharsSimple(File f) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
        long charCount = 0;
        while(reader.read() > -1) {
            charCount++;
        }
        reader.close();
        return charCount;
    }
    retourné dans ceci :
    long length = countCharsSimple(f); // Save EOF position
    Puis placement avec ceci :
    reader.skip(length); // Go to EOF
    Vu que j'ai pas du tout besoin d'un temps de calcul monstre pour calculer la position du EOF je me suis permis ceci.

  17. #17
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Oulalala, je me demandes pourquoi tu tiens tant à ton BufferedReader mais bon passons ....

    Demande au fichier sa size plutot que de faire une boucle de lecture char/char parce que la c'est pas top top.

    Sinon, Je me demande si tu n'aurais pas eu plus facile avec http://java.sun.com/j2se/1.4.2/docs/...ccessFile.html
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  18. #18
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Bonjour wax78,

    en effet plus j'avance dans mon traitement de l'information, plus je m'aperçois que la lecture est completement pourrie.

    Comment aurais-tu procéder avec cette classe ?

  19. #19
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String line;
    String log_path = "e:\\mini.log";
    File f = new File(log_path);
    BufferedReader reader = new BufferedReader(new FileReader(log_path));
    reader.skip(f.length());
    while (true)
    while ((line = reader.readLine()) != null)
    System.out.println(line);
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  20. #20
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    ah oui en effet c'est bien mieux merci

    Je suis en train de voir pour la classe RandomAccessFile, sait tu si on peut ne pas utiliser de buffer ? J'ai rien vu de tel dans la doc.

Discussions similaires

  1. Traduction de code Java vers MATLAB
    Par kallelbalsam dans le forum MATLAB
    Réponses: 1
    Dernier message: 10/04/2014, 07h10
  2. Traduction C++ vers java
    Par ToTo13 dans le forum Général Java
    Réponses: 6
    Dernier message: 27/04/2011, 18h22
  3. Traduction de C++ vers Java
    Par Ocean_blue4 dans le forum Langage
    Réponses: 4
    Dernier message: 19/01/2006, 06h52
  4. Traduction C++ vers Delphi
    Par lil_jam63 dans le forum Langage
    Réponses: 6
    Dernier message: 05/07/2004, 13h10
  5. probleme traduction C vers Delphi
    Par zinaif dans le forum Langage
    Réponses: 3
    Dernier message: 27/06/2003, 08h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo