Java没有';我不想在使用inputStream之前关闭outputStream?
我有一个(无可否认很奇怪的)try/catch块,它检查Java没有';我不想在使用inputStream之前关闭outputStream?,java,android,Java,Android,我有一个(无可否认很奇怪的)try/catch块,它检查文件是否存在。如果没有,那么我创建它并向其写入一个文件。然后我读了文件 我有一个ArrayList,它通过从ObjectInputStream读取对象来初始化。在最初使用FileOutputStream和ObjectOutputStream写入文件时,如果对它们调用close(),则我的ArrayList将保持null。如果我只是删除对close()的调用,一切都会按计划进行 对我来说,这似乎是倒退。如果我打开了某种类型的流,我会认为文件系
文件是否存在。如果没有,那么我创建它并向其写入一个文件。然后我读了文件
我有一个ArrayList
,它通过从ObjectInputStream
读取对象来初始化。在最初使用FileOutputStream
和ObjectOutputStream
写入文件时,如果对它们调用close()
,则我的ArrayList
将保持null
。如果我只是删除对close()
的调用,一切都会按计划进行
对我来说,这似乎是倒退。如果我打开了某种类型的流
,我会认为文件系统不知何故被“锁定”。这就是为什么我想在使用inputStream
之前关闭outputstream
。但是不,除非我保持outputStreams
打开,否则Java不会让它工作
下面是我的代码,包括对close()
的注释掉的调用,这使它能够正常工作:
try {
File file = context.getFileStreamPath("file");
} catch (Throwable e) {
e.printStackTrace();
try {
FileOutputStream fileOutputStream = context.openFileOutput("file", Context.MODE_PRIVATE);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
reminders = new ArrayList<Reminder>();
objectOutputStream.writeObject(reminders);
// fileOutputStream.close();
// objectOutputStream.close();
} catch (Throwable t) {
t.printStackTrace();
}
}
try {
FileInputStream fileInputStream = context.openFileInput("file");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
if (objectInputStream != null) {
reminders = (ArrayList<Reminder>) objectInputStream.readObject();
}
} catch (Throwable t) {
t.printStackTrace();
}
试试看{
File File=context.getFileStreamPath(“文件”);
}捕获(可丢弃的e){
e、 printStackTrace();
试一试{
FileOutputStream FileOutputStream=context.openFileOutput(“file”,context.MODE\u PRIVATE);
ObjectOutputStream ObjectOutputStream=新的ObjectOutputStream(fileOutputStream);
提醒=新建ArrayList();
objectOutputStream.writeObject(提醒);
//fileOutputStream.close();
//objectOutputStream.close();
}捕获(可丢弃的t){
t、 printStackTrace();
}
}
试一试{
FileInputStream FileInputStream=context.openFileInput(“文件”);
ObjectInputStream ObjectInputStream=新ObjectInputStream(fileInputStream);
if(objectInputStream!=null){
提醒=(ArrayList)objectInputStream.readObject();
}
}捕获(可丢弃的t){
t、 printStackTrace();
}
您不应该关闭fileOutputStream。objectOutputStream的关闭将关闭fileOutputStream
在objectOutputStream之前关闭fileOutputStream将阻止objectObjectStream将其内容刷新到文件中,因为fileOutputStream已经关闭
不确定为什么不关闭这两个函数都允许代码工作,除非objectOutputStream finalize方法在其超出范围时刷新内容。是否获得任何异常堆栈跟踪?如果(objectInputStream!=null)
检查在这里应该是多余的(构造函数调用永远不能返回null
)。看起来您正在向流中写入一个空的arraylist。如果你写了一个记录然后关闭它会发生什么?这让我想知道outputstream对象是否为您的对象分配了一些最小的空间,除非您关闭它,否则该对象没有GC。它没有finalize()方法,事实上它从对象继承了该方法,所以其他基类也没有。