2017-07-15 39 views
0

我在理解Android中的路徑時遇到了問題。我試圖檢查文件是否存在。它在純Java中工作正常,但在Android代碼中失敗,我以同樣的方式給出路徑(它只是一個文件名)。我知道該文件存在(在Android中),因爲我已經通過讀取它來檢查它,然後調用exists()方法File類。我可以讀取沒有問題的文件,但存在檢查返回false。所以我的問題是:有什麼區別'正常''android' Java當談到路徑?純Java和Android中默認文件路徑的區別

這個問題似乎類似於'爲什麼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"); 
    } 
} 

OUTPUT:

保存

的hello kitty!

文件exsists

回答

0

所以我的問題是:什麼是「正常」和「Android的Java之間的區別,當涉及到的路徑?

其他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(),上Environment方法等)的工作確定文件系統路徑。

+0

謝謝你 - 這既解決了自己的問題(有什麼區別,以及如何檢查文件是否存在)。 – Sumo

0

FileOutputStream(filename)的執行都將文件保存在filename給定的位置。所以他們認爲它實際上是文件的絕對路徑。

不同之處在於他們使用「參考」來獲取該路徑。

的Java系統上看到相對於源位置是路徑, 所以你使用FileOutputStream(filename)保存文件的文件名//然後用File(filename)/<reference path>/filename獲取該文件,你總能找到該文件therere。

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); 
... 
+0

謝謝,你的回答非常有幫助! – Sumo