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 :

Mise à jour d'un fichier dans les assets


Sujet :

Android

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Points : 21
    Points
    21
    Par défaut Mise à jour d'un fichier dans les assets
    Bonjour tout le monde,
    j'ai un fichier dans les assets que j'aimerais mettre à jour avec un fichier qui est à la base de ma sdcard.
    Mon code fonctionne bien, aucune erreur n'est soulevé. Cependant, le fichier n'est pas mis à jour, je ne comprends pas trop pourquoi, vous pouvez m'aider ?
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    public class Update extends Activity {
     
    	private final static String TAG = "Update";
     
    	TextView v = null;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_update);
    		v = (TextView) findViewById(R.id.update);
    		v.setText("The update is done ! Enjoy.");
     
    		// on supprime le dictionnaire existant
    		this.deleteFile(this.getAssets() + "dico.xml");
    		// on en créer un nouveau qui va recevoir les données
    		File f = new File(this.getFilesDir(), "dico.xml");
    		//Nous déclarons nos objets en dehors du bloc try/catch
    		FileInputStream fis = null;
    		FileOutputStream fos = null;
    		try 
    		{
    			//On instancie nos objets :
    			//fis va lire le fichier et
    			//fos va écrire dans le nouveau !
    			fis = new FileInputStream(new File("sdcard/dico.xml"));
    			fos = new FileOutputStream(f);
    			//On crée un tableau de byte
    			//pour indiquer le nombre de bytes
    			//lus à chaque tour de boucle
    			byte[] buf = new byte[8];
    			//On crée une variable de type int
    			//pour y affecter le résultat de la lecture
    			//Vaut -1 quand c'est fini
    			int n = 0;
    			//Tant que l'affectation dans la variable est possible, on  boucle
    			//Lorsque la lecture du fichier est terminée
    			//l'affectation n'est plus possible !
    			//On sort donc de la boucle
    			while((n = fis.read(buf)) >= 0)
    			{
    				//On écrit dans notre deuxième fichier
    				//avec l'objet adéquat
    				fos.write(buf);
    				//On affiche ce qu'a lu notre boucle
    				//au format byte et au format char
    				for(byte bit : buf)
    					System.out.print((char)bit);
    				System.out.println("");
    			}
    			System.out.println("Copie terminée !");
    		} 
    		catch (FileNotFoundException e) {Log.e(TAG, "FILENOTFOUNDEXCEPTION", e);
    		v.setText("The update FAILED\n\nCheck that your XML file is at the root of your sdcard.");}
    		catch (IOException e1) {Log.e(TAG, "IOEXCEPTION", e1);
    		v.setText("The update FAILED\n\nCheck that your XML file is at the root of your sdcard.");}
    		finally{
    			//On ferme nos flux de données dans un bloc finally
    			//pour s'assurer que ces instructions seront exécutées
    			//dans tous les cas même si une exception est levée !
    			try{
    				if(fis != null)
    					fis.close();
    				if(fos != null)
    					fos.close();
    			}catch(IOException e){ Log.e(TAG, "IOEXCEPTION", e);}
    		}
    	}
    }

  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
    On n'a pas le droit d'écrire dans le répertoire des assets.

    Au pire utilise un fichier "local privé" au context (openFileXXXX()).
    A l'utilisation, si le fichier n'existe pas tu le copie depuis les assets.
    En venant de la sdcard pareil c'est ce fichier qui est surchargé
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Points : 21
    Points
    21
    Par défaut au démarrage
    très bien, donc comment je fais pour l'utilisateur puisse mettre à jour le fichier local privée une bonne fois pour toute ?

    Que le fichier soit mis à jour pendant une utilisation et qu'à la prochaine, il soit encore à jour

  4. #4
    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
    Heu... ben ce que j'ai dit ....

    Voici un peu de 'pseudo' 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    private static final String PRIVATE_FILE_NAME = "myfile.xml";
     
    public InputStream   openMyFile(Context context) throws IOException
    {
        InputStream ret = null;
        try {
            ret = context.openFileInput(PRIVATE_FILE_NAME);
        } catch (FileNotFoundException ex) {
            copyFileFromAssets();
            ret = context.openFileInput(PRIVATE_FILE_NAME);
        }
        return ret;
    }
     
    public void overwriteMyFile(Context context, File fromFile) throws IOException
    {
        OutputStream outStream = null;
        InputStream fromStream = new FileInputStream(fromFile);
        try {
            outStream = context.openFileOutput(PRIVATE_FILE_NAME,0);
            copyStream(fromStream,outStream);
        } finally {
            if (outStream != null) outStream.close();
            fromStream.close();
        }
    }
     
    private void copyFileFromAssets(Context context) throws IOException
    {
        OutputStream outStream = null;
        InputStream fromStream = openAssetsFile();
        try {
            outStream = context.openFileOutput(PRIVATE_FILE_NAME,0);
            copyStream(fromStream,outStream);
        } finally {
            if (outStream != null) outStream.close();
            fromStream.close();
        }
    }
     
    private void copyStream(InputStream from, OutputStream to) throws IOException
    {
        byte[] buffer = new byte[4096];
        int bytesRead = -1;
        while ((bytesRead = from.read(buffer)) > -1) 
            to.write(buffer, 0, bytesRead);
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    je vais travailler là-dessus, ça va me prendre un peu de temps ^^

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    le code marche, le seul problème c'est le openAssetFile().

    Vu que ça n'existe pas, je l'ai remplacé pour commencer par :

    context.getAssets().open("dico.xml");

    Le problème c'est que ça renvoit un InputStream
    je l'ai donc casté pour avoir un FileInputStream

    Mais le log m'affiche : Caused by java.lang.ClassCastException: android.content.res.AssetManager&AssetInputStream

  7. #7
    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
    Mais pourquoi avoir un FileInputStream ? Puisque tu n'as pas de "File" ?
    Un simple InputStream suffit !

    Oui enfin bon... come FileInputStream est un InputStream, il suffit de remplacer tous les FileInputStream en variable / paramètre par InputStream et la même chose pour OutputStream...

    LE CAST C'EST LE MAL !
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Points : 21
    Points
    21
    Par défaut Résolu
    J'ai utiliser le code que tu m'as donné et il marche bien, il fallait bien utiliser les InputStream et OutputStream pour que ça marche comme il faut.

    Merci beaucoup, je mets cette discussion résolu

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/03/2015, 00h20
  2. Réponses: 0
    Dernier message: 17/12/2013, 18h20
  3. mise à jour d'un fichier qui se trouve dans un package .ear
    Par MedNaceur dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 04/04/2011, 18h17
  4. Mise à jour d'une ligne dans un fichier texte en php
    Par Pouchou_for_ever dans le forum Langage
    Réponses: 5
    Dernier message: 28/10/2010, 11h31
  5. [SWING] Mise a jour de l'interface dans les événements
    Par woods dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 23/11/2005, 15h46

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