使用 fileinputstream 读取 java 中的文件

Reading a file in java using fileinputstream

我是编程新手,我需要帮助来理解两种创建用于读取文件的文件输入流对象的方法之间的区别。我在互联网上看到过示例,有些使用第一个,有些使用第二个。我很困惑哪个更好,为什么?

FileInputStream file = new FileInputStream(new File(path));

FileInputStream file = new FileInputStream(path);

两个都很好。第二个调用第一个隐式

public FileInputStream(String name) throws FileNotFoundException {
    this(name != null ? new File(name) : null);
}

如果您对文件参考需要阅读,请使用前者。否则,您可能应该使用后者(如果您只有路径)。

不要在 2015 年使用任何一个。请改用 Files.newInputStream()。在 try-with-resources 语句中,在那个:

final Path path = Paths.get("path/to/file");

try (
    final InputStream in = Files.newInputStream(path);
) {
    // do stuff with "in"
}

更一般地说,如果可以避免,请不要在 2015 年的新代码中使用任何东西 File。 JSR 203,又名 NIO2,又名 java.nio.file,比 java.io.File 好得无法比拟。自 2011 年以来一直存在。

FileInputStream Class 具有三个构造函数。在official documentation中描述:

FileInputStream(File file)

Creates a FileInputStream by opening a connection to an actual file, the file named by the File object file in the file system.

FileInputStream(String name)

Creates a FileInputStream by opening a connection to an actual file, the file named by the path name name in the file system.

FileInputStream(FileDescriptor fdObj)

Creates a FileInputStream by using the file descriptor fdObj, which represents an existing connection to an actual file in the file system.

正如您在这里看到的,没有真正的区别。

其实他们打开文件的方式是一样的。第一个构造函数调用

SecurityManager.checkRead(File.getPath())

而第二个使用与

相同的checkRead()
SecurityManager.checkRead(name)

如果你想使用

FileInputStream 文件 = new FileInputStream(新文件(路径));

如果我没记错的话,创建 FileInputStream 需要更多时间,因为此构造函数正在与安全管理器进行一些检查

两者区别不大,因为 FileInputStream file = new FileInputStream(路径) 隐式调用其他。

public FileInputStream(String name) throws FileNotFoundException {
        this(name != null ? new File(name) : null);
    }

但是为了更好地利用两个可用的构造函数,我们可以在已经有一个 File 对象时使用带有 File 参数的构造函数,这样我们将避免创建另一个文件对象,如果我们使用另一个构造函数,它将被隐式创建

其次,最好只有在检查文件是否存在后才创建 FileinputStream 对象,可以使用 file.exists() 检查,这样我们可以避免 FileNotFoundException。