Files.newInputStream(Paths.get(path))和new FileInputStream(path)的区别
时间: 2023-07-14 11:07:25 浏览: 82
Files.newInputStream(Paths.get(path)) 和 new FileInputStream(path) 都是用来创建一个输入流,用于读取文件的数据。它们之间的区别在于实现的方式和用途。
1. 实现方式:
- Files.newInputStream(Paths.get(path)) 使用了Java的NIO库,通过Path对象来创建输入流。它提供了更多的灵活性和功能,例如可以处理符号链接、支持更多的文件操作等。
- new FileInputStream(path) 使用了Java的IO库,直接通过文件路径字符串来创建输入流。它是传统的IO方式,相对简单直接。
2. 用途:
- Files.newInputStream(Paths.get(path)) 主要用于处理文件操作时的更复杂情况,例如处理符号链接、文件系统操作等。它适用于较新的Java版本,更加现代化的文件处理。
- new FileInputStream(path) 主要用于基本的文件读取操作,适用于较旧的Java版本和简单的文件读取需求。
总结来说,Files.newInputStream(Paths.get(path)) 提供了更多的功能和灵活性,适用于较新的Java版本和较复杂的文件操作。而 new FileInputStream(path) 则是传统的IO方式,适用于简单的文件读取需求和较旧的Java版本。
相关问题
Files.newInputStream(Paths.get(path))和new FileInputStream(path)
这两个方法都用于创建一个输入流来读取文件。它们有一些区别:
1. `Files.newInputStream(Paths.get(path))`是Java NIO库中的方法,用于创建一个新的输入流来读取指定路径的文件。它返回一个`InputStream`对象,你可以使用它来读取文件的内容。
2. `new FileInputStream(path)`是Java IO库中的方法,也用于创建一个输入流来读取指定路径的文件。它返回一个`FileInputStream`对象,同样可以用于读取文件。
主要区别在于:
- `Files.newInputStream()`是Java NIO库中的方法,而`new FileInputStream()`是Java IO库中的方法。
- `Files.newInputStream()`可以用于读取任何类型的文件,而`new FileInputStream()`只能用于读取普通文件。
- `Files.newInputStream()`返回的是`InputStream`对象,而`new FileInputStream()`返回的是`FileInputStream`对象。
如果你正在开发使用Java NIO库的新项目,建议使用`Files.newInputStream(Paths.get(path))`。如果你已经在使用Java IO库,或者只需要读取普通文件,那么可以使用`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状态码。