java.io.FileNotFoundException 在内部存储中保存/加载android
Posted
技术标签:
【中文标题】java.io.FileNotFoundException 在内部存储中保存/加载android【英文标题】:java.io.FileNotFoundException Save/Load in internal storage android 【发布时间】:2016-02-22 16:00:53 【问题描述】:我正在尝试将数据从应用程序保存到内部存储并重新加载,但我觉得我错过了一些东西并且在加载中找不到文件。
保存代码:
private void saveScanData(List<MyStack> surf) throws IOException
Log.i(TAG, "Saving");
String filename = String.format("Scan%05d.data", scanNumber);
scanNumber += 1;
ObjectOutput out;
File outFile = new File(Environment.getExternalStorageDirectory(), filename);
out = new ObjectOutputStream(new FileOutputStream(outFile));
out.writeObject(surf);
out.close();
加载代码:
public void load(View view)
ObjectInput in;
List<MyStack> surf= null;
try
in = new ObjectInputStream(new FileInputStream("Scan%05d.data"));
surf= (List<MyStack>) in.readObject();
in.close();
catch (Exception e) e.printStackTrace();
Model model= new Model(surf);
Intent intent = new Intent(this, EditorPresenter.class);
intent.putExtra("model", model);
startActivity(intent);
感谢您的帮助。
【问题讨论】:
为了避免任何其他因素,您是否尝试过立即调用 saveScanData 然后加载以查看会发生什么?如果可行,那么很可能是何时(或是否)调用它的问题。 保存和加载在两个不同的活动中,但我仍然尝试在应用程序的同一会话中执行此操作(保存、返回主要活动并尝试加载),但我收到了这个错误。 【参考方案1】:你用名字写入文件
String.format("Scan%05d.data", scanNumber)
但是你读取了文件名
"Scan%05d.data"
要么更改您的对象输入流创建,要么使用其他方法来创建文件名。
new ObjectInputStream(new FileInputStream(String.format("Scan%05d.data", scanNumber));
【讨论】:
很好,我完全没听懂,但你是对的。如果这不是他的直接问题,那至少是一个需要确定解决的问题。 是的,这绝对是一个需要修复的错误,但我仍然得到相同的 FileNotFoundException【参考方案2】:使用 open openFileOutput 和 openfileInput 方法,而不是打开新的输入和输出流。
http://developer.android.com/intl/es/guide/topics/data/data-storage.html#filesInternal
此外,您正在尝试将文件保存在 ExternalStorage 文件夹中。
Environment.getExternalStorageDirectory()
。写入该文件夹需要 AndroidManifest 上的 Android 权限
【讨论】:
openFileOutput 和 openfileInput 不提供 writeObject 方法来保存对象。<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
right 的 android manifest 应该没问题?
out= new ObjectOutputStream(openFileOutput(fileName,Context.MODE_PRIVATE ));
第一个参数类型错误。找到:'java.io.File',需要:'java.lang.String'。不能用File调用opeFileOutput,只能用字符串名,但是这样我就失去了目录环境
作为第一个参数,您只需要使用文件名(而不是文件对象)。使用内部存储,应用程序有一个预先指定的文件夹,文件被写入其中。openFileOutput 和 openFileInput 在该文件夹中打开一个文件以进行读/写。
这解决了,我以这种方式更改了保存和加载,似乎应用程序可以找到该位置。感谢您的帮助【参考方案3】:
您正在写入外部存储:
new File(Environment.getExternalStorageDirectory(), filename);
你正在从无处阅读:
new ObjectInputStream(new FileInputStream("Scan%05d.data"));
如果您想使用外部存储,请在两个地方使用外部存储,而不仅仅是一个。
【讨论】:
以上是关于java.io.FileNotFoundException 在内部存储中保存/加载android的主要内容,如果未能解决你的问题,请参考以下文章