2013-04-18 2 views
1

Я не понимаю, почему мы не вводим второй, если. Сначала я проверяю, существует ли файл (нет, логический), я его создаю, и я снова проверяю его, но он все равно возвращает false. Я пробовал час найти проблему, и я уверен, что это глупая ошибка. Извините за мой плохой английскийФайл создан, но возвращает false

Вот код:

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

редактирование: рабочий код

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

чтения openFileOutput документации. у него нет того же bahaviour, что и файл – njzk2

ответ

1

Попробуйте заменить это:

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

на это:

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

Я пробовал, и я получаю эту ошибку: open failed: EROFS (файловая система только для чтения) – user1965878

+0

Это потому, что вы не можете писать везде, где хотите на своем устройстве. Вам необходимо записать файл в папку приложения. Проверьте это: [http://stackoverflow.com/questions/10787942/android-read-only-file-system-ioexception](http://stackoverflow.com/questions/10787942/android-read-only-file- system-ioexception) – Padrus

+0

Хорошо, спасибо мой код работает сейчас. Я поставил свой новый код в свой пост, чтобы помочь другим людям. – user1965878

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

Наиболее вероятной причиной (ИМО) является то, что openFileOutput(name, MODE_WORLD_READABLE) бросает исключение.

Если это произойдет, вы не узнаете об этом из-за этой ужасающей части кода.

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

Почему ужасно?

  1. Вы ловли Exception, а не конкретных исключений, которые вы ожидают быть выброшен (например IOException).
  2. Вы «избиваете» исключение. Вы ловите его и молча отбрасывая его.

Каждая из этих вещей в отдельности Плохая практика. Делать их вместе ... хорошо ... вы заслуживаете, чтобы потратить впустую час на это!


Если мой диагноз раздавленного исключения неверен, тогда есть еще одна возможность. Документы для openFileOutput сказать:

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

Это не совсем понятно, где будет открыт/создан этот файл, но вполне вероятно, что он находится в другом месте «» туда, где File.exists смотрит. Вы заметите, что openFileOutput не принимает объект File в качестве своего вывода.


Наконец, есть и более тонкая проблема, что не повредит вам в этом контексте, но мог в других. Вы написали ...

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

Проблема в том, что есть состояние гонки. Между вызовом exists и вызовом openFileOutput есть небольшое временное окно, в котором какое-то другое приложение может вскочить и создать файл. Поэтому, когда вы вызываете openFileOutput, он может обнаружить, что файл уже создан.

Очевидно, что в этом случае это не имеет значения. Но в других случаях это возможно. Урок состоит в том, что вызов File.exists(), File.canWrite и т. Д. Для «защиты» следующей попытки создать/открыть файл не является надежным.

+0

Я проверил и не исключение Exception. – user1965878

+0

Ну, я согласен с моими комментариями. Даже если это не истинная причина вашей проблемы, это ужасный код и должен быть исправлен. –

+0

Добавлен еще один возможный диагноз –

0

Если это не проблема, описанная ниже, она может кэшировать результат от вашего первого вызова метода exist (маловероятно). Вы можете попробовать создать новый объект файла после вызова, чтобы проверить это.

Если я буду вам, я бы использовал метод createNewFile, который вернет логическое значение для использования вами в вашей логике. Это было бы лучше, чем попросить IO дважды, если он существует.

public boolean createNewFile() throws IOException 
Смежные вопросы