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 :

fichier -> byte[] -> Blob et l'inverse


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Par défaut fichier -> byte[] -> Blob et l'inverse
    Bonjour,

    J'aimerai créer à partir d'un fichier , un tableau de byte afin de l'enregistrer sous forme de BLOB dans ma base de données.

    De plus j'aimerai avoir une fonction inverse pour recréer le fichier à partir d'un tableau de bytes.

    Comment dois-je procéder ??


    J'ai ces 2 méthodes mais elles ne fonctionne que sur les fichier <64Ko

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    public void TableauDeBytesVersFichier (byte[] tableau, String fic) throws java.io.IOException {
    		try {
    		    java.io.FileWriter f = new java.io.FileWriter(fic);
    		    for (int i = 0; i < tableau.length; i++) {
       			    f.write((int)tableau[i]);
    	    	}	 
    			f.close();
    		}
    		catch(IOException e){
    			System.out.println(e+"erreur lors de la lecture du fichier");
    		}
     
    	}
     
     
     
    	/**
             * Permet de copier le contenu d'un fichier dans un tableau byte[]
             **/ 
    	public byte[] FichierVersTableauDeBytes (String fic) throws java.io.IOException {
    		java.io.File fichier = new File(fic);
    		int i=0;
    		int ch;
    		byte[] tableau;
    		try {			
    			FileInputStream f= new FileInputStream(fichier);
    			try{
    				tableau = new byte[(int)fichier.length()];				
    				while((ch=f.read())!=-1){ 
    					tableau[i]=(byte)ch;
    					i++;						
    				}
    			}
    			finally{
    				f.close();
    			}
    			return tableau;
    		}
    		catch(FileNotFoundException ef){
    			System.out.println("fichier introuvable");
    			return null;
    		}
    		catch(IOException e){
    			System.out.println(e+"erreur lors de la lecture du fichier");
    			return null;			
    		}		
    	}

  2. #2
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    je ne sais pas trop mais ...

    as tu une Exception ou une Error de levée lors de l'exécution ?

    fichier.length ça fait combien ? Si tu n'a pas d'erreur sur la création du tableau avec une taille > 65535, le pb ne vient pas de là ...

    C'est bizarre, moi je pensais que la taille des tableaux était limitée à la taille max value de INT ... mais je me trompe peut etre ...

    C'est pas juste un problème de mémoire ?

    [EDIT] PS : tu as une balise code (#) disponible pour la mise en forme ...

  3. #3
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Par défaut
    En effet la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (int i = 0; i < tableau.length; i++) {
       			    f.write((int)tableau[i]) };
    ne fonctionne que si le tableau.lenght ne dépasse la taille du int

    C'est de la que vient le problème, il me faudrai une autre méthode pour stocker le fichier alors :/

  4. #4
    Membre éprouvé Avatar de manube
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Mai 2004
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 180
    Par défaut
    Salut,
    Alors je n'ai rien testé mais si tu utilise les classes du package java.sql pour recuperer tes données sur ta bd, tu obtiens donc un ResulSet sur lequel tu fais un getBlob("File_column");, puis il ne te reste plus qu'à copier ce flux dans un fichier. Pour cela tu récupères l'InputStream (myBlob.getBinaryStream()) que tu copies dans un fichier ; voici un code tout simple à adapter pour la copie : http://javaalmanac.com/egs/java.io/CopyFile.html

    Bon courage
    Manu

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Par défaut
    Je pense en effet qu'il est plus simple de récupérer directement un objet Blob.

    Concernant ton code, il est normal que la première méthode pose problème car tu utilise un tampon de lecture contenant, semble-t-il l'intégralité de ton fichier. Hors le tampon ne devrait pas dépasser la quantité disponible de mémoire L1.

    [EDIT] Mais non, ce n'est pas normal. J'ai eu soudain un doute et j'ai relu ton code, et tu écris les octets un à un. Tu n'utilises donc pas tout le cache L1. Donc je ne vois pas d'où vient le problème. Désolé.


    Pour la deuxième méthode, je ne vois aucune raison pour que tu rencontres d'erreur. Néanmoins, je pense que la méthode File.length() retourne la taille déclarée dans les propriétés du fichier, et cette déclaration peut être fausse. Il vaut donc mieux partir du principe qu'on ne connait par avance la taille du fichier.

  6. #6
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Par défaut
    Merci pour votre aide , mon problème est résolu

    Dans la 1ere méthode il faut mettre un type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		java.io.File fichier = new File(fic);
    		try {
    		FileOutputStream f= new FileOutputStream(fichier);
    Le type File que j'utilisais directement ne conservait pas l'intégrité du fichier.

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

Discussions similaires

  1. Fichier binaires dans champ blob
    Par divparzero dans le forum C++Builder
    Réponses: 5
    Dernier message: 30/01/2007, 16h25
  2. [DEBUTANT]Inserer des fichiers dans des champs blob
    Par tripper.dim dans le forum Débuter
    Réponses: 1
    Dernier message: 19/10/2006, 22h23
  3. Pb de création de fichier à partir d'un blob
    Par clairette dans le forum Entrée/Sortie
    Réponses: 20
    Dernier message: 28/08/2006, 09h51
  4. Fichier en BYTE
    Par Sergejack dans le forum Langage
    Réponses: 6
    Dernier message: 08/08/2006, 19h03
  5. sauvegarde de fichiers en tant que blob
    Par ha_mido dans le forum Administration
    Réponses: 3
    Dernier message: 21/11/2005, 17h48

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