js css html

java_io 涉及到文件(txt,图片)上传,下载,读取文件,

2022-09-08  本文已影响0人  Raral

java_io 涉及到文件(txt,图片)上传,下载,读取文件,excel上传和下载

字符流和字节流

  1. UML

字符流

byte.png

字节流

[图片上传失败...(image-d5611-1662632030088)]

  1. 字符流code

字符流输入



/**
 * 属于字节流 InputStream 输入流FileInputStream
 * FileInputStream:只能以字节单位读取,对汉字不友好;读取汉字乱码,换成字符流读取即可
 * 从另一角度来说:字符流 = 字节流 + 编码表。
 */
public class FileInputStreamTest {

    //FileInputStream读取 txt,中文乱码
//    public static void main(String[] args) throws IOException {
//        //创建一个输入流,方便读取
//        FileInputStream fis = new FileInputStream("D:/output4.txt");
//
//        //定义一个字节数组,装字节数据容器
//        byte[] b = new byte[2];
//        while (fis.read(b) != -1) {
//            //按照每2个字节读取: 一个英文单词一个字节,一个汉字3个字节
//            System.out.println(new String(b));
//
//        }
//    }

    //InputStreamReader: 根据字符读取,但是不能一行一行读取;解决:使用缓冲流解决
    public static void main(String[] args) throws IOException {
        //创建一个输入流,方便读取
        FileInputStream fis = new FileInputStream("D:/output4.txt");

        //转换成字符流的输入流
        Reader reader = new InputStreamReader(fis,"utf-8");
        char[] b = new char[2];

        int readData;
        while (-1 != (readData = reader.read(b))) {
            //按照每4个字节读取: 一个汉字一个字符
            System.out.println(new String(b));

        }

    }
}

字符流输出


/**
 * 字节流,OutputStream输出流:FileOutputStream,ObjectOutputStream
 * 写入不了汉字字符串
 */
public class FileOutputStreamTest {

    //FileOutputStream测试
//    public static void main(String[] args) throws Exception {
//        //定义一个文件输出流:相当于一个最终输出的容器,以文件形式存在
//        FileOutputStream fos = new FileOutputStream("D:/output.txt");
//        fos.write(97);//可以写int
//        fos.write("abc".getBytes());//写字节
//        fos.write("qwer".getBytes(),1,2);//写指定长度的字节
//        fos.close();//关闭资源
//
//    }

    //ObjectOutputStream 功能更强大,输出流可以写 汉字字符串,对象
    //解决乱码:对象没有序列化,但是写汉字字符串依然乱码
    //解决汉字乱码:使用PrintStream
    public static void main(String[] args) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/output2.txt"));
        String s = "abc";
        oos.writeChars(s);
        Map<String, String> map = new HashMap<>();
        map.put("name","lg");
        map.put("age", "10");
        oos.writeObject(JSONObject.toJSONString(map));
        oos.close();//关闭资源

        PrintStream printStream = new PrintStream(new FileOutputStream("D:/output3.txt"));
        printStream.println("发的发但是\n rqwer");
        printStream.close();
    }
}

字符流读


/**
 * 字符流,读,
 * InputStreamReader:按照字符读取,效率低
 * BufferedReader:按照一行读取,效率高;字节流 => 字符流读 => 缓冲流读
 */
public class InputStreamReadTest {

    //InputStreamReader
//    public static void main(String[] args) throws IOException {
//        InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("D:/test.txt"));
//
//        char[] chars = new char[2];
//
//        while (inputStreamReader.read(chars) != -1) {
//            System.out.println(new String(chars));
//        }
//
//    }

    // 字节流 => 字符流读 => 缓冲流读
    public static void main(String[] args) throws IOException{
        Reader reader = new InputStreamReader(new FileInputStream("D:/test.txt"));
        BufferedReader bufferedReader = new BufferedReader(reader);
        String lineStr = null;
        while ((lineStr = bufferedReader.readLine()) != null) {
            System.out.println(lineStr);
        }

        bufferedReader.close();
    }
}

字符流写


/**
 * 字符流,写入,依赖于字节流
 * OutputStreamWriter:只能写入字符,字符串,
 * OutputStreamWriter:写入效率快
 */
public class OutputStreamWriterTest {
    //OutputStreamWriter
//    public static void main(String[] args) throws IOException,Exception {
//        //字符流写的创建依赖与 字节流输出创建
//        Writer writer = new OutputStreamWriter(new FileOutputStream("D:/output6.txt"), "utf-8");
//
//        writer.write("发放时");//
//
//        writer.close();
//
//    }

