美文网首页js css html
java_io 涉及到文件(txt,图片)上传,下载,读取文件,

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

作者: Raral | 来源:发表于2022-09-08 18:14 被阅读0次

    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. 总结
    • 字符流 比 字节流 效率慢;字符流适合中文读写操作
    • 可以使用缓冲流 提升读写效率;字节流 =》 字符流 =》 缓存字符流
    • 注意:中文乱码bug
    • 序列化问题
    • 编码格式

    上传和下载

    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>
    
    

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/qrmonrtx.html