【问题标题】:OutputStream class is used for writing into files. How is it possible?OutputStream 类用于写入文件。这怎么可能?
【发布时间】:2015-06-21 19:26:22
【问题描述】:

以下代码引用自:http://examples.javacodegeeks.com/core-java/io/fileoutputstream/java-io-fileoutputstream-example/

虽然 OutputStream 是一个抽象方法,但在下面的代码中,OutputStream 对象用于写入文件。

Files.newOutputStream(filepath)) 返回 OutputStream。那么out的类型就是OutputStream,out引用OutputStream。

OutputStream 是一个抽象类,这怎么可能?

package com.javacodegeeks.core.io.outputstream;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class FileOutputStreamExample {

    private static final String OUTPUT_FILE = "C:\\Users\\nikos\\Desktop\\TestFiles\\testFile.txt";
    public static void main(String[] args) {

        String content = "Hello Java Code Geeks";

        byte[] bytes = content.getBytes();

        Path filepath = Paths.get(OUTPUT_FILE);

        try ( OutputStream out = Files.newOutputStream(filepath)) {

            out.write(bytes);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

【问题讨论】:

    标签: java io outputstream


    【解决方案1】:

    仅仅因为 declared 类型是OutputStream,这并不意味着实现不会创建OutputStream具体 子类的实例。你总是在接口中看到这一点。例如:

    public List<String> getList() {
        return new ArrayList<String>();
    }
    

    基本上你需要区分API暴露(使用抽象类)和实现(可以选择使用它想要的任何子类)。

    所以Files.newOutputStream 可以实现为:

    public static OutputStream newOutputStream(Path path)
        throws IOException {
      return new FileOutputStream(path.toFile());
    }
    

    【讨论】:

    • 如上图了解newOutputStream的实现,是正确的。假设 newOutputStream(path) 返回的是 OutputStream,而不是 FileOutputStream,那么这个例子是错误的。对吗?
    • @metis:不,它不会 - 我不知道这是否是实际上的实现。但关键是代码可以编译并且没问题。可以返回声明返回类型的子类的实例,就像我可以使用 OutputStream x = new FileOutputStream(...); 一样。您认为这里有什么“错误”?
    • 另外,我们为什么需要这样的东西?是否有任何参考标题等可以解释这些?因为,为了编写这样的代码,我必须知道 newOutputStream 返回的是 OutputStream。为什么我需要这样的东西?是和多态还是其他有关?
    • @metis:是的,这正是多态性。而且我不确定您所说的“为了编写这样的代码”是什么意思-什么代码?您可能想阅读stackoverflow.com/questions/383947 - 我知道这是关于接口而不是抽象类,但它基本上是相同的想法......您不需要知道 exact 实现用于使用返回值。
    猜你喜欢
    • 2011-12-23
    • 2011-08-11
    • 2023-03-18
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2020-05-25
    相关资源
    最近更新 更多