Java - File 类和输入输出流的关系
File 类
File 是文件和目录的抽象表示。创建、删除、重命名、检查文件或目录的存在都需要依靠 File 类来完成。
File 不涉及文件的处理和文件内容的读写操作。
输入输出流
输入输出流用于将数据从一个源读取到程序中,或者将数据从程序写入到一个目标(如文件、网络、内存)等。
Java 有多种输入输出流类,包括 InputStream
/OutputStream
、Reader
/Writer
等。
它们的关系
使用输入输出流操作系统上的东西就得结合 File 来完成。
写到网络上应该是不需要 File 类的,比如 HttpServletResponse
返回数据给浏览器,如 json,就不需要 File。
代码
file:[utils/FileUploadUtil.java]
public class FileUploadUtil {
public boolean writeToResources(String path, String fileName, InputStream inputStream) throws IOException {
File file = getFileFromResources(path, fileName);
if (file != null) {
// 将输入流中的数据写入文件
try (FileOutputStream outputStream = new FileOutputStream(file)) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
return true;
} else return false;
}
private File getFileFromResources(String path, String fileName) throws IOException {
// 获取资源目录的绝对路径
File resourceDirectory = ResourceUtils.getFile("classpath:");
// 创建一个临时文件,可以指定存放的目录
File file = new File(resourceDirectory + "\\" + path, fileName);
// 确保父目录存在
lit:[if (!file.getParentFile().exists()) {
boolean success = file.getParentFile().mkdirs();
if (!success) return null;
}]:lit
return file;
}
}
如上代码所示,我标记的亮色区域,判断父目录存在的意思是:
在的目的是确保在写入文件之前,目标文件的父目录已经创建,以免出现文件写入失败的情况。这通常用于在文件写入操作之前检查目录结构是否存在,如果不存在,则创建所需的目录结构,以便文件可以被正确保存。
在某些情况下,可能会指定一个新的目录,这个目录可能还不存在于文件系统中。
例如,用户要上传文件到以下路径:/uploads/user_files/2023/10/
,但服务器上的 /uploads/user_files/
目录还不存在。在这种情况下,需要判断并创建 /uploads/user_files/
这些父目录,然后再将文件写入 2023/10/
目录。
在示例中,首先创建了目标文件对象 file
,然后使用 getParentFile()
方法获取它的父目录。接着,使用 exists()
方法检查父目录是否已存在,如果不存在,使用 mkdirs()
方法创建它,确保目标目录存在后,再执行文件写入操作。