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

met*_*tis 0 java io outputstream

以下代码引自: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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

仅仅因为声明的类型是OutputStream,并不意味着实现不会创建的具体子类的实例OutputStream。您始终可以通过界面看到这一点。例如:

public List<String> getList() {
    return new ArrayList<String>();
}
Run Code Online (Sandbox Code Playgroud)

基本上,您需要区分公开的API(使用抽象类)和实现(可以选择使用所需的任何子类)。

因此Files.newOutputStream可以实现为:

public static OutputStream newOutputStream(Path path)
    throws IOException {
  return new FileOutputStream(path.toFile());
}
Run Code Online (Sandbox Code Playgroud)