簡體   English   中英

文件已創建,但返回false

[英]File created but returns false

我不明白為什么我們不輸入第二個if。 我首先檢查文件是否存在(否,邏輯),創建它,然后再次檢查,但它仍返回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();
        }
    }
}
// Why don't we go in this if ?

最可能的原因(IMO)是openFileOutput(name, MODE_WORLD_READABLE)引發異常。

如果發生這種情況,由於這段令人震驚的代碼,您將一無所知。

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

為什么令人震驚?

  1. 您正在捕獲Exception而不是您希望引發的特定異常(例如IOException )。
  2. 您正在“擠壓”例外。 您正在捕獲它,並且無聲地將其丟棄。

這些事情中的每一個都是不好的做法 一起做是很不錯的……您值得在此上浪費一個小時!


如果我對擠壓異常的診斷不正確,那么還有另一種可能性。 openFileOutput的文檔說:

“打開與此Context的應用程序包關聯的私有文件進行寫入。”

目前尚不清楚該文件的打開/創建位置,但似乎與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等來“保護”以下創建/打開文件的嘗試是不可靠的。

嘗試替換這個:

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

如果不是下面的異常問題,則可能是由於您第一次調用exist方法而緩存了結果(不太可能)。 您可以在調用后嘗試創建一個新的文件對象以對此進行測試。

如果您不滿意,我將使用createNewFile方法,該方法將返回一個布爾值供您在邏輯中使用。 這比必須兩次詢問IO是否存在更好。

public boolean createNewFile() throws IOException

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM