【问题标题】:copy a stream via byte[]通过 byte[] 复制流
【发布时间】:2010-08-24 07:22:40
【问题描述】:

嗨,

我必须复制一个输入流。在网上搜索了一下之后,我在字节数组的帮助下尝试了这个。我的代码看起来像这样(“is”是输入流):

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    while (is.read() != -1) {
        bos.write(is.read());
    }
    byte[] ba = bos.toByteArray(); 

    InputStream test = new ByteArrayInputStream(ba);
    InputStream test2 = new ByteArrayInputStream(ba);

而且它有效.. 几乎

在两个流中,程序只复制每隔一个字符 所以 "is" 流中的 "DOR A="104"/>" 变为: "O =14/" 在其他流中

问题是什么?我无法理解发生了什么。

希望有人能给我解决方案:)

问候

【问题讨论】:

    标签: java byte inputstream


    【解决方案1】:

    那是因为你忽略了所有奇数字符,除非它们是 -1,通过在循环中调用 read() 两次。这是使用缓冲区的正确方法(您可以调整缓冲区大小):

    int count;
    byte[] buffer = new byte[8192];
    while ((count = in.read(buffer)) > 0)
      out.write(buffer, 0, count);
    

    【讨论】:

      【解决方案2】:

      您必须将while 循环中的读取字节分配给一个变量。在您当前的代码中,您只需丢弃它。以下是正确的:

      int b;
      while((b = read()) != -1) {
          bos.write(b);
      }
      

      当然读取单个字节不是很有效。您应该考虑在下一个版本中使用字节数组。

      【讨论】:

      • 非常感谢!我明白是什么问题:) (因为我使用了两次 read 方法它跳转了两次)
      • 不正确。它不编译。您不能在 while 条件内声明变量。
      • @EJP:那你为什么回滚你的更正(并且可能选择拒绝投票)?
      • 由于您的错误,我撤回了我的更正并投了反对票。您可以自行修复。
      • @EJP 你没有任何意义。此外,这是一个维基。纠正然后回滚真的很不稳定。那么为什么要努力修复它呢?
      猜你喜欢
      • 2016-05-09
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 2014-07-23
      • 2017-09-13
      • 2011-08-27
      相关资源
      最近更新 更多