文件File详解

这篇博客详细介绍了Java中File类的使用,包括创建文件和目录、复制文件、递归遍历目录、读取文件内容、流的复制和关闭,以及相关工具类如SFTP和FTP的使用。此外,讨论了流的关闭和flush的重要性,以及处理文件路径和InputStream对象的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

博主github
博主个人博客http://blog.healerjean.com

习惯了使用OSS傻瓜式上传,是不是都快忘记写原生的上传了,今天小米的项目中需要用一下,所以之类简单总结下 吧

1、File

1.1、创建文件

  • 1、路径不存在,fileNameTxt.createNewFile() 会抛出异常
  • 2、只有路径,不会创建出文件,也不会报错,无法创建,但是不会报错
  • 3、路径存在,文件不存在,创建成功
  • 4、没有路径,只有文件文件名,和则创建的文件和src一个级别,创建成功
   /**
     * 1、路径不存在,fileNameTxt.createNewFile() 会抛出异常
     * 2、只有路径,不会创建出文件,也不会报错,无法创建,但是不会报错
     * 3、路径存在,文件不存在,创建成功
     * 4、没有路径,只有文件文件名,和则创建的文件和src一个级别,创建成功
     */
    @Test
    public void createFile() throws IOException {
   
        String filePath = "newFile.txt";
        File fileNameTxt = new File(filePath);
        if (!fileNameTxt.exists()) {
   
            fileNameTxt.createNewFile();
        }
        log.info("创建成功");
    }

1.2、具备目录,创建文件

   /**
     * 2、创建有目录的文件
     * 通过父的目录引入文件   directoryName 是父类
     */
    @Test
    public void createHavaDirectoryFile() throws IOException {
   
        String directoryName = "D:/test/file/d02_createHavaDirectoryFile";
        String fileName = "directoryName.txt";
        File directoryNameTxt = new File(directoryName, fileName);
        if (!directoryNameTxt.exists()) {
   
            directoryNameTxt.createNewFile();
        }
        log.info("创建有目录的文件成功");
    }

1.3、判断文件、目录

   /**
     * 3、 判断文件、目录
     */
    @Test
    public void judgeFileOrDirectory() {
   
        File file = new File("D:/test/file/d02_createHavaDirectoryFile");
        log.info("测试开始");
        if (file.isFile()) {
   
            log.info(file.getPath() + "是一个文件");
        } else if (file.isDirectory()) {
   
            log.info(file.getPath() + "是一个目录");
        } else {
   
            log.info(file.getPath() + "不是文件也不是目录");
        }
    }

1.4、创建目录

  • 创建目录,即使路径不存在,也会创建相关路径,因为是mkdirs
   /**
     * 3、创建目录
     * 判断是不是目录
     * 创建目录,即使路径不存在,也会创建相关路径,因为是mkdirs
     */
    @Test
    public void createDirectory() {
   
        //引入目录
        File directoryName = new File("D:/test/healerjean/file");
        if (!directoryName.exists()) {
   
            directoryName.mkdirs();
            log.info(directoryName.getPath() + "创建目录成功");
        }
    }

1.5、普通复制文件

  • 第一个文件以及路径必须存在, 否则fileInputStream会报错
  • 第二个文件可以不存在,但是路径必须存在,如果路径不存在则new FileOutputStream会报错
    /**
     * 5、复制文件
     * Input第一个文件以及路径必须存在, 否则 FileOutputStream out = new FileOutputStream(outFilePath); FileNotFoundException 异常
     * Output第二个文件可以不存在,但是路径必须存在,如果路径不存在则FileOutSteam会报错
     */
    public void copyFile() throws IOException {
   
        String inFilePath = "D:/test/file/d03_copyFile/exist/file.txt";
        String outFilePath = "D:/test/file/d03_copyFile/no_exist/newfile.txt";

        FileInputStream ins = new FileInputStream(inFilePath);
        FileOutputStream out = new FileOutputStream(outFilePath);
        byte[] b = new byte[1024];
        int n = 0;
        while ((n = ins.read(b)) != -1) {
   
            out.write(b, 0, n);
        }
        ins.close();
        out.close();
        log.info("复制文件成功");
    }

1.6.1、递归整个目录

  • file.listFiles() 是获取file这个对象也就是file这个目录下面的文件和文件夹的集合
    /**
     * 6、递归遍历整个目录的文件
     * file.listFiles()是获取file这个对象也就是file这个目录下面的文件和文件夹的集合
     */
    public void cycleFiles(File file) {
   
        File[] files = file.listFiles();
        for (File sonFile : files) {
   
            if (sonFile.isDirectory()) {
   
                cycleFiles(sonFile);
            } else {
   
                log.info(sonFile.getAbsolutePath());
            }
        }
        log.info(file.getAbsolutePath());
    }
    @Test
    public void testCycleFiles() {
   
        File file = new File("D:/test");
        cycleFiles(file);
    }

1.6.2、 递归递归整个目录,并读取文件内容进行匹配

