纯Java和Android中的默认文件路径之间的差异

时间:2017-07-15 13:02:59

标签: java android

我在理解Android中的路径方面遇到了问题。我正在尝试检查文件是否存在。它在纯Java中运行良好,但在Android代码中失败,我以相同的方式给出路径(它只是一个文件名)。我知道该文件存在(在Android中)因为我在调用exists()类的File方法之前通过读取它来检查它。我可以毫无问题地读取文件,但存在检查返回false。所以我的问题是:当谈到路径时,'普通''android' Java有什么区别?

这个问题看起来类似于'为什么file.exists()返回false?'但是我已经做了一些阅读(很多)并没有找到答案(两者都有 - 如何检查Android中是否存在文件以及Android中纯Java和Java中的路径之间的区别。

下面我粘贴说明案例的代码。

这在Android中无效:

//--------------------------BUTTONS ACTIONS-----------------------------------------------------

public void onSaveButtonClick(View view){
    msg = textInput.getText().toString();

    try {
        FileOutputStream fos = openFileOutput(fileName, MODE_PRIVATE);
        fos.write(msg.getBytes());
        fos.close();
        Toast.makeText(getApplicationContext(), "Zapiasano!", Toast.LENGTH_LONG).show();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void onLoadButtonClick(View view){

    loadedMsg = "";
    String tmp;
    try {
        FileInputStream fis = openFileInput(fileName);
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader bufferedReader = new BufferedReader(isr);
        StringBuffer stringBuffer = new StringBuffer();
        while ((tmp=bufferedReader.readLine()) != null){
            loadedMsg += tmp + "\n";
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    textDisplay.setText(loadedMsg);

    //----------------------FILE CHECK---------------------------------------------

    File f = new File(fileName);
    if(f.exists()){
        textDisplay.setText("File exsists");
    } else{
        textDisplay.setText("File doesn't exsists");
    }
}

这适用于纯Java:

public static void main(String[] args) {

    String fileName = "test.file";
    String str = "hello kitty!";
    String loaded = "this should not load";

    //-----------------SAVE------------------------------------------------
    try {
            FileOutputStream fos;
            fos = new FileOutputStream(fileName);
            fos.write(str.getBytes());
            fos.close();
            System.out.println("saved");
        } catch (FileNotFoundException ex) {
            Logger.getLogger(FileExists.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(FileExists.class.getName()).log(Level.SEVERE, null, ex);
        }

    //------------------LOAD -----------------------------------------------
    try {
        FileInputStream fis = new FileInputStream(fileName);
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader bufferedReader = new BufferedReader(isr);
        loaded = bufferedReader.readLine();
        isr.close();
        fis.close();

    } catch (FileNotFoundException ex) {
        Logger.getLogger(FileExists.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(FileExists.class.getName()).log(Level.SEVERE, null, ex);
    }

    System.out.println(loaded);

    //----------------------FILE CHECK---------------------------------------------
    File file = new File(fileName);
    if(file.exists()){
        System.out.println("file exsists");
    }
}

输出:

  

保存

     

hello kitty!

     

文件存在

2 个答案:

答案 0 :(得分:0)

  

所以我的问题是:当谈到路径时,'普通'和'android'之间有什么区别?

其他Java环境假设某个当前工作目录。出于所有意图和目的,Android不会。

您的Android代码假定以下三件事情是相关的:

FileOutputStream fos = openFileOutput(fileName, MODE_PRIVATE);
FileInputStream fis = openFileInput(fileName);
File f = new File(fileName);

前两个是相关的。第三是没有意义的。等效的行是:

File f = new File(getFilesDir(), fileName);

在Android中,您始终使用框架提供的方法确定文件系统路径,以便为您提供基本目录(getFilesDir()getExternalFilesDir(),方法{{1等等。)。

答案 1 :(得分:0)

FileOutputStream(filename)的实施都将文件保存在filename给出的位置。所以他们假设它实际上是文件的绝对路径。

区别在于'参考'他们用来走那条路。

您系统上的Java会看到与源位置相关的路径, 因此,您使用FileOutputStream(filename)以//文件名保存文件,然后使用File(filename)/<reference path>/filename获取该文件,并始终找到该文件。

Android FileOutputStream(filename)会在您的包目录中看到与files/目录相关的位置。虽然它的实现File(pathname)看到了与根目录相关的路径。

因此,在android中,当您使用FileOutputStream(filename)编写时,您正在写入文件/<path to your package directory>/files/filename,但是当您使用File()时,实际上是尝试访问根文件即/filename,其实际上并不存在。

而是尝试:

....
File f = new File (YourActivity.this.getFilesDir().getAbsolutePath() + filename);
...