【问题标题】:Wrapping byte array in ByteArrayInputStream在 ByteArrayInputStream 中包装字节数组
【发布时间】:2014-12-28 09:53:25
【问题描述】:

我只是想了解使用 ByteArrayInputStream 类对字节数组的包装。这是我对此表示怀疑的代码。

byte[] bytes = new byte[1024];

//write data into byte array...

InputStream input = new ByteArrayInputStream(bytes);

//read first byte
int data = input.read();
while(data != -1) {
    //do something with data

    //read next byte
    data = input.read();
}

我的问题是可以写这部分

InputStream input = new ByteArrayInputStream(bytes);

喜欢这个

ByteArrayInputStream input = new ByteArrayInputStream(bytes);

为什么这段代码的作者创建了包含超类和子类的对象?

非常感谢您的帮助。

【问题讨论】:

  • InputStream input 不是对象,它是对必须实现此接口的对象的引用。注意:不能创建 InputStream 的实例。

标签: java io inputstream


【解决方案1】:

是的,你可以写

InputStream input = new ByteArrayInputStream(bytes);

喜欢

ByteArrayInputStream input = new ByteArrayInputStream(bytes);

功能相同。

但是,在 OOP 中,广泛推荐“编程到接口”。请参阅What does it mean to "program to an interface"? 了解说明。

在这种情况下,严格来说,InputStream 不是一个接口,而是一个抽象超类。但是,它或多或少表现得像一个界面。

【讨论】:

    【解决方案2】:

    这部分可以写吗

    (InputStream input = new ByteArrayInputStream(bytes);)
    

    喜欢这个

        ( ByteArrayInputStream input = new ByteArrayInputStream(bytes);)
    

    当然。为什么你不这么认为?当你尝试它时发生了什么?为什么要使用 StackOverflow 来替代结论性实验?

    为什么这段代码的作者创建了包含超类和子类的对象?

    他没有。他将对象创建为ByteArrayInputStream 的实例。然后他将结果分配给InputStream 类型的变量。这是完全正常的。

    【讨论】:

    • 谢谢你的回答,我没有在这里做实验。我正在寻求帮助来理解这个概念。我认为这就是网站的目的吧?
    • @TabTab 对于有经验的开发人员来说,经常令人困惑的是为什么人们会提出一些对自己来说肯定更容易解决的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多