【问题标题】:Copy files through sockets in Java [duplicate]通过Java中的套接字复制文件[重复]
【发布时间】:2013-08-23 18:19:42
【问题描述】:

我在处理 Java 文件时遇到问题。

问题是:我正在尝试将文件(不仅是文本,任何类型)从套接字的一侧复制到另一侧。我使用 BufferedReader(逐字节)读取文件,然后使用 FileOutputStream 将它们写入文件。

它工作正常,但是当我打开文件时它与原始文件不同,它正在将字节写入文本文件或类似文件。

一段代码:

        in = new BufferedInputStream(s.getInputStream());
        byte b[] = new byte[MAX_LENGTH];
        File f = new File(name);
        FileOutputStream fos = new FileOutputStream(name);
        for(int i = 0; i < segments; i++){
            in.read(b,i*MAX_LENGTH,MAX_LENGTH);
            fos.write(b);
        }

其中 s 是打开的套接字(工作正常),命名文件的名称并分段通过套接字发送的段数(MAX_LENGTH 的段)。

【问题讨论】:

  • 看看类似的问题stackoverflow.com/questions/9520911/…希望对你有帮助。
  • 谢谢,但没有太大帮助:(
  • 我使用 BufferedReader(逐字节)读取文件:这没有意义。 BufferedReader 和所有的 Reader 一样,读取的是字符,而不是字节。 Readers 和 Writers 用于文本。流用于字节。由于您需要读取和写入字节,因此不应使用 Reader。发布您的相关代码。
  • 非常感谢 JB Nizet,这就是问题所在,我使用了错误的阅读方式,现在使用 Streams 可以完美运行。

标签: java file sockets


【解决方案1】:

您假设每次读取调用都可以读取MAX_LENGTH 字节。情况可能并非如此。

read 返回实际从流中读取的字节数。只需在每次循环迭代中将那么多字节写入输出流即可。

【讨论】:

    【解决方案2】:

    您的复制代码错误。您忽略了 read() 返回的结果。记住这个循环。这是在 Java 中复制流的规范方法。

    while ((count = in.read((buffer)) >= 0)
    {
       out.write(buffer, 0, count);
    }
    

    与您的代码进行比较。将缓冲区设置为任意大小,越大越好。

    【讨论】:

    • 我也试过了,我有:fos.write(b,i*MAX_LENGTH,1000);
    • 这根本不一样。重新比较。试试这个代码。
    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2020-12-09
    相关资源
    最近更新 更多