2013-04-18 4 views
1

Je ne comprends pas pourquoi nous n'entrons pas dans la seconde if. Je vérifie d'abord si le fichier existe (non, logique), je le crée, et je vérifie à nouveau mais il renvoie toujours faux. J'ai essayé pendant une heure de trouver le problème et je suis sûr que c'est une erreur stupide. Désolé pour mon pauvre anglaisFichier créé mais retourne faux

Voici le code:

package com.example.testcreatefileonclick; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.OutputStreamWriter; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class Main extends Activity implements android.view.View.OnClickListener{ 

    Button button; 
    Button addTeam; 
    Boolean append = true; 

    String name = "nomFichier.txt"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     button = (Button)findViewById(R.id.button1); 
     button.setOnClickListener((OnClickListener) this); 
     addTeam = (Button)findViewById(R.id.button2); 
     addTeam.setOnClickListener((OnClickListener) this); 

    } 

    @Override 
    public void onClick(View v) { 
     try { 
      File fichier = new File(name); 


      if (!fichier.exists()) { 
       System.out.println("File doesn't exists"); 
      } 


      FileOutputStream fOut = openFileOutput(name, MODE_WORLD_READABLE); 
      OutputStreamWriter osw = new OutputStreamWriter(fOut); 
      osw.write("text"); 
      osw.flush(); 
      osw.close(); 

      //Why don't we go in this if ? 
      if (fichier.exists()) { 
       System.out.println("File exists"); 
      } 


     } catch (Exception e) { 
      // TODO: handle exception 
     } 
    } 
} 

Edit: Code du travail

package com.example.testcreatefileonclick; 

import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class Main extends Activity implements android.view.View.OnClickListener{ 

    Button button; 
    Button addTeam; 
    Boolean append = true; 
    String name = "nomFichier.txt"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     button = (Button)findViewById(R.id.button1); 
     button.setOnClickListener((OnClickListener) this); 
     addTeam = (Button)findViewById(R.id.button2); 
     addTeam.setOnClickListener((OnClickListener) this); 

    } 

    @Override 
    public void onClick(View v) { 
     try { 
      String filePath = (this.getFilesDir().getPath().toString()); 
      File fichier = new File(filePath + name); 

      if (!fichier.exists()) { 
       System.out.println("File doesn't exists"); 
      } 

      fichier.createNewFile(); 
      FileWriter file = new FileWriter(filePath + name); 
      file.write("text"); 
      file.flush(); 
      file.close(); 

      if (fichier.exists()) { 
       System.out.println("File exists"); 
      } 


     } catch (IOException e) { 
      System.out.println("Exception"); 
      e.printStackTrace(); 
     } 
    } 
} 
+0

lire la documentation openFileOutput. il n'a pas le même comportement que le fichier – njzk2

Répondre

1

Essayez de remplacer ceci:

FileOutputStream fOut = openFileOutput(name, MODE_WORLD_READABLE); 
     OutputStreamWriter osw = new OutputStreamWriter(fOut); 
     osw.write("text"); 
     osw.flush(); 
     osw.close(); 

par ceci:

fichier.createNewFile(); 
FileWriter file = new FileWriter(name); 
file.write("text"); 
file.flush(); 
file.close(); 
+0

J'ai essayé et j'obtiens cette erreur: ouvrir a échoué: EROFS (système de fichiers en lecture seule) – user1965878

+0

C'est parce que vous ne pouvez pas écrire où vous voulez sur votre appareil. Vous devez écrire le fichier dans votre dossier d'application. Cochez cette case: [http://stackoverflow.com/questions/10787942/android-read-only-file-system-ioexception](http://stackoverflow.com/questions/10787942/android-read-only-file- system-ioexception) – Padrus

+0

Ok merci mon code fonctionne maintenant. J'ai mis mon nouveau code dans mon message pour aider les autres. – user1965878

1
// Why don't we go in this if ? 

La raison la plus probable (OMI) est que openFileOutput(name, MODE_WORLD_READABLE) lève une exception.

Si cela se produit, vous ne le saurez pas à cause de cet effroyable morceau de code.

} catch (Exception e) { 
     // TODO: handle exception 
    } 

Pourquoi épouvantable?

  1. Vous attrapez Exception plutôt que les exceptions que vous attendez à être jeté (par exemple IOException).
  2. Vous "écrasez" l'exception. Vous l'attrapez et le jetez silencieusement.

Chacune de ces choses individuellement est mauvaise pratique. Les faire ensemble est ... eh bien ... vous mériter d'avoir perdu une heure à ce sujet! Si mon diagnostic d'une exception écrasée est incorrect, alors il y a une autre possibilité. Les documents pour openFileOutput disent:

"Open a private file associated with this Context's application package for writing.".

Il est pas tout à fait clair où ce fichier serait ouvert/créé, mais il est plausible qu'il est dans un autre « lieu » où File.exists cherche. Vous remarquerez que openFileOutput ne prend pas un objet File comme sa sortie.


Enfin, il y a aussi un problème plus subtil, qui ne sera pas vous faire du mal dans ce contexte, mais pourrait dans d'autres. Vous avez écrit ...

 if (!fichier.exists()) { 
      System.out.println("File doesn't exists"); 
     } 
     FileOutputStream fOut = openFileOutput(name, MODE_WORLD_READABLE); 

Le problème avec ceci est qu'il existe une condition de concurrence. Entre l'appel exists et l'appel openFileOutput, il existe une petite fenêtre de temps dans laquelle une autre application pourrait sauter et créer le fichier. Ainsi, lorsque vous appelez openFileOutput, il se peut que vous découvriez que le fichier a déjà été créé. Il est clair que, dans ce cas, cela ne fait aucune différence. Mais dans d'autres cas, il pourrait. La leçon est que l'appel File.exists(), File.canWrite et ainsi de suite pour "garder" une tentative suivante de créer/ouvrir un fichier n'est pas fiable.

+0

J'ai vérifié et aucune exception n'est attraper. – user1965878

+0

Eh bien, je maintiens mon commentaire. Même si ce n'est pas la véritable cause de votre problème, c'est un code terrible et devrait être corrigé. –

+0

Ajouté un autre diagnostic possible –

0

Si ce n'est pas le problème de l'exception ci-dessous, il se peut que le résultat de votre premier appel à la méthode exists (peu probable) soit mis en cache. Vous pouvez essayer de créer un nouvel objet fichier après l'appel pour le tester. Si je vous plaisais, j'utiliserais la méthode createNewFile, qui retournera un booléen que vous utiliserez dans votre logique. Ce serait mieux que d'avoir à demander à IO deux fois s'il existe.

public boolean createNewFile() throws IOException 
Questions connexes