为什么InputStream.read()不读取所有字节?

时间:2017-08-10 16:58:28

标签: java sockets inputstream outputstream fileinputstream

我正在尝试编写一个java程序,使用Sockets通过网络将文件从一个设备传输到另一个设备。所以我有两个类,ServerClient来处理程序IO。我正在使用FileInputStream将本地文件的字节读入Client和Socket的OutputStream以将读取的字节发送到Server。这是

  

class Client 的代码段:

int read;
System.out.print("Enter name of file to send : ");
String fileName = br.readLine();
File file = new File(fileName);
if(!file.exists()) {
    LISTENER.log(fileName + "does not exists."); // Exception Logging
    throw new IOException("File not found : " + fileName);
}
String parts[] = fileName.split("\\.");
String ext = parts[parts.length-1]; // Extracts the file extension
PrintWriter pw = new PrintWriter(sock.getOutputStream());
InputStream is = new FileInputStream(file);
pw.println(ext); // Sends file extension to the socket output stream
pw.flush();
while((read = is.read()) != -1) {
    os.write(read); // Sends read bytes to the socket output stream
    os.flush();
}

解释:所以我在这里尝试获取文件名并创建一个File对象fileString ext提取文件扩展名并将其发送到ServerPrintWriter(以便在接收方端,它可以创建已知扩展名的文件)。之后,InputStream is读取文件字节而不将其缓冲到class Clientfor better performance),直接通过套接字OutputStream os发送读取的字节。

  

class Server 的代码段:

String ext; int read;
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
InputStream is = socket.getInputStream();
while(running) {
    ext = br.readLine(); // reads the file extension sent from client
    if(ext == null)
        throw new NullPointerException("File name provided does not have any specified extention");
    broadcast(ext); // sends the file extension back to all clients
    while((read = is.read()) != -1) {
        broadcast(read); // sends the read bytes to all clients
    }
}

解释:此处,Socket的InputStream Reader读取第一行,其中包含Client通过PrintWriter传递的文件扩展名。 broadcast(String)方法用于通过Client将扩展程序发送回所有PrintWriter实施。然后,Socket的InputStream is read()方法读取File的字节,直到它返回-1(流结束)。 broadcast(int)将读取的字节发送回所有Client实现。

  

问题:

class Server的InputStream没有读取从class Clients的OutputStream发送的所有字节,因此它被卡在while((read = is.read()) != -1)循环中,因为流从未返回-1。

我试图找到解决方案,为什么InputStream没有读取所有字节,但是在任何地方都提到使用read(byte[],int,int)而不是read()。但我的问题是为什么。为什么InputStream没有读取所有字节,为什么在这种情况下从不返回-1?

0 个答案:

没有答案