gpt4 book ai didi

Java:BufferedReader 读取多于一行?

转载 作者:搜寻专家 更新时间:2023-10-31 20:07:40 25 4
gpt4 key购买 nike

我正在用 Java 使用套接字编写一个程序。我可以向客户端发送命令,也可以从客户端向服务器发送命令。为了读取命令,我使用了 BufferedReader。要编写它们,一个PrintWriter 但现在我想通过那个套接字传输文件(不仅仅是创建第二个连接)
首先,我将文件包含的字节数写入输出流。例如 40000 字节。所以我通过套接字写入数字 40000,但连接的另一端读取 78

所以我在想:BufferedReader 读取的不仅仅是行 (通过调用 readLine()) 这样我就输了来自文件数据的一些字节。因为它们位于 BufferedReader 的缓冲区中。
所以数字 78 是我要传输的文件的一个字节。

这种思路对不对。如果是这样,如何解决这个问题。
我希望我解释得很好。


这是我的代码,但我的默认语言是荷兰语。所以一些变量名听起来很奇怪。

public void flushStreamToStream(InputStream is, OutputStream os, boolean closeIn, boolean closeOut) throws IOException {
byte[] buffer = new byte[BUFFERSIZE];
int bytesRead;
if ((!closeOut) && closeIn) { // To Socket from File
action = "Upload";
os.write(is.available()); // Here I write 400000
max = is.available();
System.out.println("Bytes to send: " + max);
while ((bytesRead = is.read(buffer)) != -1) {
startTiming(); // Two lines to compute the speed
os.write(buffer, 0, bytesRead);
stopTiming(); // Speed compution
process += bytesRead;
}
os.flush();
is.close();
return;
}
if ((!closeIn) && closeOut) { // To File from Socket
action = "Download";
int bytesToRead = -1;
bytesToRead = is.read(); // Here he reads 78.
System.out.println("Bytes to read: " + bytesToRead);
max = bytesToRead;
int nextBufferSize;
while ((nextBufferSize = Math.min(BUFFERSIZE, bytesToRead)) > 0) {
startTiming();
bytesRead = is.read(buffer, 0, nextBufferSize);
bytesToRead -= bytesRead;
process += nextBufferSize;
os.write(buffer, 0, bytesRead);
stopTiming();
}
os.flush();
os.close();
return;
}
throw new IllegalArgumentException("The only two boolean combinations are: closeOut == false && closeIn == true AND closeOut == true && closeIn == false");
}

解决方法如下:
感谢 James 的建议
我认为 laginimaineb anwser 是解决方案的一部分。

阅读命令。

DataInputStream in = new DataInputStream(is); // Originally a BufferedReader
// Read the request line
String str;
while ((str = in.readLine()) != null) {
if (str.trim().equals("")) {
continue;
}
handleSocketInput(str);
}

现在是 flushStreamToStream:

public void flushStreamToStream(InputStream is, OutputStream os, boolean closeIn, boolean closeOut) throws IOException {
byte[] buffer = new byte[BUFFERSIZE];
int bytesRead;
if ((!closeOut) && closeIn) { // To Socket from File
action = "Upload";
DataOutputStream dos = new DataOutputStream(os);
dos.writeInt(is.available());

max = is.available();
System.out.println("Bytes to send: " + max);
while ((bytesRead = is.read(buffer)) != -1) {
startTiming();
dos.write(buffer, 0, bytesRead);
stopTiming();
process += bytesRead;
}
os.flush();
is.close();
return;
}
if ((!closeIn) && closeOut) { // To File from Socket
action = "Download";
DataInputStream dis = new DataInputStream(is);
int bytesToRead = dis.readInt();
System.out.println("Bytes to read: " + bytesToRead);
max = bytesToRead;
int nextBufferSize;
while ((nextBufferSize = Math.min(BUFFERSIZE, bytesToRead)) > 0) {
startTiming();
bytesRead = is.read(buffer, 0, nextBufferSize);
bytesToRead -= bytesRead;
process += nextBufferSize;
os.write(buffer, 0, bytesRead);
stopTiming();
}
os.flush();
os.close();
return;
}
throw new IllegalArgumentException("The only two boolean combinations are: closeOut == false && closeIn == true AND closeOut == true && closeIn == false");
}

马丁。

最佳答案

我不确定我是否听懂了您的解释。

但是,是的 - 您无法真正控制 BufferedReader 实际读取的量。这种阅读器的要点是,它会根据需要乐观地读取底层资源 block 以补充其缓冲区。所以当你第一次调用 readLine 时,它会发现它的内部缓冲区没有足够的空间来满足你的请求,并且会去读它的缓冲区中的字节数/strong> 来自基础资源,通常比您刚才要求的要多得多。填充缓冲区后,它会从缓冲内容中返回您的行。

因此,一旦将输入流包装在 BufferedReader 中,就应该确保仅通过相同的缓冲读取器读取该流。如果你不这样做,你最终会丢失数据(因为一些字节已经被消耗并且现在坐在 BufferedReader 的缓存中等待被服务)。

关于Java:BufferedReader 读取多于一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1834362/

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