Java的BufferedReader是否在readline()调用之后将字节留在其内部缓冲区中?
|
我遇到了一个问题,在我的服务器中,发送了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:\“是\”是我从套接字的输入流:socket.getInputStream();
我仍然不知道它是否是最好的实现方式,即时通讯试图找出
没有找到相关结果
已邀请:
4 个回复
邦绊门蔽惩
调用,但可以回答您的问题;是的,调用ѭ4可能会在内部缓冲区中留下很多东西。它正在缓冲输入。 如果您将ѭ5中的一个包裹在ѭ6中,那么从ѭ7中读取内容,然后再从ѭ8中读取内容,您将不会真正获得理智的举止。 您可以从
中读取字节,并通过寻找一对
字节来解析出文本行。当您得到的一行显示\“ FILE:a SIZE:Y \\ r \\ n \”时,您照常进行,除了用来解析行的缓冲区可能包含文件的前几个字节外,请写这些首先输出字节。 或者,您使用FTP的想法,使用一个TCP流进行命令,并使用一个TCP流进行实际传输,使用ѭ11from从命令流中读取数据,然后像使用
一样读取数据。
痰降锭骂奸
方法,这只是一个不错的奖励,可以通过缓冲轻松实现。 如果确实需要在同一连接上混合文本和二进制数据,则可能需要使用DataInputStream(在BufferedInputStream之上)及其“ 3”方法-从同一DataInputStream读取数据。 (但是请注意此处的编码。)
很缴
净爽