将序列化对象写入文件

时间:2018-02-16 12:35:21

标签: java android android-studio object saving-data

我遇到了将Java对象保存到文件的问题。我正在使用 Android Studio 编写应用程序。

Outgoing是我要保存的对象,它包含两个Strings和一个int

private FileOutputStream fileOutputStream;
private ObjectOutputStream objectOutputStream;

public void save(String name, String category, int price){

    // Open file
    try {
        fileOutputStream = new FileOutputStream("outgoings.tmp");
        objectOutputStream = new ObjectOutputStream(fileOutputStream);
    } catch (IOException ioException) {
        System.err.println(ioException.getMessage());
    }

    // Saving
    Outgoing record;
    Scanner input = new Scanner(System.in);

    while (input.hasNext()) {
        try{
            if(name != null){
                record = new Outgoing(name, category, price);
                objectOutputStream.writeObject(record);
            }
        }
        catch(IOException ioException){
            System.err.println(ioException.getMessage());
        }
    }

    // Close file
    try{
        objectOutputStream.close();
    }
    catch (IOException ioException) {
        System.err.println(ioException.getMessage());
    }
}

当我启动应用程序时,执行方法save(),应用程序崩溃。

// Open file
try {
    fileOutputStream = new FileOutputStream("outgoings.tmp");
    objectOutputStream = new ObjectOutputStream(fileOutputStream);
} catch (IOException ioException) {
    System.err.println(ioException.getMessage());
}

- >抛出IOException并且Logcat向我显示:

Logcat

什么是合适的文件路径&我应该使用哪种数据类型?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

如果您收到消息"Error opening file.",则表示对openFile()的调用失败:

public void openFile() {
    try {
        fileOutputStream = new FileOutputStream("outgoings.tmp");
        objectOutputStream = new ObjectOutputStream(fileOutputStream);
    } catch (IOException ioException) {
        System.err.println("Error opening file.");
    }

ObjectOutputStream构造函数在此上下文中几乎无法失败,因此问题必须是new FileOutputStream("outgoings.tmp")抛出IOException,最可能的解释是您无权在当前目录中创建文件。 (其他解释是可能的......)

要了解这一点,您需要修改代码以打印或记录IOException的堆栈跟踪。

关于这个"初学者"应该提出的其他几点。代码。

  1. 这样做是个坏主意:

    } catch (IOException ioException) {
        System.err.println("Error opening file.");
    }
    

    为什么呢?因为在报告错误之后,您告诉代码继续,好像什么都没发生一样。接下来你要尝试做的是使用objectOutputStream ...尚未初始化!

    您应该构建代码,以便继续应该将代码视为致命错误。

  2. 如果您在可能反复打开文件的真实程序中执行此操作,则可能会泄漏文件描述符。打开和使用文件(适用于Java 6及更高版本)的正确模式是使用" try-with-resources"构造; e.g。

    try (FileOutputStream out = new FileOutputStream(...)) {
        // write stuff
    }
    

    try的主体结束时,在开始时打开的资源将被自动关闭。在任何重要的情况下都会发生 。相比之下,如果您手动关闭资源,则存在无法在所有情况下全部关闭的风险。

答案 1 :(得分:0)

首先,我们可以尝试在公共目录中编写,以便使用任何文件管理器应用程序轻松检查结果。

在写入文件系统之前,请确保AndroidManifest.xml包含两个权限请求:

<manifest ...>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

...
</manifest>

如果您的设备或模拟器/ VM运行Android 5或更低版本,我们可以继续编写文件。如果不是,请查看android developer documentation关于在运行时请求权限的部分。

这里有一些代码可以为您提供95%概率的可写目录:

File destination = new File(Environment.getExternalStorageDirectory(), "My Cool Folder");
destination.mkdirs();

所以现在你可以尝试在那里写一个文件

fileOutputStream = new FileOutputStream(new File(destination, "outgoings.tmp"));
//write there anything you want