繁体   English   中英

为什么 Java 11 在 ByteArrayOutputStream 类中添加了 writeBytes​(byte[] b) 方法,而 write​(byte[] b) 方法也一样?

[英]Why did Java 11 add writeBytes​(byte[] b) method to the ByteArrayOutputStream class while the write​(byte[] b) method did the same?

从 Java 11 开始,Oracle 在ByteArrayOutputStream类中添加了writeBytes​(byte[] b)方法。该方法接受一个字节数组并将其写入ByteArrayOutputStream 但是, ByteArrayOutputStream扩展了OutputStream类,该类定义了一个write​(byte[] b)来做同样的事情。 为什么 Java 需要一种新方法来做到这一点?

正如其他人所指出的,新方法的好处是它没有被声明为throws IOException

它是针对JDK-8180410 "ByteArrayOutputStream should not throw IOExceptions"问题添加的。 该问题中陈述的理由很简单, 1必须为永远不会抛出的异常编写try ... catch是没有意义的。 而已。

他们(严格)不需要添加它。 他们添加它是为了方便。


1 - 正如记者所说: “这很矛盾。”

ByteArrayOutputStream.writeBytes不会抛出不必要的IOException

这是一种特定于字节数组输出流的新方法,而其他选项是从OutputStream继承的,并被声明为抛出检查过的IOException (如果您知道您正在写入字节数组输出流,这是一个不必要的痛苦处理 -您没有网络连接失败或类似情况)

两种方法都将字节写入输出流。 为了首先比较它们,我们应该查看它们的源代码:

一方面,在 OutputStream 类中,我们有这 3 个嵌套方法来写入字节:

  public void write(byte b[]) throws IOException {
       write(b, 0, b.length);
  }

  public void write(byte b[], int off, int len) throws IOException {
     Objects.checkFromIndexSize(off, len, b.length);
     for (int i = 0 ; i < len ; i++) {
         write(b[off + i]);
     }
  }
  public abstract void write(int b) throws IOException;

以上所有方法都会抛出 IOException。

另一方面,ByteArrayOutputStream 的 writesByte 方法调用此方法:

public void writeBytes(byte b[]) {
     write(b, 0, b.length);
}
public synchronized void write(byte b[], int off, int len) {
    Objects.checkFromIndexSize(off, len, b.length);
    ensureCapacity(count + len);
    System.arraycopy(b, off, buf, count, len);
    count += len;
}

这些方法在写入字节之前检查字节数组的容量,因此它们摆脱了 IOException。 此外,write 方法是交易安全的,因为它是同步方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM