之前自己学习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());