【问题标题】:java.io.IOException: Stream Closed ObjectOutputStreamjava.io.IOException: Stream Closed ObjectOutputStream
【发布时间】:2018-03-27 19:07:56
【问题描述】:

我不断收到 java.io.IOException: Stream Closed ,我似乎无法理解为什么。我在打开两个 ObjectoutputStreams 并写入两个单独文件的按钮按下(如下所示的对象)上创建了两个 SensorReadings 对象(每个对象都发送一个用于文件名的唯一字符串)。这是我第一次使用它时完美无瑕,没有任何例外。当我完成对文件的写入后,我按下另一个按钮来关闭 Objectoutputstreams 并删除我写入的文件。

当我再次尝试按下创建具有新 Objectoutputstreams 和具有不同名称的新文件的新 SensorReadings 对象的按钮时,我遇到 java.io.IOException: Stream Closed 每次我尝试写入文件时。

关闭应用程序并重新启动它将导致第一次再次完美运行,但第二次++时间我得到了同样的错误。

代码:

public class SensorReadings {
    private String macAddress;
    private String cacheFileAccelerationName;
    private String cacheFileEulerAnglesName;
    private File cacheFileAcceleration;
    private File cacheFileEulerAngles;
    private ObjectOutputStream accelerationStreamWriter;
    private ObjectOutputStream euleranglesStreamWriter;

    public SensorReadings(String macAddress, Context context) {
        SimpleDateFormat dateFormata = new SimpleDateFormat("yyyy.MM.dd'-'HH:mm:ss");
        this.macAddress = macAddress;
        cacheFileAccelerationName = dateFormata.format(Calendar.getInstance().getTime())+macAddress+"-acceleration-cache";
        cacheFileEulerAnglesName = dateFormata.format(Calendar.getInstance().getTime())+macAddress+"-eulerangles-cache";

        cacheFileAcceleration = new File(context.getCacheDir(), cacheFileAccelerationName);
        cacheFileEulerAngles = new File(context.getCacheDir(), cacheFileEulerAnglesName);

        try {
            accelerationStreamWriter = new ObjectOutputStream(new FileOutputStream(cacheFileAcceleration));
            euleranglesStreamWriter = new ObjectOutputStream(new FileOutputStream(cacheFileEulerAngles));
        } catch (FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e){
            e.printStackTrace();
        }
    }

    public void addAccelerationData(AccelerationReading reading){
        try {
            accelerationStreamWriter.writeUnshared(reading);
            accelerationStreamWriter.reset();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void addEulerAngleData(EulerAnglesReading reading){
        try {
            euleranglesStreamWriter.writeUnshared(reading);
            euleranglesStreamWriter.reset();
        } catch (IOException e) {
            e.printStackTrace();
        }

    public void closeFiles(){
        try {
            euleranglesStreamWriter.flush();
            accelerationStreamWriter.flush();
            euleranglesStreamWriter.close();
            accelerationStreamWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        cacheFileEulerAngles.delete();
        cacheFileAcceleration.delete();
    }
}

在创建新对象后每次尝试写入时都会出错:

03-27 21:00:38.526 9882-9894/com.appitude.appitude W/System.err: java.io.IOException: Stream Closed
03-27 21:00:38.526 9882-9894/com.appitude.appitude W/System.err:     at java.io.FileOutputStream.write(FileOutputStream.java:310)
03-27 21:00:38.526 9882-9894/com.appitude.appitude W/System.err:     at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1946)
03-27 21:00:38.526 9882-9894/com.appitude.appitude W/System.err:     at java.io.ObjectOutputStream$BlockDataOutputStream.writeByte(ObjectOutputStream.java:1986)
03-27 21:00:38.526 9882-9894/com.appitude.appitude W/System.err:     at java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1612)
03-27 21:00:38.526 9882-9894/com.appitude.appitude W/System.err:     at java.io.ObjectOutputStream.writeUnshared(ObjectOutputStream.java:432)
03-27 21:00:38.526 9882-9894/com.appitude.appitude W/System.err:     at com.appitude.appitude.SensorReadings.addAccelerationData(SensorReadings.java:103)
03-27 21:00:38.526 9882-9894/com.appitude.appitude W/System.err:     at com.appitude.appitude.BLE_Connections.lambda$null$31d3e978$1$BLE_Connections(BLE_Connections.java:265)
03-27 21:00:38.526 9882-9894/com.appitude.appitude W/System.err:     at com.appitude.appitude.BLE_Connections$$Lambda$24.apply(Unknown Source)
03-27 21:00:38.526 9882-9894/com.appitude.appitude W/System.err:     at com.mbientlab.metawear.impl.DeviceDataConsumer.call(DeviceDataConsumer.java:51)
03-27 21:00:38.527 9882-9894/com.appitude.appitude W/System.err:     at com.mbientlab.metawear.impl.StreamedDataConsumer.lambda$addDataHandler$1$StreamedDataConsumer(StreamedDataConsumer.java:138)
03-27 21:00:38.527 9882-9894/com.appitude.appitude W/System.err:     at com.mbientlab.metawear.impl.StreamedDataConsumer$$Lambda$1.onResponseReceived(Unknown Source)
03-27 21:00:38.527 9882-9894/com.appitude.appitude W/System.err:     at com.mbientlab.metawear.impl.JseMetaWearBoard.lambda$null$13$JseMetaWearBoard(JseMetaWearBoard.java:699)
03-27 21:00:38.527 9882-9894/com.appitude.appitude W/System.err:     at com.mbientlab.metawear.impl.JseMetaWearBoard$$Lambda$30.onChange(Unknown Source)
03-27 21:00:38.527 9882-9894/com.appitude.appitude W/System.err:     at com.mbientlab.metawear.android.BtleService$1.onCharacteristicChanged(BtleService.java:188)
03-27 21:00:38.527 9882-9894/com.appitude.appitude W/System.err:     at android.bluetooth.BluetoothGatt$1.onNotify(BluetoothGatt.java:402)
03-27 21:00:38.527 9882-9894/com.appitude.appitude W/System.err:     at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:177)
03-27 21:00:38.527 9882-9894/com.appitude.appitude W/System.err:     at android.os.Binder.execTransact(Binder.java:573)

【问题讨论】:

  • 您如何以及在何处调用 addAccelerationData()?您在关闭流后调用它。
  • 此 addAccelerationData 和 addEulerAngleData 由来自通过蓝牙连接的 MetaWear 传感器的回调调用,这会在每次新读数准备好时触发回调,并为每个读数创建一个新的 AccelerationReading 或 EulerAnglesReading 作为这些函数的参数.
  • 必须有一些关于 ObjectOutputStream 编写器的内容,因为我还使用 PrintWriter 将数据写入文本文件,无论如何它仍然可以完美地工作。 (没有包含在上面的代码中,因为它不是问题的一部分)。但是这些 PrintWriters 的处理方式与 ObjectOutputStreams 大致相同。
  • 认为我找到了问题所在。流数据后我没有解绑服务连接。当再次连接传感器时,它在相同的旧回调中接收到数据。会进一步研究这个。
  • 您的构造函数不应捕获异常。它应该让它们被扔给调用者。让对象在无效状态下构造是没有意义的。

标签: java android


【解决方案1】:

问题解决了。正在传输数据然后写入文件的连接蓝牙设备在关闭流时没有停止,并在激活新会话时继续尝试使用相同的流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 2023-03-25
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 2019-01-12
    相关资源
    最近更新 更多