在 android 中扩展 dataOuputStream

Extending dataOuputStream in android

您好,我在 android 中使用自定义 dataOutputStream 作为 requestStream。 我在创建扩展 class.

后立即发现警告
public class RequestStream extends DataOutputStream{
/**
 * Constructs a new {@code DataOutputStream} on the {@code OutputStream}
 * {@code out}. Note that data written by this stream is not in a human
 * readable form but can be reconstructed by using a {@link DataInputStream}
 * on the resulting output.
 *
 * @param out the target stream for writing.
 */

我的全集 requestStream 就像 [B@6a4fc1e 一样,应该是完整的请求负载。 (就像上面的警告说它不是人类可读的)

我得到了异常,我猜这是由于格式错误的 dataOutputStream

java.lang.IllegalStateException: Cannot set request property after connection is made

我想知道在代码中放置 {@link DataInputStream} 的位置。

您很少需要扩展 DataOutputStream。通常,您创建一个,然后将数据放入其中。

OutputStream os = ...;
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF("The ultimate answer is: ");
dos.writeInt(42);

在另一端,您创建一个 DataInputStream,并从中提取数据。

InputStream is = ...;
DataInputStream dis = new DataInputStream(is);
String message = dis.readUTF();
int answer = dis.readInt();

extends RequestStream class 可能会添加额外的 "helper" 方法来将更复杂的结构放入流中。在这种情况下,SDK 应提供另一个 class(例如 RequestInputStream extends DataInputStream),其中包含用于提取复杂结构的相应助手。


注意: [B@6a4fc1e不是"not human readable"请求流的内容;它是由 Object#toString() 生成的 "human readable" String,除非被覆盖,否则 returns getClass().getName() + '@' + Integer.toHexString(hashCode())。在这种情况下,class 名称是 [B,是 byte[] 的缩写,哈希码是 6a4fc1e。简而言之,您看到的是缓冲区本身的句柄,而不是缓冲区的内容。

这里至少有三个独立的问题。

  1. 您的 [B@6a4fc1e 是调用 toString() 的结果,这不是处理输出流的正确方法。
  2. IllegalStateException 不是 'result of a malformed DataOutputStream'。这正是它所说的结果:你试图在建立连接后设置一个请求 属性,在你没有发布的代码中。
  3. 您没有在代码中输入 {@link DataInputStream}。您将其放在 Javadoc 注释中。你已经有了。不清楚你在问什么。

我看不出有任何实际理由要在这里扩展 DataOutputStream