/**
     * 6.2 、递归目录,读取文件内容进行匹配
     * size :用于保留统计记录的个数
     */
    private static int size = 1;
    public void cycleFileContent(File file, String content) throws Exception {
   
        File[] files = file.listFiles();
        for (File f : files) {
   
            if (f.isDirectory()) {
   
                cycleFileContent(f, content);
            } else {
   
                String path = f.getPath();
                FileInputStream fileInputStream = new FileInputStream(f);
                ByteArrayOutputStream outStream = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len = 0;
                while ((len = fileInputStream.read(buffer)) != -1) {
   
                    outStream.write(buffer, 0, len);
                }
                String str = new String(outStream.toByteArray(), "utf-8");
                if (str.contains(content)) {
   
                    log.info("第【{}】个文件匹配到内容,路径为:{}", size, f.getPath());
                    size++;
                }
            }
        }
    }
    @Test
    public void testCycleFileContent() throws Exception {
   
        File file = new File("D:/test");
        String content = "co";
        cycleFileContent(file, content);
    }

1.7.1、读取文件内容

1.7.2、读取整个文件内容,转化为ByteArrayOutputStream读取
/**
* 7.1、读取文件内容:转化为ByteArrayOutputStream读取
*/
@Test
public void readFileContent() throws Exception {
   
    File file = new File("D:\\test\\file\\file.txt");
    FileInputStream fileInputStream = new FileInputStream(file);
    ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
    int len = 0;
    byte[] buffer = new byte[1024];
    while ((len = fileInputStream.read(buffer)) != -1) {
   
        byteOutputStream.write(buffer, 0, len);
    }
    String txtValue = new String(byteOutputStream.toByteArray(), "utf-8");
    log.info(txtValue);
}
1.7.2、一行一行读取文件内容
  • new BufferedReader(new InputStreamReader(new ByteArrayInputStream(txtByteArray), “utf-8”));
    /**
     * 7.读取文件内容
     * 7.2、按照行,一行一行读取txt内容
     */
    @Test
    public void readFileLineContent() throws Exception {
   
        File file = new File("D:\\test\\file\\file.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len = fileInputStream.read(buffer)) != -1) {
   
            byteOutputStream.write(buffer, 0, len);
        }
        byte[] txtByteArray = (byteOutputStream.toByteArray());
        BufferedReader reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(txtByteArray), "utf-8"));
        String lineContent = null;
        int line = 0;
        while ((lineContent = reader.readLine()) != null) {
   
            line++;
            log.info("第【{}】行的内容为:{}", line, lineContent);
        }
    }

1.8、根据字符串生成内容

  /**
     * 8、根据内容生成文件
     */
    @Test
    public void contentToFile() throws Exception {
   
        String content = "我是大好人";
        String fileName = UUID.randomUUID().toString().replace("-", "") + ".txt";
        FileOutputStream outputStream = new FileOutputStream("D:/test/" + fileName);
        byte[] buffer = content.getBytes("utf-8");
        outputStream.write(buffer);
        log.info("文件【{}】创建成功", fileName);
        outputStream.close();
    }

1.9、局域网文件调用

File file = new File("//192.168.31.1/file");

2、上传下载

2.1、上传


@ApiOperation(
    value = "文件上传",
    notes = "文件上传",
    consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
    produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
    response = String.class)
@PostMapping(value = "upload", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public String upload(MultipartFile file) {
   
    log.info("文件管理--------文件上传--------请求参数{}", file);
    //1、确定文件存储目录
    String javaIoTmpdir = System.getProperty("java.io.tmpdir");
    File tempFile = new File(javaIoTmpdir);
    if (!tempFile.exists()) {
   
        tempFile.mkdirs();
    }

    // 2、文件上传
    String fileName = file.getOriginalFilename();
    File outFile = new File(tempFile, fileName);
    // InputStream inputStream = null;
    // FileOutputStream fileOutputStream = null;
    try {
   
        // 1、inputstream -> 本地文件
        FileUtils.copyInputStreamToFile(file.getInputStream(), outFile);

        // 2、MultipartFile文件  -> 本地文件
        // file.transferTo(outFile);

        // 3、MultipartFile 文件获取字节 -> OutputStream
        // byte[] bytes = file.getBytes();
        // fileOutputStream = (new FileOutputStream(outFile));
        // fileOutputStream.write(bytes);

        // 4、InputStream -> OutputStream
        // inputStream = file.getInputStream();
        // fileOutputStream = (new FileOutputStream(outFile));
        // IOUtils.copy(inputStream, fileOutputStream);

        log.info("文件管理--------文件上传成功--------上传文件名{}", file.getOriginalFilename());
    } catch (IOException e) {
   
        log.info("文件上传失败");
        throw new RuntimeException("文件上传失败", e);
    } finally {
   
        log.info("准备开始关闭流");
        // try {
   
        //     if (fileOutputStream != null) {
   
        //         fileOutputStream.close();
        //     }
        // } catch (IOException e) {
   
        //     log.error("流关闭失败", e);
        // }
        // try {
   
        //     if (inputStream != null) {
   
        //         inputStream.close();
        //     }
        // } catch (IOException e) {
   
        //     log.error("流关闭失败", e);
        // }
    }
    return fileName;
}

2.2、下载

    @ApiOperation(
            value = "文件下载",
            notes = "文件下载",
            consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
            produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
            response = String.class)
    @GetMapping(value = "download/{fileName}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public void downLoad(HttpServletResponse response, @PathVariable String fileName, Boolean preview) {
   
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
   
            log.info("文件管理--------文件下载--------请求参数{}", fileName);
            String javaIoTmpdir <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值