Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java没有';我不想在使用inputStream之前关闭outputStream?_Java_Android - Fatal编程技术网

Java没有';我不想在使用inputStream之前关闭outputStream?

Java没有';我不想在使用inputStream之前关闭outputStream?,java,android,Java,Android,我有一个(无可否认很奇怪的)try/catch块,它检查文件是否存在。如果没有,那么我创建它并向其写入一个文件。然后我读了文件 我有一个ArrayList,它通过从ObjectInputStream读取对象来初始化。在最初使用FileOutputStream和ObjectOutputStream写入文件时,如果对它们调用close(),则我的ArrayList将保持null。如果我只是删除对close()的调用,一切都会按计划进行 对我来说,这似乎是倒退。如果我打开了某种类型的流,我会认为文件系

我有一个(无可否认很奇怪的)try/catch块,它检查
文件是否存在。如果没有,那么我创建它并向其写入一个
文件。然后我读了
文件

我有一个
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()方法,事实上它从对象继承了该方法,所以其他基类也没有。