在readline()调用之后,Java的BufferedReader是否在其内部缓冲区中留下了字节?

fre*_*crs 0 java sockets file transfer

我有一个问题,在我的服务器中,在我发送一个包含X字节的文件后,我发送一个字符串说这个文件结束了,另一个文件即将到来,就像

FILE: a SIZE: Y\r\n
send Y bytes
FILE a FINISHED\r\n
FILE b SIZE: Z\r\n
send Z byes
FILE b FINISHED\r\n
FILES FINISHED\r\n
Run Code Online (Sandbox Code Playgroud)

在我的客户端,它没有正确回收.在从套接字读取Y或Z字节后,我使用readline()来获取命令行.有一个文件它工作正常,多个文件很少工作(是的,我不知道它是如何工作一次或两次)

以下是我用来传输二进制文件的一些代码

public static void readInputStreamToFile(InputStream is, FileOutputStream fout,
        long size, int bufferSize) throws Exception
{
    byte[] buffer = new byte[bufferSize];
    long curRead = 0;
    long totalRead = 0;
    long sizeToRead = size;
    while(totalRead < sizeToRead)
    {
        if(totalRead + buffer.length <= sizeToRead)
        {
            curRead = is.read(buffer);
        }
        else
        {
            curRead = is.read(buffer, 0, (int)(sizeToRead - totalRead));
        }
        totalRead = totalRead + curRead;
        fout.write(buffer, 0, (int) curRead);
    }
}





public static void writeFileInputStreamToOutputStream(FileInputStream in, OutputStream out, int bufferSize) throws Exception
{
    byte[] buffer = new byte[bufferSize];
    int count = 0;
    while((count = in.read(buffer)) != -1)
    {
        out.write(buffer, 0, count);
    }
}
Run Code Online (Sandbox Code Playgroud)

只是为了注意我可以解决将readline替换为此代码:

    ByteArrayOutputStream ba = new ByteArrayOutputStream();
    int ch;
    while(true)
    {
        ch = is.read();
        if(ch == -1)
            throw new IOException("Conecção finalizada");
        if(ch == 13)
        {
            ch = is.read();
            if(ch == 10)
                return new String(ba.toByteArray(), "ISO-8859-1");
            else
                ba.write(13);
        }
        ba.write(ch);
    }
Run Code Online (Sandbox Code Playgroud)

PS:"是"是来自socket的输入流:socket.getInputStream();

我仍然不知道它是否是最好的实现,我试着弄明白

nos*_*nos 5

这里的readLine()代码中没有调用,而是回答你的问题; 是的,调用BufferedReader.readLine()可能很好地留下内部缓冲区中的东西.它正在缓冲输入.

如果你换你的一个InputStreamBufferedReader,如果从阅读你不能真正得到多少理智的行为BufferedReader,然后从后面看InputStream.

您可以从中读取字节,InputStream并通过查找一对字节来解析文本行\r\n.当你得到一行"FILE:a SIZE:Y\r \n"时,你会像往常一样继续,除了用于解析行的缓冲区可能包含文件的前几个字节,所以先写出这些字节.

或者您使用FTP的想法并使用一个TCP流来执行命令,使用一个TCP流进行实际传输,从命令流中BufferedReader.readLine(),读取并读取数据,就像您已经使用InputStream.