【Java基础】IO

参考文章

【Java基础】IO

File

File类接收路径,判断文件是否存在,若不存在则创建文件。

String IMG_PATH = "/Users/mac/Documents/project";

 public void getFile(){
     File file = new File(IMG_PATH);
     if (!file.exists()) {
         log.info("文件不存在!!!");
         file.mkdir();
         log.info("文件新建完成!!!");
     }
 }

FileInputStream

    /**
     * 读取文件
     */
    public void inputStreamFile() throws IOException {
        FileInputStream fis=null;
        try {
            //创建字节输入流
            fis=new FileInputStream(IMG_PATH);
            //创建一个长度为1024的竹筒
            byte[] b=new byte[1024];
            //用于保存的实际字节数
            int hasRead=0;
            //使用循环来重复取水的过程
            while((hasRead=fis.read(b))>0){
                System.out.println(">>>>>>>>>>>>>>>>"+hasRead);
            }
        }catch (IOException e){
            log.error("读取异常"+e);
        }finally {
            fis.close();
        }
    }

FileOutputStream

    /**
     * 读取文件==>创建文件夹==>写出文件
     */
    public void getFileReaderOutput() throws IOException{
        //创建文件夹
        File file = new File(MAKEDIR_TEXT_PATH);
        if (!file.exists()) {
            log.info("文件不存在!!!");
            file.mkdir();
            log.info("文件新建完成!!!");
        }

        FileInputStream fis=null;
        FileOutputStream fos=null;
        try {

            //创建字节输入流
            fis=new FileInputStream(TEXT_PATH);
            //创建字节输出流
            fos=new FileOutputStream(TEXT_PATH_NEW);

            byte[] b=new byte[1024];
            int hasRead=0;

            //循环从输入流中取出数据
            while((hasRead=fis.read(b))>0){
                //每读取一次,即写入文件输入流,读了多少,就写多少。
                fos.write(b,0,hasRead);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            fis.close();
            fos.close();
        }
    }

FileReader

    /**
     * 读取文本
     */
    public void getFileReader() throws IOException {
        FileReader fis=null;
        try {
            //创建字节输入流
            fis=new FileReader(TEXT_PATH);
            //创建一个长度为1024的竹筒
            char[] b=new char[1024];
            //用于保存的实际字节数
            int hasRead=0;
            //使用循环来重复取水的过程
            while((hasRead=fis.read(b))>0){
                System.out.println(">>>>>>>>>>>>>>>>"+hasRead);
                //取出竹筒中的水滴(字节),将字节数组转换成字符串进行输出
                System.out.print(new String(b,0,hasRead));
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            fis.close();
        }
    }

FileWriter

BufferedInputStream

BufferedOutputStream

    /**
     * 用于提高性能,较少磁盘IO的缓冲流
     * BufferedInputStream/BufferedReader,
     * BufferedOutputStream/BufferedWriter
     */
    public void getBufferedStream() throws Exception{
        //创建文件夹
        File file = new File(MAKEDIR_TEXT_PATH);
        if (!file.exists()) {
            log.info("文件不存在!!!");
            file.mkdir();
            log.info("文件新建完成!!!");
        }

        FileInputStream fis=null;
        FileOutputStream fos=null;
        BufferedInputStream bis=null;
        BufferedOutputStream bos=null;
        try {
            //创建字节输入流
            fis=new FileInputStream(TEXT_PATH);
            //创建字节输出流
            fos=new FileOutputStream(TEXT_PATH_NEW);
            //创建字节缓存输入流
            bis=new BufferedInputStream(fis);
            //创建字节缓存输出流
            bos=new BufferedOutputStream(fos);

            byte[] b=new byte[1024];
            int hasRead=0;
            //循环从缓存流中读取数据
            while((hasRead=bis.read(b))>0){
                //向缓存流中写入数据,读取多少写入多少
                bos.write(b,0,hasRead);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            //关闭最上层的流即可
            bis.close();
            bos.close();
        }
    }

ZipOutputStream压缩包

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
    
    /**
     * 打压缩包
     * zipPath:导出zip的地址
     * filePath:被导出的文件地址
     */
    private void zip(String zipPath,String filePath) throws Exception{
        ZipOutputStream out = null;
        try {
            //压缩流
            out = new ZipOutputStream(new FileOutputStream(zipPath));
            //File流
            File inputFile = new File(filePath);
            //初始文件夹目录
            String dir = "";
            zipRecursion(out, inputFile, dir); // 调用方法
            System.out.println("压缩中…"); // 输出信息
        } catch (Exception e) {
            log.error("导出异常",e);
        } finally {
            out.close(); // 将流关闭
        }
    }

    /**
     * 打压缩包==>递归方法
     */
    public  void zipRecursion( ZipOutputStream zip, File file, String dir ) throws Exception {
        //如果当前的是文件夹,则进行进一步处理
        if (file.isDirectory()) {
            //得到文件列表信息
            File[] fileArray = file.listFiles();
            if (fileArray == null) {
                return;
            }
            //将文件夹添加到下一级打包目录
            zip.putNextEntry(new ZipEntry(dir + "/"));
            dir = dir.length() == 0 ? "" : dir + "/";
            //递归将文件夹中的文件打包
            for (File fi : fileArray) {
                zipRecursion(zip, fi, dir + fi.getName());
            }
        } else {
            //当前的是文件,打包处理
            //文件输入流
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
            ZipEntry entry = new ZipEntry(dir);
            zip.putNextEntry(entry);
            zip.write(FileUtils.readFileToByteArray(file));
            IOUtils.closeQuietly(bis);
            zip.flush();
            zip.closeEntry();
        }
    }

下载压缩包的web方法

package com.zy.jdk.io;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 *
 *
 * @author admin
 * @create 2021/11/9
 * @since 1.0.0
 */
@RestController
public class DownLoadController {
    public static final String FILE_OUT_PATH =
            "/Users/mac/Documents/project/idea_project/parent/jdk/src/main/resources/new";

    @PostMapping("/downZip")
    public void downZip(HttpServletResponse response){
        exportZip(response,FILE_OUT_PATH);
    }

    private static void handlerFile(ZipOutputStream zip, File file, String dir) throws Exception {
        //如果当前的是文件夹,则进行进一步处理
        if (file.isDirectory()) {
            //得到文件列表信息
            File[] fileArray = file.listFiles();
            if (fileArray == null) {
                return;
            }
            //将文件夹添加到下一级打包目录
            zip.putNextEntry(new ZipEntry(dir + "/"));
            dir = dir.length() == 0 ? "" : dir + "/";
            //递归将文件夹中的文件打包
            for (File f : fileArray) {
                handlerFile(zip, f, dir + f.getName());
            }
        } else {
            //当前的是文件,打包处理
            //文件输入流
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
            ZipEntry entry = new ZipEntry(dir);
            zip.putNextEntry(entry);
            zip.write(FileUtils.readFileToByteArray(file));
            IOUtils.closeQuietly(bis);
            zip.flush();
            zip.closeEntry();
        }
    }

    private static byte[] createZip(String sourceFilePath) throws Exception{
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ZipOutputStream zip = new ZipOutputStream(outputStream);
        //将目标文件打包成zip导出
        File file = new File(sourceFilePath);
        handlerFile(zip, file,"");
        IOUtils.closeQuietly(zip);
        return outputStream.toByteArray();
    }

    public static void exportZip(HttpServletResponse response, String sourceFilePath) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        LocalDateTime now = LocalDateTime.now();
        String format = now.format(formatter);
        String downloadName = "output" +format+ ".zip";
        //将文件进行打包下载
        try {
            OutputStream out = response.getOutputStream();
            //接收压缩包字节
            byte[] data = createZip(sourceFilePath);
            response.reset();
            response.addHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Expose-Headers", "*");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + downloadName);
            response.addHeader("Content-Length", "" + data.length);
            response.setContentType("application/octet-stream;charset=UTF-8");
            IOUtils.write(data, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


版权声明:本文为qq_45647324原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。