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 方法来保存对象。 &lt;uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /&gt;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的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中解码 jpeg