loading

Java - File 类和输入输出流的关系

File 类

File 是文件和目录的抽象表示。创建、删除、重命名、检查文件或目录的存在都需要依靠 File 类来完成。

File 不涉及文件的处理和文件内容的读写操作。

输入输出流

输入输出流用于将数据从一个源读取到程序中,或者将数据从程序写入到一个目标(如文件、网络、内存)等。

Java 有多种输入输出流类,包括 InputStream/OutputStreamReader/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() 方法创建它,确保目标目录存在后,再执行文件写入操作。

posted @ 2023-10-09 22:40  Himmelbleu  阅读(9)  评论(0编辑  收藏  举报