Android File.exists()始终为true

时间:2015-09-28 11:03:15

标签: java android file-io

我尝试使用此功能将文件从assets文件夹复制到设备文件夹:

public static void copyJSON(Context aContext) {
    AssetManager assetManager = aContext.getResources().getAssets();
    String[] pFiles = null;
    try {
        pFiles = assetManager.list("ConfigurationFiles");
    } catch (IOException e) {
        Log.e("tag", "Failed to get asset file list.", e);
    }
    if (pFiles != null) for (String pJsonFileName : pFiles) {
        InputStream tIn = null;
        OutputStream tOut = null;
        try {
            tIn = assetManager.open("ConfigurationFiles" + File.separator + pJsonFileName);
            String[] pList = aContext.getFilesDir().list(); //just for test
            File pOutFile = new File(aContext.getFilesDir(), pJsonFileName);
            tOut = new FileOutputStream(pOutFile);
            if (pOutFile.exists()) {
                copyFile(tIn, tOut);
            }
        } catch (IOException e) {
            Log.e("tag", "Failed to copy asset file: " + pJsonFileName, e);
        } finally {
            if (tIn != null) {
                try {
                    tIn.close();
                } catch (IOException e) {
                    Log.e("tag", "Fail closing", e);
                }
            }
            if (tOut != null) {
                try {
                    tOut.close();
                } catch (IOException e) {
                    Log.e("tag", "Fail closing", e);
                }
            }
        }
    }
}

如果我删除应用程序并运行代码,变量pList就像我预期的那样是空的,但是pOutFile.exists()返回true总是!!。

我不想每次打开我的应用程序时再次复制它们,而且我这样做是因为我的所有应用都使用JSON来浏览所有屏幕,所以如果我更改了我的任何值BBDD一个WS发送一个新的JSON文件,应用程序响应,例如不再需要一个按钮,所以你第一次下载我的应用程序我复制原始的JSON,如果你使用该应用程序,如果你有互联网连接你将下载一个新的JSON文件,它比Bundle中的更准确,它将被覆盖,这是因为据我所知,我无法更改assets文件夹中的文件。 / p>

我到处都读过,所有人都这样说:

File pOutFile = new File(aContext.getFilesDir(), pJsonFileName);

然后问这个:

pOutFile.exists()

我不知道自己做错了什么。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

这样说:

File pOutFile = new File(aContext.getFilesDir(), pJsonFileName);
if (pOutFile.exists()) {
  tOut = new FileOutputStream(pOutFile);
  copyFile(tIn, tOut);
}

一切都应该正常。请记住FileOutputStream创建应该流式传输的文件(如果可能且不存在)

答案 1 :(得分:0)

问题是你实际上是在创建一个文件,然后检查它是否存在。

try {
    tIn = assetManager.open("ConfigurationFiles" + File.separator + pJsonFileName);
    String[] pList = aContext.getFilesDir().list(); //just for test
    File pOutFile = new File(aContext.getFilesDir(), pJsonFileName);

    // See here: you're creating a file right here
    tOut = new FileOutputStream(pOutFile);

    // And that file will be created in the exact location of the file
    // you're trying to check:
    if (pOutFile.exists()) {  // Will always be true if FileOutputStream was successful
        copyFile(tIn, tOut);
    }
}

您应该在完成存在检查后创建FileOutputStream。

来源:http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html

答案 2 :(得分:0)

您刚刚创建但未获得异常的文件始终存在。测试毫无意义。删除它。