第二次读取字节数组会导致错误?

时间:2014-04-07 13:13:23

标签: actionscript-3 air bytearray flash

我使用以下代码从字节数组中读取错误消息,并且第一次正常工作但如果我第二次尝试访问它时会抛出错误:

errorData = process.standardError.readUTFBytes(process.standardError.bytesAvailable);

StandardError的类型为InboundPipe?

错误是:

Error: Error #3212: Cannot perform operation on a NativeProcess that is not running.

即使进程正在运行(process.running为true)。这是对readUTFBytes的第二次调用,这似乎是原因。

更新
这是一个接一个地调用同一个调用的代码。错误发生在下一行和process.running没有从true更改。发生在第二个电话上。

errorData = process.standardError.readUTFBytes(process.standardError.bytesAvailable);
errorData = process.standardError.readUTFBytes(process.standardError.bytesAvailable);

我还发现standardError是 InboundPipe 实例并实现 IDataInput

更新2:
谢谢你的帮助。我在查看bytesAvailable属性时找到了这个文档。

  

[只读]​​返回可供读取的数据的字节数   在输入缓冲区中。用户代码必须致电bytesAvailable以确保这一点   在尝试使用其中一个读取之前,有足够的数据可用   阅读方法。

当我调用readUTFBytes()时,它会将可用字节重置为0.因此,当我第二次读取它并且没有可用字节时,它会导致错误。在我看来,错误是或可能是不正确的或本机进程。运行标志不正确。

我调查了它是否有position属性而它没有,至少在这种情况下没有。

2 个答案:

答案 0 :(得分:3)

在阅读过程之前,您是否可以尝试将position设置为零,尤其是在重复访问之前:

  

将文件指针的当前位置(以字节为单位)移动或返回ByteArray对象。这是读取方法的下一次调用开始读取或写入方法开始写入的时间点。

//ByteArray example
var source: String = "Some data";
var data: ByteArray = new ByteArray();
data.writeUTFBytes(source);
data.position = 0;
trace(data.readUTFBytes(data.bytesAvailable));
data.position = 0;
trace(data.readUTFBytes(data.bytesAvailable));

答案 1 :(得分:0)

这是一个棘手的问题,因为该对象不是一个字节数组,尽管它看起来像一个(相同的方法和几乎相同的属性)。它是一个也实现IDataInput的InboundPipe。

我在查看bytesAvailable属性时找到了此文档。

  

[只读]​​返回可供读取的数据的字节数   在输入缓冲区中。用户代码必须致电bytesAvailable以确保这一点   在试图用其中一个读取之前有足够的数据   阅读方法。

当我调用readUTFBytes()时,它会将可用字节重置为0.因此,当我第二次调用它并且没有可用字节时,会导致错误。在我看来,错误是或者可能是不正确的。本机进程。运行标志不正确,尽管我有理由相信它是前者。

解决方案是在调用read操作之前检查bytesAvailable,如果以后需要访问它,则存储该值。

if (process.standardError.bytesAvailable) {
    errorData = process.standardError.readUTFBytes(process.standardError.bytesAvailable);
    errorDataArray.push(errorData);
}

我研究了它是否有位置属性而它没有,至少在这种情况下不是。