OutputStream class 用于写入文件。这怎么可能?

OutputStream class is used for writing into files. How is it possible?

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

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

Files.newOutputStream(文件路径)) returns 输出流。那么,out的类型是OutputStream,out引用了OutputStream。

OutputStream 是抽象的,这怎么可能class?

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();
        }
    }
}

仅仅因为 声明的 类型是 OutputStream,这并不意味着实现不会创建 具体[=] 的实例23=] OutputStream 的子 class。你总是在界面上看到这一点。例如:

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

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

所以 Files.newOutputStream 可以实现为:

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