概念

涉及到文件操作就离不开流这个概念, 流对象概念简单可以简单地理解为帮我们创建一个内存与系统文件的通道,帮我们做文件读取到内存以及内存二进制信息保存磁盘的功能.

流对象

流对象根据字节数据的流向,分为输入流(InputStream)和输出流(OutputStream).
比如我们需要从指定位置加载文件内容到内存中,那我们就需要创建一个输入流,来帮我们将文件信息传输过来.
我们需要将内存信息保存到指定地方(可能是本地,可能是远程请求), 那我们就需要创建输出流,将该信息通过输出流从内存中保存到其他地方.

Demo

Java的IO流操作包是java.io. 大部分流都由OutputSream、InputStream继承而来. File类也很重要. 对于文件流操作是必须的
流关闭非常重要, 如果不关闭则可能造成堆外内存溢出.

判断资源地址是否存在,不存在则创建(Folder)

// 创建文件对象, 文件输入流加载与输出流保存均需要该对象支持. 也可以获取项目基础路径
File file = new File(folderPath);
if (!file.exists()) {
    file.mkdir();
}
String projectBasePath = new File("").getAbsolutePath();

加载文件信息到内存中(使用输入流)

File resourceFile = ResourceUtils.getFile(resourceLocal);
InputStream in = new FileInputStream(resourceFile);
# 存放文件信息的字节数组. 到时候直接转换即可. 例如new String(b)
byte[] b = new byte[resourceFile.length()];
int offset;
int read;
for(offset = 0; offset < size && (read = input.read(data, offset, size - offset)) != -1; offset += read) {
}
in.close();

// 或者下面这种,一边读入一边输出
int len;
OutputStream out = new FileOutputStream("filename");
while ((len = in.read(b)) != -1) {
    out.write(content, 0, len);
}

保存文件信息到本地(使用输出流)

要注意, 使用输出流不一定非要有输入流. 输出流写入需要字节数组对象,所以自己在内存中构造也是没问题的. 比如自己创建一个String对象然后getBytes也是可以的.

String content = "我的区长父亲!"
OutputStream out = new FileOutputStream("/home/io/PrefectArticle.txt");
out.write(content.getBytes());
out.flush();
out.close();

保存压缩文件

Java有非常多输入输出流格式,来帮我们加载/导出不同类型信息文件的中间操作(网络加载文件、加载压缩文件信息、保存压缩文件信息等.只需要用对应的流进行进一步包装,搭配使用即可)

OutputStream out = new FileOutputStream("/home/io/PrefectArticle.zip");
ZipOutputStream zipOut = new ZipOutputStream(out);
zipOut.putNextEntry(new ZipEntry("aaa.txt"));
zipOut.write("我的区长父亲".getBytes());
zipOut.putNextEntry(new ZipEntry("bbb.txt"));
zipOut.write("袁华".getBytes());
zipOut.putNextEntry("/inner/yello.txt")
zipOut.write("喜羊羊和灰太狼".getBytes());
zipOut.flush();
zipOut.close();

下载接口

声明该Response内容类型是流,然后获取Response的输出流对象,将数据信息写入流中

@GetMapping("/file/download")
public void download(HttpServletResponse response){
    // 这些配置信息要在创建输出流之前声明好.
    response.setContentType("application/octet-stream");
    response.setCharacterEncoding("utf-8");
    response.setHeader("Content-Disposition", "attachment; filename=confcenterclient.zip");

    ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream());
    zipOut.putNextEntry(new ZipEntry("aaa.txt"));
    zipOut.write("我的区长父亲".getBytes());
    zipOut.putNextEntry(new ZipEntry("bbb.txt"));
    zipOut.write("袁华".getBytes());
    zipOut.flush();
    zipOut.close();
}