在 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
。简而言之,您看到的是缓冲区本身的句柄,而不是缓冲区的内容。
这里至少有三个独立的问题。
- 您的
[B@6a4fc1e
是调用 toString()
的结果,这不是处理输出流的正确方法。
IllegalStateException
不是 'result of a malformed DataOutputStream
'。这正是它所说的结果:你试图在建立连接后设置一个请求 属性,在你没有发布的代码中。
- 您没有在代码中输入
{@link DataInputStream}
。您将其放在 Javadoc 注释中。你已经有了。不清楚你在问什么。
我看不出有任何实际理由要在这里扩展 DataOutputStream
。
您好,我在 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
。简而言之,您看到的是缓冲区本身的句柄,而不是缓冲区的内容。
这里至少有三个独立的问题。
- 您的
[B@6a4fc1e
是调用toString()
的结果,这不是处理输出流的正确方法。 IllegalStateException
不是 'result of a malformedDataOutputStream
'。这正是它所说的结果:你试图在建立连接后设置一个请求 属性,在你没有发布的代码中。- 您没有在代码中输入
{@link DataInputStream}
。您将其放在 Javadoc 注释中。你已经有了。不清楚你在问什么。
我看不出有任何实际理由要在这里扩展 DataOutputStream
。