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

Android Discussion :

Concaténation AssetInputStream+FileInputStream + AssetInputStream


Sujet :

Android

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur Informatique et Développeur Android
    Inscrit en
    Janvier 2010
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur Informatique et Développeur Android

    Informations forums :
    Inscription : Janvier 2010
    Messages : 384
    Points : 321
    Points
    321
    Par défaut Concaténation AssetInputStream+FileInputStream + AssetInputStream
    Bonjour,
    j'essaye de concaténer 3 fichiers (2 de dossier res/raw et une identifié par une URL) ...
    voilà mon code
    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
     
    final int promptId =
                    Class.forName(R.class.getName() + "$raw").getDeclaredField("raw1").getInt(null);
                final AssetInputStream prompt =
                    (AssetInputStream) VVMApplication.getContext().getResources().openRawResource(promptId);
     
                final int promptId3 =
                                Class.forName(R.class.getName() + "$raw").getDeclaredField("raw2").getInt(null);
                            final AssetInputStream prompt3 =
                                (AssetInputStream) VVMApplication.getContext().getResources().openRawResource(promptId3);           
                final FileOutputStream fos = new FileOutputStream(PROMPT_TEMP_FILE, false);
                final File file = new File(fileUri.getPath());
                final int length = (int) (file.length() + prompt.available()+prompt3.available());
                final byte[] buffer = new byte[length];
                FileInputStream fis = new FileInputStream(file);
                fis.read(buffer);
                prompt.read(buffer);
                prompt3.skip(6);
                prompt3.read(buffer, (int) file.length()+prompt.available(), prompt3.available());
                fos.write(buffer);
                fos.close();
                fis.close();
                return Uri.fromFile(PROMPT_TEMP_FILE);
    Les 3 fichiers sont concaténer mais le problème que la 2eme fichier est coupé , on entend juste la 2eme moitié de fichier....

    Je vais les concaténer dans un fichier FileOutputStream sous la forme file de raw1 + File + file de raw2

    Solution ?

    Merci.

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Pourquoi passer par un buffer intermédiaire dont on ne sait pas la taille à l'avance (surtout si l'InputStream n'est pas entièrement lu).

    Pour rappel: available() n'indique pas la taille du stream, mais la quantité de "bytes" disponibles à la lecture à l'instant T....


    Après, il faut faire une petite fonction "utilitaire":

    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
     
    private static final int BUFFER_SIZE = 2048;
    public static int  concatenateStreams(OutputStream out, InputStream ... ins)
    {
        int total = 0;
        byte[] buffer = new byte[BUFFER_SIZE];
        for (InputStream in : ins) {
           int avail;
           while ((avail = in.read(buffer)) > 0) {
              out.write(buffer,0,avail);
              total += avail;
           }
        }
        return total;
    }
    Avec un appel du genre:
    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
     
    {
         // on ouvre les streams
         FileOutputStream out = xxxxx;
         AssetInputStream prompt1 = xxxxx;
         FileInputStream prompt2 = xxxx;
         AssetInputStream prompt3 = xxxxx;
     
         try {
             // on prépare les streams
             prompt3.skip(6);
             // on concatene
             concatenateStreams(out,prompt1,prompt2,prompt3);
         } finally {
             // on ferme les stream (toujours dans un finally !!!)
             out.close();
             prompt1.close();
             ...
         }
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur Informatique et Développeur Android
    Inscrit en
    Janvier 2010
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur Informatique et Développeur Android

    Informations forums :
    Inscription : Janvier 2010
    Messages : 384
    Points : 321
    Points
    321
    Par défaut
    Salut
    Merci pour votre reponse
    Mais si la liste de InputStream contient plus que 1 InputStream ça fonctionne pas ...
    Voilà mon code :
    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
     
     public Uri buildPrompt(final Uri fileUri)
        {
     
            try {
                final InputStream prompt =
                   VVMApplication.getContext().getResources().openRawResource(R.raw.operator_vs_prompt1);
              final InputStream prompt3 =
                   VVMApplication.getContext().getResources().openRawResource(R.raw.operator_vs_prompt2);
                FileOutputStream fos = new FileOutputStream(PROMPT_TEMP_FILE, false);
                final File file = new File(fileUri.getPath());
     
                InputStream fis = new FileInputStream(file);
                concatenateStreams(fos,prompt3);
     
                fos.close();
                fis.close();
                return Uri.fromFile(Mon Fichier);
            } catch (final Exception e) {
                return fileUri;
            }
     
    public static int  concatenateStreams( FileOutputStream out, InputStream ... ins)
        {
            int total = 0;
            byte[] buffer = new byte[BUFFER_SIZE];
            try {
            for (InputStream in : ins) {
               int avail;
               while ((avail = in.read(buffer)) > 0) {
                  out.write(buffer,0,avail);
                  total += avail;
               }
            }
            } catch (Exception e){
            }
            return total;
        }

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu ne fais rien de ton fis, son contenu ne risque pas d'arriver dans la destination...

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur Informatique et Développeur Android
    Inscrit en
    Janvier 2010
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur Informatique et Développeur Android

    Informations forums :
    Inscription : Janvier 2010
    Messages : 384
    Points : 321
    Points
    321
    Par défaut
    je n'ai pas compris votre commentaire
    tu peux me donner plus de détails

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Dans votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    InputStream fis = new FileInputStream(file);
    concatenateStreams(fos,prompt3);
    Il faudrait plutôt faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    InputStream fis = new FileInputStream(file);
    concatenateStreams(fos,prompt,fils,prompt3);
    Et la gestion des exceptions est bizarre... votre version de concatenateStreams catch une exception mais n'en fait rien ... pourquoi ?
    De même... la gestion des ressources ne marche pas dans buildPrompts:
    Y a bien un try() mais dans le cas d'une exception les ressources ne sont pas fermées... (j'avais bien dit dans mon message qu'il faut fermer les ressources dans le "finally" du try).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur Informatique et Développeur Android
    Inscrit en
    Janvier 2010
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur Informatique et Développeur Android

    Informations forums :
    Inscription : Janvier 2010
    Messages : 384
    Points : 321
    Points
    321
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Dans votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    InputStream fis = new FileInputStream(file);
    concatenateStreams(fos,prompt3);
    Il faudrait plutôt faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    InputStream fis = new FileInputStream(file);
    concatenateStreams(fos,prompt,fils,prompt3);
    Et la gestion des exceptions est bizarre... votre version de concatenateStreams catch une exception mais n'en fait rien ... pourquoi ?
    De même... la gestion des ressources ne marche pas dans buildPrompts:
    Y a bien un try() mais dans le cas d'une exception les ressources ne sont pas fermées... (j'avais bien dit dans mon message qu'il faut fermer les ressources dans le "finally" du try).
    Salut,
    j'ai essayé de regler mon code :
    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
     
     
            InputStream fis = null;
            FileOutputStream fos = null;
            InputStream prompt = null;
            InputStream prompt3 = null;
            try {
     
                prompt = VVMApplication.getContext().getResources().openRawResource(R.raw.operator_vs_prompt1);
     
                prompt3 = VVMApplication.getContext().getResources().openRawResource(R.raw.operator_vs_prompt2);
                fos = new FileOutputStream(PROMPT_TEMP_FILE, true);
                final File file = new File(fileUri.getPath());
                fis = new FileInputStream(file);
                concatenateStreams(fos,prompt,fis,prompt3 );
     
            } catch (Exception e) {
                return Uri.fromFile(PROMPT_TEMP_FILE);
            }
            finally {
                try {
                    fos.close();
                    fis.close();
                    prompt.close();
                    prompt3.close(); 
                }
                catch (final Exception e){
                    Log.i(TAG, "exception close " + e.getMessage());
     
                }
              return Uri.fromFile(PROMPT_TEMP_FILE);
        }
    et la 2eme méhode :
    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
     
    public static int concatenateStreams(FileOutputStream out, InputStream... ins)
        {
            int total = 0;
            byte[] buffer = new byte[BUFFER_SIZE];
            try {
                for (InputStream in : ins) {
                    int avail;
                    in.read(buffer);
                    while ((avail = in.read(buffer)) > 0) {
                        out.write(buffer, 0, avail);
                        total += avail;
     
                    }
                }
            } catch (Exception e) {
                Log.i(TAG, " exception " + e.getMessage());
            }
            return total;
        }
    Mais toujours ça fonctionne pas

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    "fonctionne pas" n'est pas informaticien. Qu'est-ce qui se passe? Tu as des messages d'erreur? Le fichier de sortie est vide? Le contenu n'est pas correct?

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur Informatique et Développeur Android
    Inscrit en
    Janvier 2010
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur Informatique et Développeur Android

    Informations forums :
    Inscription : Janvier 2010
    Messages : 384
    Points : 321
    Points
    321
    Par défaut
    Le fichier de sortie est vide

  10. #10
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Pour la deuxieme méthode il vaut mieux faire:
    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
    public static int concatenateStreams(FileOutputStream out, InputStream... ins) throws IOException
        {
            int total = 0;
            byte[] buffer = new byte[BUFFER_SIZE];
            for (InputStream in : ins) {
                int avail;
                in.read(buffer);
                while ((avail = in.read(buffer)) > 0) {
                    out.write(buffer, 0, avail);
                    total += avail;
                }
            }
            return total;
        }
    Et c'est dans la seconde qu'il faudrait logger l'exception...
    Et surtout pas avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Log.i(TAG, " exception " + e.getMessage());
    qui perd tout un tas d'information mais par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Log.e(TAG, "Echec écriture du fichier",e);
    qui non seulement affichera l'exception (getMessage() peut être vide), mais aussi toute la stack au moment ou celle-ci a eu lieu.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

Discussions similaires

  1. Concaténation de 2 select en 1 seul
    Par Fleep dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/08/2003, 11h38
  2. Char(x) -> chaine concaténée d'espaces ?
    Par rgz dans le forum Débuter
    Réponses: 7
    Dernier message: 27/06/2003, 11h59
  3. Concaténation vertical ???
    Par loaded dans le forum Langage SQL
    Réponses: 10
    Dernier message: 07/05/2003, 15h44
  4. Concaténer TStrings
    Par Tuxxy dans le forum Composants VCL
    Réponses: 8
    Dernier message: 07/03/2003, 12h30
  5. Concaténation de String et Integer
    Par Ingham dans le forum Langage
    Réponses: 5
    Dernier message: 21/01/2003, 17h26

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