【发布时间】:2014-04-11 07:44:31
【问题描述】:
我正在实现一个Direct Connect 客户端。我正在使用NMDC protocol。我可以连接到集线器和其他连接的客户端。我正在尝试从每个客户端检索文件列表,我知道为了做到这一点,必须从另一个客户端下载文件 files.xml.bz2。下载文件的协议如下:
-> $ADCGET file <filename> <params>|
<- $ADCSND file <fileName> <params>|
<- (*** binary data is now transfered from client B to client A ***)
我正在尝试使用收到的二进制数据创建一个名为 files.xml.bz2 的文件。这是我的代码:
//filesize is provided through the $ADCSND response from other client
byte[] data = new byte[filesize];
/*
Reading binary data from socket inputstream
*/
int read = 0;
for (int i=0; read<filesize;){
int available = in2.available();
int leftspace = filesize-read;
if (available>0){
in2.read(data, read, available>leftspace? leftspace:available);
++i;
}
read += (available>leftspace? leftspace:available)+1;
}
/*
writing the bytes to an actual file
*/
ByteArrayInputStream f = new ByteArrayInputStream(data);
FileOutputStream file = new FileOutputStream("files.xml.bz2");
file.write(data);
file.close();
文件已创建,但内容 (files.xml) 不可读。在 Firefox 中打开它会得到:
XML Parsing Error: not well-formed
在终端查看内容只读取二进制数据。我做错了什么?
编辑
我还尝试使用 Apache Ant 的 bz2 库解压缩文件。
ByteArrayInputStream f = new ByteArrayInputStream(data);
BZip2CompressorInputStream bzstream = new BZip2CompressorInputStream(f);
FileOutputStream xmlFile = new FileOutputStream("files.xml");
byte[] bytes = new byte[1024];
while((bzstream.read(bytes))!=-1){
xmlFile.write(bytes);
}
xmlFile.close();
bzstream.close();
我得到一个错误,这里是堆栈跟踪:
java.io.IOException: Stream is not in the BZip2 format
at org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream.init(BZip2CompressorInputStream.java:240)
at org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream.<init>(BZip2CompressorInputStream.java:132)
at org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream.<init>(BZip2CompressorInputStream.java:109)
at control.Controller$1.run(Controller.java:196)
【问题讨论】:
-
好吧,给定文件名,它看起来像是用 bzip2 压缩的。有没有试过解压看看内容是否符合你的要求?
-
我试过了,没用。还有,你是说不解压就不能简单地接收和保存bz2文件吗?
-
(怎么没有帮助?)我没这么说。您可以毫无问题地保存压缩文件。因此,您似乎没有保存您认为保存的内容...需要更多代码(您如何处理命令等)
-
你是怎么得到接收端的文件大小的?
-
正如代码中的 cmets 突出显示的那样,来自其他客户端的 $ADCSND 响应包括文件大小。响应的示例是
$ADCSND file files.xml.bz2 0 29725 ZL1,29715是以字节为单位的大小。