    //字节流 =》 字符流 => 缓存字符流  : 效率快
    public static void main(String[] args) throws IOException {
        Writer writer = new OutputStreamWriter(new FileOutputStream("D:/output6.txt"), "utf-8");
        BufferedWriter bufferedWriter = new BufferedWriter(writer);
        bufferedWriter.write("Fsdfasd方法士大夫");
        bufferedWriter.close();
    }
}

  1. 总结

上传和下载

excel上传和下载

使用第三方的jar

<!--        excel导入和导出工具 easypoi-base-->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>3.2.0</version>
        </dependency>
  1. 后台代码
//实体必须加上注解@Excel
@Data
@AllArgsConstructor
public class UserDTO {

    @Excel(name = "名称")
    private String name;
    @Excel(name = "年龄")
    private Integer age;
}

@RequestMapping("/user")
@RestController
public class UserController {

    @Resource
    private UserService userService;

    @GetMapping("/find")
    public String find() {
        String s = userService.find();
        return s;
    }


    //上传功能
    @PostMapping("/importExecl")
    public String importExecl(@RequestParam("file") MultipartFile file) throws Exception {
//        Excel
        List<UserDTO> userDTOS = ExcelImportUtil.importExcel(file.getInputStream(), UserDTO.class, new ImportParams());
        userDTOS.stream().forEach(v -> System.out.println(v));
        //插入数据库操作
        return "ok";
    }

    //导出功能
    @GetMapping("/exportExecl")
    public String exportExecl(String id, HttpServletRequest request, HttpServletResponse response) throws IOException {
        List<UserDTO> userDTOS = new ArrayList<>();
        userDTOS.add(new UserDTO("FASD",12));
        userDTOS.add(new UserDTO("Fdsf",100));

        //必须设置的
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment; filename=" + "用户");
        Workbook sheets = null;
        ExportParams exportParams = new ExportParams(null,"用户");
        exportParams.setType(ExcelType.XSSF);
        ServletOutputStream outputStream = response.getOutputStream();

        try {
            sheets = ExcelExportUtil.exportBigExcel(exportParams, UserDTO.class, userDTOS);

            sheets.write(outputStream);
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (sheets != null){
                sheets.close();
            }
            ExcelExportUtil.closeExportBigExcel();
        }


        return "ok";
    }



}


  1. 前端 代码 jq ajax
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
    <!-- <script src="./js-file-download-master/file-download.js"></script> -->
</head>

<body>
    <input type="file" id="file">
    <button id="import">上传</button>
    <button id="export">导出</button>


</body>
<script>

    //导出
    $("#export").click(() => {
        $.ajax({
            url: "http://127.0.0.1:8080/user/exportExecl",
            method: "GET",
            data: null,
            processData: false,
            contentType: false,
            xhrFields: { responseType: "arraybuffer" },//必须设置,不然会乱码
            success: function (res) {
                console.log(res);

                //
                const blob = new Blob([res], { type: "application/vnd.ms-excel" });

                if (blob.size < 1) {

                    alert('导出失败,导出的内容为空!');

                    return

                }

                if (window.navigator.msSaveOrOpenBlob) {

                    navigator.msSaveOrOpenBlob(blob, '用户.xlsx')

                } else {

                    const aLink = document.createElement('a');

                    aLink.style.display = 'none';
                    //[关键]
                    aLink.href = window.URL.createObjectURL(blob);//把二进制流转换成下载链接

                    aLink.download = '用户.xlsx';

                    document.body.appendChild(aLink);

                    aLink.click();

                    document.body.removeChild(aLink);

                }

            }

        })


    })

    //下载
    $("#import").click(() => {
        let file = $("#file")[0].files[0];
        console.log(file)
        let formData = new FormData();
        formData.append("file", file);


        $.ajax({
            url: "http://127.0.0.1:8080/user/importExecl",
            method: "POST",
            data: formData,
            processData: false,
            contentType: false,
            success: function (res) {
                console.log(res);
                fileDownload(res, '用户.xlsx');
            }

        })

    })

    $.ajax({
        url: "http://127.0.0.1:8080/user/find",
        method: "GET",
        success: function (res) {
            console.log(res);
        }

    })
</script>

</html>

上一篇下一篇

猜你喜欢

热点阅读