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

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 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


        
            cn.afterturn
            easypoi-base
            3.2.0
        
  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 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 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




    
    
    
    Document
    
    



    
    
    







你可能感兴趣的:(java_io 涉及到文件(txt,图片)上传,下载,读取文件,excel上传和下载)