【问题标题】:java.io.FileNotFoundException Save/Load in internal storage androidjava.io.FileNotFoundException 在内部存储中保存/加载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 然后加载以查看会发生什么?如果可行,那么很可能是何时(或是否)调用它的问题。
  • 保存和加载在两个不同的活动中,但我仍然尝试在应用程序的同一会话中执行此操作(保存、返回主要活动并尝试加载),但我收到了这个错误。

标签: java android save load internal-storage


【解决方案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"));

如果您想使用外部存储,请在两个地方使用外部存储,而不仅仅是一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多