我在理解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!
文件存在
答案 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);
...