gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:36:05 25 4
gpt4 key购买 nike

我在我的服务器中遇到问题,在发送一个包含 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

在我的客户端中,它无法正确接收。从套接字读取 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);
}
}

仅供注意,我可以解决将 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);
}

PS:“is”是我来自套接字的输入流:socket.getInputStream();

我仍然不知道这是否是最好的实现,我正在尝试找出

最佳答案

没有 readLine()在此处调用代码,但要回答您的问题;是的,请调用BufferedReader.readLine()很可能会在其内部缓冲区中留下一些东西。它正在缓冲输入。

如果您包装 InputStream 之一在 BufferedReader,如果你从 BufferedReader 中阅读,你并不能真正得到太多理智的行为。然后稍后从 InputStream. 中读取

您可以从 InputStream 读取字节并通过查找一对 \r\n 从中解析出文本行字节。当您看到一行显示 "FILE: a SIZE: Y\r\n"时,您将像往常一样继续操作,只是用于解析行的缓冲区可能包含文件的前几个字节,因此首先将这些字节写出。

或者您使用 FTP 的思想,使用一个 TCP 流用于命令,使用一个 TCP 流进行实际传输,从命令流中读取 BufferedReader.readLine(),并像使用 InputStream. 一样读取数据

关于java - 在 readline() 调用之后,Java 的 BufferedReader 是否在其内部缓冲区中留下字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6191909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com