gpt4 book ai didi

java - 在Java中通过TCP传输文件时,即使我指定的字节大小大于图像,它也不会传输整个图像

转载 作者:行者123 更新时间:2023-12-01 22:18:07 25 4
gpt4 key购买 nike

我有这个 TCP 客户端服务器模型,它可以工作并将文件传输到目的地。然而,当我打开图像时,它永远不是完整的图像。这是一半或可能刚刚超过一半。这是我当前的代码:

接收者:

try {
byte[] b = new byte[200000];
Socket sr = new Socket("192.168.192.41", 30481);
InputStream is = sr.getInputStream();
FileOutputStream fos = new FileOutputStream("C:\\Users\\tproudfoot\\Desktop\\Photo.png");
is.read(b, 0, 200000);
fos.write(b, 0, 200000);
} catch (Exception e) {
e.printStackTrace();
}

发件人:

try {
File f = new File(Path);
long size = f.length();
System.out.println(size);
ServerSocket s = new ServerSocket(30481);
Socket sr = s.accept();
FileInputStream fis = new FileInputStream(Path);
byte[] b = new byte[200000];
fis.read(b, 0, 200000);
OutputStream os = sr.getOutputStream();
os.write(b, 0, 200000);
} catch (Exception e) {
e.printStackTrace();
}

我已将字节大小设置为 200000,因此我知道它不会削弱照片的效果。在发送者类中,我有一行可以查找所选文件的大小。所以我知道字节大小远不止于此。我还尝试将字节大小设置为确切的文件大小,但这也不起作用

提前致谢

最佳答案

如果您使用的是 Java 9 或更高版本,则可以使用 InputStream.transferTo(OutputStream out) :

is.transferTo(fos);

如果您使用较旧的 Java 版本,以下是 transferTo 方法的源代码:

public long transferTo(OutputStream out) throws IOException {
Objects.requireNonNull(out, "out");
long transferred = 0;
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int read;
while ((read = this.read(buffer, 0, DEFAULT_BUFFER_SIZE)) >= 0) {
out.write(buffer, 0, read);
transferred += read;
}
return transferred;
}

MAX_BUFFER_SIZE 为 8192。
您基本上必须执行相同的 while 循环。您可能不需要计算传输的字节数,因此可以将其省略。

所以你的两个例子看起来像:

try {
Socket sr = new Socket("192.168.192.41", 30481);
InputStream is = sr.getInputStream();
FileOutputStream fos = new FileOutputStream("C:\\Users\\tproudfoot\\Desktop\\Photo.png");
byte[] buffer = new byte[8192];
while ((read = is.read(buffer, 0 buffer.length)) >= 0) {
fos.write(buffer, 0, read);
}
} catch (Exception e) {
e.printStackTrace();
}

try {
File f = new File(Path);
long size = f.length();
System.out.println(size);
ServerSocket s = new ServerSocket(30481);
Socket sr = s.accept();
FileInputStream fis = new FileInputStream(Path);
OutputStream os = sr.getOutputStream();
byte[] buffer = new byte[8192];
int read;
while ((read = fis.read(buffer, 0, buffer.length)) >= 0) {
os.write(buffer, 0, read);
}
} catch (Exception e) {
e.printStackTrace();
}

关于java - 在Java中通过TCP传输文件时,即使我指定的字节大小大于图像,它也不会传输整个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58612235/

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