我遇到了将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向我显示:
什么是合适的文件路径&我应该使用哪种数据类型?
感谢您的帮助
答案 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
的堆栈跟踪。
关于这个"初学者"应该提出的其他几点。代码。
这样做是个坏主意:
} catch (IOException ioException) {
System.err.println("Error opening file.");
}
为什么呢?因为在报告错误之后,您告诉代码继续,好像什么都没发生一样。接下来你要尝试做的是使用objectOutputStream
...尚未初始化!
您应该构建代码,以便不继续应该将代码视为致命错误。
如果您在可能反复打开文件的真实程序中执行此操作,则可能会泄漏文件描述符。打开和使用文件(适用于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