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

Entrée/Sortie Java Discussion :

Lecture/Ecriture de fichier


Sujet :

Entrée/Sortie Java

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Points : 376
    Points
    376
    Par défaut Lecture/Ecriture de fichier
    Bonsoir,

    petite question, non pas vraiment sur un code mais pour plus de compréhension.

    Admettons un fichier f1.txt contenant la ligne Test

    Lorsque je lis ce fichier byte par byte je me suis rendu compte qu'à l'affichage j'obtenais

    T
    e
    s
    t

    La question que je me posais; comment java est capable de savoir (lorsque je vais vouloir recopier ce contenu dans un second fichier) que je veux obtenir la ligne Test et non pas une lettre par ligne ?


    Seconde question qui est lié à mon problème direct. Je réalise en fait une petite appli toute bête de type serveur en java et je vais devoir communiquer avec un client en c. Du coup, je me demandais si le c est également capable de faire la même distinction que Java pour écrire de nouveau le fichier coté client de façon correcte.

    Cela me perturbe vraiment de voir que à l'affichage j'obtiens une seule lettre par ligne...pour moi sans \n ou caractère du même genre il ne devrait pas y avoir un tel retour à la ligne...

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ce que ton programme affiche n'est pas le contenu du fichier : c'est ce qu'il affiche à partir des données qu'il y a dans le fichier. Avec ton fichier je peux écrire un programme qui affiche
    T
                 S
                        E
                               T
    
    Je peux même faire un programme qui lit n'importe quel fichier (passé en paramètre) qui existe et affiche choux-fleur :
    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
    public class AllFileAreChouxFleur {
     
        public static void main(String[] args) {
     
        	if ( args.length>0 ) {
        		try (InputStream input = Files.newInputStream(Paths.get(args[0]))) {
        			byte[] buffer = new byte[4095];
    				for(int read = input.read(buffer); read!=-1; read = input.read(buffer));
    				System.out.println("Choux-fleur");
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
        	}
     
        }
     
    }
    Si ton programme affiche chaque octet à la ligne, c'est parce que quand tu affiches les octets lus dans le fichier, tu utilises affiche un \n entre chaque, probablement avec System.out.println(), alors qu'avec System.out.print() à la place, tu n'auras pas ce passage à la ligne.

    De plus, ce qu'il y a dans le fichier comme octets et la façon de considérer qu'il s'agit du mot Test sur une seule ligne n'est qu'une convention de format. Ces quatres octets qui forment le mot Test, dans un encodage particulier en plus, pourrait très bien former également un nombre. Parce que je te rappelle qu'au final, dans un ordinateur classique, toute information se réduit à une suite de 0 et de 1, regroupées en mots, un ensemble de 0 et de 1 dont le nombre est multiple de 8 (d'où cette notion d'octet=octo=8).

    Le fait qu'un client qui communique avec un serveur qui soit programmé dans un autre langage n'y change rien : ils s'échangent de toute manière des octets, et c'est la façon d'interpréter les différents octets qui va faire qu'il se transmette du texte, des nombres ou des images. Evidemment, il vaut mieux qu'il parle un langage commun, sinon l'un va envoyer des octets d'une image, et l'autre va considérer qu'il doit faire un texte avec ces octets, ou autre chose. C'est ce qu'on appelle le protocole : un langage commun entre le serveur et le client.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Points : 376
    Points
    376
    Par défaut
    Super ça répond à ma question.

    Pour être sûr, ça veut dire qu'à chaque fois que j'écris dans une socket ou fichier ou quoi que ce soit d'autre avec println(s).
    Je vais automatiquement envoyer un "\n" ?

    en gros

    println(s) produirait la même chose que print(s+"\n")

    Sa a quand même son importance, car si je dois envoyer un \n avec mon client mais que je fais println("\n") j'envoie en réalité deux \n consécutifs ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Oui, en gros. Parce qu'il y a quand même uns subtilité : selon l'os, le séparateur de ligne dans le fichier n'est pas forcément le même (\n sur linux par exemple, ou \r\n sur Windows). C'est donc plutôt println("toto") est l'équivalent de print("toto"+System.lineSeparator()).
    Mais ce n'est pas l'affaire du transfert, mais seulement du client quand il écrit ou lit un fichier, et du serveur quand il lit et écrit un fichier. En Java, quand on utilise println() on n'a pas à s'en préoccuper (println() utilise le bon séparateur de ligne), alors que si on fait print(""+"\n") on va possiblement utiliser le mauvais selon l'os. De même lors de la lecture, avec la méthode readLine() de BufferedReader par exemple, ou Scanner.
    Lors du transfert, il est juste important que le séparateur de ligne soit le même entre le client et le serveur, et ça c'est l'affaire du protocole de transfert (et peu importe le langage de programmation de l'un ou de l'autre).

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Points : 376
    Points
    376
    Par défaut
    Ok merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C++] lecture/ecriture dans fichier txt/binary
    Par vince3320 dans le forum C++
    Réponses: 6
    Dernier message: 28/09/2007, 18h00
  2. Lecture/Ecriture de fichiers MAT via .NET
    Par mimic50 dans le forum MATLAB
    Réponses: 3
    Dernier message: 29/03/2007, 11h48
  3. lecture/ecriture de fichier à distance avec indentification
    Par Mat1664 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 22/05/2006, 17h16
  4. Réponses: 4
    Dernier message: 03/02/2006, 13h50
  5. lecture-ecriture de fichier en mode Random (Get - Put)
    Par MuShRo_Om dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 15/01/2006, 14h53

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