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 fichier via url ou file, différence ?


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    kij
    kij est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Par défaut Lecture fichier via url ou file, différence ?
    Bonjour et bonne année à tous !

    Je vous pose la question suivante, à savoir y a-t-il une différence (ou plusieurs) entre une lecture de fichier en local et via url.

    Pour etre plus clair, voici une partie du code sur lequel je bute :
    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
    30
    31
     
    //--- reads the font file
    File myFontFile = new File(theFileLocat);
    InputStream myFis = null;
    if (!myFontFile.exists()) {
    	try {
    		//myFis = (FileInputStream) (new URL(theFileLocat).openStream());
    		myFis = (new URL(theFileLocat).openStream());
    	} catch (MalformedURLException e) {		
    		throw new IOException("Kanji Font file '"+theFileLocat+"' is not accessible");
    	}
    } else {
    	myFis = new FileInputStream(myFontFile);			
    }
     
    while ( myFis.read(myTabRead) > 0) {
     
    	//--- builds the key
    	myKey = new byte[2];
     
    	//--- initialisation of key
    	myKey[0] = myTabRead[0];
    	myKey[1] = myTabRead[1];
     
    	//--- new font
    	myFont = new byte[106];
    	System.arraycopy(myTabRead, 0, myFont, 0, myFont.length);
     
    	//--- fills the Kanji table
    	getKanjiTable().put(new Integer(byteToShort(myKey)), myFont);
    }
    La première partie du code (avant la lecture du fichier, le while donc) consiste à créer le flux de lecture. Si le fichier passé en paramètre n'existe pas localement, on tente d'effectuer une lecture via url dessus.
    La deuxieme partie du code lit le fichier et le load en mémoire dans une hashtable.

    Mon problème est que la lecture du fichier en question est complète lorsque je passe par le fichier local, et incomplète losque la lecture se fait via URL (le fichier est situé sur un serveur distant).

    Voilà donc mon probleme, tout est nickel en local, mais à distance ca foire. La lecture s'arrete aléatoirement à peu pres à la moitié du fichier pour vous donner un ordre d'idée.

    Quelles sont les différences entre lecture de fichier en local et lecture de fichier via url ?

    Un grand merci à vous si vous pouvez m'aider (et oui je n'ai que ca ^^).

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Bah ca devrait marcher...

    La difference c'est que File accede directement au Systeme de fichier de l'OS et que URL utilise la pile de protocole réseau, en l'occurence HTTP sur TCP/IP.

    un probleme de timeout peut-etre ? Essaye de jouer avec URLConnection.setReadTimeout()...
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Citation Envoyé par pseudocode
    Bah ca devrait marcher...

    La difference c'est que File accede directement au Systeme de fichier de l'OS et que URL utilise la pile de protocole réseau, en l'occurence HTTP sur TCP/IP.

    un probleme de timeout peut-etre ? Essaye de jouer avec URLConnection.setReadTimeout()...
    Ca marche aussi si la machine n'a pas d'interface eth0 ? ( je n'ai pas testé ).

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    oui ca marche aussi. Dans ce cas ca passe par le loopback (lo0)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    kij
    kij est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Par défaut
    Pour commencer merci pour vos réponses à tout deux

    Tout fonctionne en temps normal effectivement.
    J'ai avancé un peu dans mon problème et il se trouve que ca n'a finalement rien a voir avec le type de connection utilisé.
    La premiere partie du code peut etre oubliée donc.

    Dans la partie suivante :
    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
     
    int myRet = -1;
    int compteur = 0;
    while ( ( myRet = myFis.read(myTabRead)) > 0) {
     
    	//--- builds the key
    	compteur += myRet;
    	myKey = new byte[2];
    	//--- initialisation of key
     
    	System.out.println();
     
    	myKey[0] = myTabRead[0];
    	myKey[1] = myTabRead[1];
     
    	//--- fills the Kanji table
    	getKanjiTable().put(new Integer(byteToShort(myKey)), myTabRead);
     
    }
     
    System.out.println("Taille totale loadée : "+compteur);
    System.out.println("Nombre d'entrée dans la table : "+getKanjiTable().size());
    J'ai laissé un System.out.println au milieu et qui a-priori ne sert à rien. Tel quel tout fonctionne bien. Si j'ote le System.out.println rien ne fonctionne.
    J'ai déjà eu ce probleme il y a un bon moment en C et il me semblait que ca venait d'un problème de mémoire ou de flush... mais je ne sais plus trop.

    Auriez-vous déjà eu le meme problème, à savoir que votre programme plante si vous ne mettez pas un System.out au bon endroit ?


    Edit : en fait lorsque j'affiche la taille du fichier traité et le nombre d'entrée dans ma hashtable, je me rends compte que le fichier a bien été lu en entier, mais que dans la hashtable tout n'as pas été mis... je me pense donc en ce moment sur un problème lié à la méthode put des hashtables (peut etre) et au vidage de tampon mémoire de lecture, du tableau...

  6. #6
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Le flush c'est sur les outputStream.
    Sinon une erreur classique : fermes-tu bien TOUS tes flux via leur méthode close() ?

  7. #7
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    A mon avis, le System.out.println() ralentit ta boucle, ce qui laisse le temps aux données d'arriver. C'est donc bien un probleme de disponnibilité des données dans l' InputStream.

    Il va falloir changer la boucle "while" pour:

    1. Sortir quand TOUTES les données sont lues
    2. Attendre quand l'InputStream est vide mais que TOUTES les données ne sont pas encore lues

    Le mieux serait de connaitre la longueur des données AVANT de rentrer dans le "while". Il faut regarder du coté de la methode getContentLength() pour URL et length() pour FILE.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

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

Discussions similaires

  1. VBA Excel récuperer nom de fichier via URL
    Par FrenchyBoss dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/10/2013, 16h34
  2. Récupérer différentiel de fichiers via URL
    Par shadeoner dans le forum Langage
    Réponses: 1
    Dernier message: 06/03/2008, 21h52
  3. Optimisation lecture fichier via un shell script
    Par macleod dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 31/07/2007, 12h46
  4. Réponses: 4
    Dernier message: 04/09/2005, 23h57
  5. [LG]Probleme lecture fichier file of ....
    Par John_win dans le forum Langage
    Réponses: 11
    Dernier message: 11/11/2003, 18h53

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