获取围绕Socket.getOutputStream编写的DataOutputStream的字节数

时间:2015-11-21 10:20:58

标签: java sockets io

我有一个服务器客户端应用程序并使用java套接字API。

服务器将通过调用DataOutputStream的write(bytes[] b)向客户端发送字节,DataOutputStream直接包含client.getOutputStream(此处没有缓冲区)。

这是一个文件下载功能我将支持简历,我没有在这里使用任何HTTP,我已经实现了我自己的简单协议。

我在SO上看过这些问题:
1 - question1
。 2 - C# question
。 3 - FileChannel question

第一个没有回答我的问题,我无法在ByteArrayOutputStream周围包装DataOutputStream,因为后者不能被client.getOutputStream包裹,我不知道如何实现我自己的write(int i)方法(并且不想使用JNI)。

第二个是C#而不是java(无论如何它正在调用WIN API,顺便说一下,我是一个linux用户:))。

第三个是谈论FileChannels和HTTP,正如我所说我没有使用HTTP而我正在使用java Socket的API。

那么如何获取实际写入的字节数呢?

PS(编辑)

通过恢复支持我的意思是我会让客户端能够在特定字节停止下载,然后一段时间后(分钟,小时,天,等等)他/她可以从它离开的地方继续下载。

2 个答案:

答案 0 :(得分:2)

  • write(int c)撰写的byes数为1。

  • write(bye[] buffer)写的字节数由buffer.length给出。

  • write(bye[] buffer, int offset, int length)写的字节数由length给出。

正如它在Javadoc中所说的那样。

答案 1 :(得分:1)

当您将数据写为字节数组时,也要写入数据的大小。读取数据时,请读取大小并构造字节数组。

我更喜欢并使用此方法发送大文件(> 10 MB),包括从客户端到服务器的图像。通过预先写入大小,您可以知道从byte []

中读取多少字节

请查看此onethis article以将文件转换为byte []并返回

$connection = new Mongo();
$db = $connection->selectDB('dbname');
$collection = $db->selectCollection('collection_name');

$filter = array();
$remove_document = array(
    '$pull' => array(
        'gm_favourites' =>  array(
            'gm_user_id' =>  '55f90ccf2f170d79048b4570',
        ) 
    ) 
);
$options['multiple'] = true;

$collection->update($filter, $remove_document, $options);

编辑:(用于恢复下载,当我回答时,这不是原帖的一部分)

  1. 保存您在客户端从服务器读取的字节数(使用inputStream.read()而不是inputStream.readFully()

  2. 重新连接服务器时跳过该值(bytesAlreadyRead)