Files.newInputStream(Paths.get(path))和new FileInputStream(path)
时间: 2023-07-14 19:07:25 浏览: 135
这两个代码片段都用于创建一个输入流以从文件中读取数据,但是有一些差异。
`Files.newInputStream(Paths.get(path))` 是Java NIO库中的一种方式,用于创建一个InputStream对象。它接受一个Path对象作为参数,该对象表示要打开的文件的路径。这种方法提供了更多的灵活性,因为它可以处理不仅仅是本地文件系统的路径,还可以处理其他类型的路径,如网络路径。此外,它还提供了更多的功能,如处理文件属性和文件系统操作。
`new FileInputStream(path)` 是Java IO库中的一种方式,用于创建一个FileInputStream对象。它接受一个字符串作为参数,该字符串表示要打开的文件的路径。这种方法是比较传统的方式,用于处理本地文件系统的路径。它提供了基本的文件读取功能,但不具备处理文件属性和文件系统操作的能力。
因此,选择使用哪种方式取决于你的需求。如果你希望处理更多的文件操作和文件属性,可以选择使用`Files.newInputStream(Paths.get(path))`。如果你只需要基本的文件读取功能,可以选择使用`new FileInputStream(path)`。
相关问题
Files.newInputStream(Paths.get(path))和new FileInputStream(path)的区别
`Files.newInputStream(Paths.get(path))` 和 `new FileInputStream(path)` 都用于创建一个输入流来读取文件,但它们有一些区别:
1. `Files.newInputStream(Paths.get(path))` 是 Java NIO (New I/O) 包中的方法,而 `new FileInputStream(path)` 是旧的 Java I/O (Input/Output) 包中的方法。NIO 提供了更为灵活和高效的 I/O 操作方式。
2. `Files.newInputStream(Paths.get(path))` 返回一个 `InputStream` 对象,而 `new FileInputStream(path)` 返回一个 `FileInputStream` 对象。因此,前者使用的是 NIO 的输入流,而后者使用的是旧的输入流。
3. `Files.newInputStream(Paths.get(path))` 可以处理任何类型的文件路径,包括本地文件系统、网络路径和其他类型的文件系统。而 `new FileInputStream(path)` 只能处理本地文件系统中的文件路径。
4. `Files.newInputStream(Paths.get(path))` 可以使用额外的选项来配置输入流的行为,比如设置缓冲区大小、文件读取选项等。而 `new FileInputStream(path)` 没有提供类似的配置选项。
综上所述,如果你使用的是 Java NIO 包,需要更灵活和高效的 I/O 操作,或者需要处理非本地文件系统中的文件路径,那么你可以使用 `Files.newInputStream(Paths.get(path))`。如果你只需要处理本地文件系统中的文件路径,且不需要额外的配置选项,那么你可以使用 `new FileInputStream(path)`。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置ContentType字段值 response.setContentType("text/html;charset=utf-8"); //获取所要下载的文件名称 String filename = request.getParameter("filename"); //下载文件所在目录 // 通知浏览器以下载的方式打开 response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition","attachment;filename="+filename); // 通过文件流读取文件 String path=request.getSession().getServletContext().getRealPath("/file/"+filename); System.out.println(path); InputStream in = new FileInputStream(path); String save="E:/download/" +filename; Path path1= Paths.get(save); Files.copy(in,path1); // 获取response对象的输出流 OutputStream out = response.getOutputStream(); Files.copy(path1,out); out.flush(); // byte[] buffer = new byte[1024]; // int len; // //循环取出流中的数据 // while ((len = in.read(buffer)) != -1) { // out.write(buffer, 0, len); // } // out.close(); // in.close(); }修改代码实现文件下载
以下是修改后的代码,实现了文件下载:
```java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置ContentType字段值
response.setContentType("text/html;charset=utf-8");
//获取所要下载的文件名称
String filename = request.getParameter("filename");
//下载文件所在目录
String filePath = request.getServletContext().getRealPath("/file/" + filename);
File downloadFile = new File(filePath);
//判断文件是否存在
if (downloadFile.exists()) {
//设置响应头,告诉浏览器是下载文件
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
//将文件从服务器读取到内存中,再写入到响应流中
FileInputStream in = new FileInputStream(downloadFile);
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
in.close();
out.close();
} else {
//文件不存在,返回404状态码
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
```
这里使用了`doGet`方法,因为文件下载一般是通过GET请求实现的。另外,代码中还做了文件存在性的判断,如果文件不存在,则返回404状态码。