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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    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 confirmé

    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
    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é

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    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 confirmé

    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
    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);
    }

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

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

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    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

+ 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