InputStream read()方法永远不会返回-1(Java)

时间:2013-10-28 20:20:48

标签: java client inputstream transfer

我正在尝试使用JAVA发送文件。我的问题是客户端永远不知道是否到达文件的末尾。所以客户端的while循环永远不会结束。请帮帮我。

服务器(向客户端发送数据)

File myFile = new File("C://LEGORacers.exe");

      byte[] mybytearray = new byte[(int) myFile.length()];
      BufferedInputStream bis = null;
      OutputStream os = null;

        bis = new BufferedInputStream(new FileInputStream(myFile));
        bis.read(mybytearray, 0, mybytearray.length);

        os = socket.getOutputStream();      
        os.write(mybytearray, 0, mybytearray.length);       
        os.flush();

        bis.close();

客户端(从服务器获取数据)

byte[] buf = new byte[1024];
    InputStream is = null;
    int bytesRead = 0;

    is = client.getInputStream();
    FileOutputStream fos = null;
    fos = new FileOutputStream("C://copy.exe");


    BufferedOutputStream bos = new BufferedOutputStream(fos);

     try {
            while (-1 != (bytesRead = is.read(buf, 0, buf.length))) {
            // This while loop never ends because is.read never returns -1 and I don't know why...

                bos.write(buf, 0, bytesRead);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
               is.close();
               bos.flush();
               bos.close();
               fos.close();

        }

2 个答案:

答案 0 :(得分:1)

关闭服务器上的套接字输出流。刷新不会终止流,这是您发送服务器完成写入的信号所需要做的事情。根据您发布的内容,我看不到您在服务器端关闭输出流的位置。

答案 1 :(得分:1)

您是否关闭了服务器上的OutputStream?如果没有,您的循环可能会永久地将bytesRead设置为0,因此您可能需要关闭该流。

如果您需要服务器的OutputStream在发送数据后仍然打开,您还可以在流的开头发送数据的大小(以字节为单位),然后循环直到您拥有服务器的所有字节表示会发送。