java基础 IO

之前自己学习Java是跳着学的,只有碰到业务问题,我才回来学习。这次就是碰到将pdf 转成图片 预览的问题,所以来补充基础。

一、 File 即代表文件,也代表文件夹

public static void main(String[] args) {
     

        //虽然new 了一个file对象,但它不会自动生成这个目录,只是进行装载
        File file1 = new File("D:\\fileTest");
        System.out.println("file1绝对路径"+file1.getAbsolutePath());
        System.out.println("file1的父亲路径"+file1.getParent());

        //相对路径,相对于项目目录
        File file2 = new File("LoL文件夹");
        System.out.println("file2绝对路径"+file2.getAbsolutePath());
        //mkdir 只会创建当前层级
        file2.mkdir();

        //将file1 作为父亲目录,创建文件夹
        File file3 = new File(file1, "child目录");
        //mkdirs 会逐层创建目录,也就是先创建 fileTest,再创建child目录
        file3.mkdirs();
}

二、 判断文件夹是否存在 和 获取该文件夹下的文件数组

public static void main(String[] args) {
        File file = new File("D:\\code_java\\fileDemo\\updateName");
        System.out.println("以文件形式返回获取所在文件夹"+file.getParentFile());

        if(file.exists()){
            // 以字符串数组的形式,返回当前文件夹下的所有文件
            System.out.println(file.list());
            //以文件数组的形式,返回当前文件夹下的所有文件
            System.out.println(file.listFiles());
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                System.out.println(files[i].getName());
            }
        }
    }

三、删除文件夹和文件夹里面的全部内容

Java的基础库本身没提供这个方法,delete方法只是删除单个文件,像要删除整个文件夹,思路上就是,要获取文件,之后递归删除,我选择另一种简单的方式,现成的commons-io 这个库,它提供了文件夹的删除操作。用法如下

引入依赖

 <!-- 常用工具类 -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
</dependency>

File f1 = new File(文件夹路径);
// 导入 FileUtils的依赖包
FileUtils.deleteDirectory(f1);

四、 IO流

流的本质:就是一系列数据,这些数据可以从一段流向另一端,数据的源头有,数据库、普通文件、硬盘、等等

io流有很多,有字节流、字符流、数据流、对象流,目前我先研究字节流

字节流:输入流InputStream    输出流OutputStream ,顾名思义,字节流的读取方式都是以字节的形式,所以我们一般都创建字节数据来帮我们读取数据。

1. 字节输入流:InputSream它是个接口,具体由FileInputStream实现

public static void inputStream(){
        //1. 准备文件(里面两个字母 x y)
        File file = new File("D:\\testDownload\\teng.txt");
        try {
            //2. 创建基于文件的输入流(此时并没有执行)
            FileInputStream fileInputStream = new FileInputStream(file);
            //3. 创建字节数组
            byte[] all = new byte[(int) file.length()];
            fileInputStream.read(all);
            for (byte b : all) {
                //打印出来是120、121
                System.out.println(b);
            }

            //每次使用完流,都应该进行关闭
            fileInputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

以上看到读取字节流就是用字节数组循环的方式读取字节流的

2. 字节输出流:OutputStream它是接口,具体实现FileOutputStream实现

public static void outputStream(){
        File file = new File("D:\\testDownload\\copy.txt");
        byte data[] = { 88, 89 };
        //创建基于文件的输入流
        try {
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            //将字母 X Y写入到空的文件
            fileOutputStream.write(data);
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

注意:输入流和输出流必须关闭,只有关闭后,才能删除文件

3. HttpServletResponse详解:封装HTTP响应消息

(1)getOutputStream() 方法

该方法所获取的字节输出流对象为 ServletOutputStream 类型。由于 ServletOutputStream是OutputStream 的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用 getOutputStream() 方法。

四、uniapp前端下载二进制的问题

在uniapp中下载二进制内容时,只能是文本,借用uniapp将base64转成二进制。

java后端需要返回base64

        byte[] bytes = new byte[1024];
        //输入流
        FileInputStream fileInputStream = new FileInputStream(projectPath+"/"+fileName);
        //输出流        
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int len;
        while ((len = fileInputStream.read(bytes)) != -1) {
            out.write(bytes, 0, len);
        }
        //用base64把二进制数组编码成,base64字符串
        String base64 = Base64.encode(out.toByteArray());

五、SpringBoot 上操作文件的对象是 MultipartFile

看另一篇博客 深入理解 MultipartFile 处理文件_tengyuxin的博客-CSDN博客_multipartfile打开文件

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tengyuxin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值