Java java.nio.file.Files.newInputStream()
方法
newInputStream()
方法用于打开一个文件,返回一个输入流以便从该文件中读取数据。这是 Java NIO 提供的更现代的文件操作方式,相比传统的 FileInputStream
,它提供了更好的性能和更丰富的功能。
方法定义
public static InputStream newInputStream(Path path, OpenOption... options)
throws IOException
throws IOException
参数说明
Path path
- 要打开的文件的路径对象OpenOption... options
- 可选参数,指定文件的打开方式
返回值
返回一个新的 InputStream
对象,可用于从文件中读取数据
异常
IOException
- 如果打开文件时发生 I/O 错误SecurityException
- 如果安全管理器存在且拒绝访问该文件
基本用法
示例 1:最简单的文件读取
实例
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FilesExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try (InputStream inputStream = Files.newInputStream(path)) {
int data;
while ((data = inputStream.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FilesExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try (InputStream inputStream = Files.newInputStream(path)) {
int data;
while ((data = inputStream.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们:
- 创建一个
Path
对象指向要读取的文件 - 使用
Files.newInputStream()
方法获取输入流 - 使用 try-with-resources 语句确保流会自动关闭
- 逐个字节读取文件内容并打印
高级用法
使用 OpenOption 参数
OpenOption
接口允许我们指定文件的打开方式。常用的实现类是 StandardOpenOption
,它提供了以下选项:
READ
- 以读取方式打开文件(默认)WRITE
- 以写入方式打开文件APPEND
- 以追加方式打开文件TRUNCATE_EXISTING
- 如果文件已存在,则截断文件CREATE
- 如果文件不存在则创建新文件CREATE_NEW
- 创建新文件,如果文件已存在则失败DELETE_ON_CLOSE
- 当流关闭时删除文件SPARSE
- 提示文件系统创建稀疏文件SYNC
- 要求每次更新都同步写入存储DSYNC
- 要求每次更新都同步写入存储(仅内容)
示例 2:指定打开选项
实例
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class FilesExampleWithOptions {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try (InputStream inputStream = Files.newInputStream(path,
StandardOpenOption.READ,
StandardOpenOption.DSYNC)) {
// 读取文件内容...
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class FilesExampleWithOptions {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try (InputStream inputStream = Files.newInputStream(path,
StandardOpenOption.READ,
StandardOpenOption.DSYNC)) {
// 读取文件内容...
} catch (IOException e) {
e.printStackTrace();
}
}
}
与传统 FileInputStream 的比较
优点
- 更现代的 API:基于
Path
接口,与 NIO 的其他部分更好地集成 - 更灵活:可以通过
OpenOption
指定多种打开方式 - 更好的性能:在某些情况下比
FileInputStream
性能更好 - 异常处理更清晰:抛出的异常类型更具体
缺点
- Java 7+:需要 Java 7 或更高版本
- 学习曲线:对于熟悉传统 I/O 的开发者需要适应
最佳实践
- 总是使用 try-with-resources:确保输入流被正确关闭
- 处理大文件时使用缓冲:考虑包装在
BufferedInputStream
中提高性能 - 检查文件是否存在:在尝试打开前可以使用
Files.exists(path)
- 处理异常:妥善处理可能出现的
IOException
示例 3:最佳实践示例
实例
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FilesBestPractice {
public static void main(String[] args) {
Path path = Paths.get("largefile.dat");
if (!Files.exists(path)) {
System.err.println("文件不存在: " + path);
return;
}
try (InputStream rawStream = Files.newInputStream(path);
BufferedInputStream bufferedStream = new BufferedInputStream(rawStream)) {
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = bufferedStream.read(buffer)) != -1) {
// 处理读取的数据...
}
} catch (IOException e) {
System.err.println("读取文件时出错: " + e.getMessage());
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FilesBestPractice {
public static void main(String[] args) {
Path path = Paths.get("largefile.dat");
if (!Files.exists(path)) {
System.err.println("文件不存在: " + path);
return;
}
try (InputStream rawStream = Files.newInputStream(path);
BufferedInputStream bufferedStream = new BufferedInputStream(rawStream)) {
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = bufferedStream.read(buffer)) != -1) {
// 处理读取的数据...
}
} catch (IOException e) {
System.err.println("读取文件时出错: " + e.getMessage());
}
}
}
总结
Files.newInputStream()
是 Java NIO 中一个强大而灵活的文件读取工具,相比传统的 FileInputStream
提供了更多的功能和更好的性能。通过合理使用 OpenOption
参数和遵循最佳实践,可以编写出高效、可靠的文件读取代码。
点我分享笔记