读取文件java时检测到-1

时间:2017-10-25 19:00:01

标签: java file byte

java中的服务器程序中读取时,输出模糊不清:

byte [] mybytearray  = new byte [content_length]; 
InputStream inputStream = clientSocket0.getInputStream(); //Getting input 
from peer0
FileOutputStream fileOutputStream = new FileOutputStream(fileDownloaded); 
//Sending the output to local directory
BufferedOutputStream bufferedOutputStream = new 
BufferedOutputStream(fileOutputStream);

bytesRead = inputStream.read(mybytearray,0,content_length);
System.out.println("First read : " +bytesRead);
current = bytesRead;
if(bytesRead!=content_length) {
              current = bytesRead;
               do {
                        System.out.println(current +"-Current");
                        System.out.println("Read it : "+(mybytearray.length-current));
                        bytesRead =
                              inputStream.read(mybytearray, current, (mybytearray.length-current));
                          System.out.println("***"+bytesRead);
                         if(bytesRead == -1) {
                             //current = content_length;
                             break;
                         }
                         else 
                           current += bytesRead;
                     } while(current < content_length );
                }

                bufferedOutputStream.write(mybytearray, 0 , current);

                bufferedOutputStream.flush();
                bufferedOutputStream.close();
                inputStream.close();
                inFromServer0.close();

它为某些文件提供以下输出:

  

内容长度33996
  C:\用户\萨米特\ GIT中\ IP_Task2 \任务1 \对等方1 / rfc8183.txt.pdf
  首先阅读:24356
  24356电流
  阅读:9640
  *** - 1个

循环中的bytesRead为-1,因此无法创建正确的文件。

1 个答案:

答案 0 :(得分:1)

每当您使用某个方法时,您应该阅读其文档以查看它可以返回的值。

查看InputStream.read(byte[], int, int)的说明:

  

public int read(byte [] b,                      int off,                      int len)                 抛出IOException

     

将输入流中最多len个字节的数据读入一个字节数组。尝试读取len个字节,但可以读取较小的数字。实际读取的字节数以整数形式返回。

     

此方法将阻塞,直到输入数据可用,检测到文件结尾或抛出异常。

     

如果len为零,则不读取任何字节,返回0;否则,尝试读取至少一个字节。如果没有字节可用,因为流位于文件末尾,则返回值-1;否则,至少读取一个字节并存储到b。

     

读取的第一个字节存储在元素b [off]中,下一个读入b [off + 1],依此类推。读取的字节数最多等于len。设k为实际读取的字节数;这些字节将存储在元素b [off]到b [off + k-1]中,使元素b [off + k]到b [off + len-1]不受影响。

     

在每种情况下,元素b [0]到b [off]和元素b [off + len]到b [b.length-1]不受影响。

     

类InputStream的read(b,off,len)方法只是重复调用方法read()。如果第一个这样的调用导致IOException,则从对read(b,off,len)方法的调用返回该异常。如果对read()的任何后续调用导致IOException,则捕获该异常并将其视为文件结束;读取到该点的字节存储在b中,并返回在发生异常之前读取的字节数。此方法的默认实现将阻塞,直到读取了请求的输入数据len,检测到文件结尾或抛出异常为止。鼓励子类提供更有效的方法实现。

     

参数:

b - the buffer into which the data is read.

off - the start offset in array b at which the data is written.

len - the maximum number of bytes to read.
     

返回:

the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached.

非常仔细地阅读最后一行。 -1是一个特殊的返回值,表示没有数据被读取,因为InputStream中没有可用的附加输入。