java实现文件加密解密
发布时间:2022-12-06 15:33:11 所属栏目:安全 来源:
导读: 一、对于文件流读写取的方式对比:
inputStream.read()与OutputStream.write()
单字节读取,效率低下
inputStream.read(new byte[801024])与OutputStream.write(new byte[801024])
inputStream.read()与OutputStream.write()
单字节读取,效率低下
inputStream.read(new byte[801024])与OutputStream.write(new byte[801024])
|
一、对于文件流读写取的方式对比: inputStream.read()与OutputStream.write() 单字节读取,效率低下 inputStream.read(new byte[801024])与OutputStream.write(new byte[801024]) 固定数组读取,经测试数组增加到80k左右性能最佳 nputStream.read(inputStream.available()) 与OutputStream.write(inputStream.available()) 按文件大小一次性读取文档加密方式,如文件过大有内存溢出风险 BufferedInputStream.read()与BufferedOutputStream.write() 默认有一个8K的缓存数组 二、循环每个字节加解密(此方法效率最低): 1.通过inputStream.read()单字节加密,inputStream.read()返回的是一个字节的内容(0-255之间的数字),可直接异或加密: @PostMapping("/swlUpload") public void swlUpload(MultipartFile file) throws IOException { String originalFilename = file.getOriginalFilename(); InputStream inputStream = file.getInputStream(); //FileInputStream inputStream = new FileInputStream((File) file); byte[] b = new byte[1024]; FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\"+originalFilename)); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); int swl = 0; while((swl=inputStream.read())!=-1){ //System.out.println(b); bufferedOutputStream.write(swl^9527); } //6.2用来刷新缓冲区,刷新后可以再次写出 bufferedOutputStream.flush(); inputStream.close(); bufferedOutputStream.close(); } 2.通过inputStream.read()单字节解密: @PostMapping("/swlDownload") public void swlDownload(HttpServletResponse response) throws IOException { File f2= new File("D:\\108B计划.xlsx"); boolean exists = f2.exists(); FileInputStream inputStream = new FileInputStream(f2); //byte[] b = new byte[1024]; String filePath = "108B计划.xlsx"; //6.1清除buffer缓存 response.reset(); response.setContentType("application/octet-stream;charset=UTF-8"); //response.setHeader("Content-Disposition", "inline; filename="+ new String(filePath.getBytes("UTF-8"), "ISO-8859-1"));// 定义文件名 //response.setHeader("Content-Disposition", "attachment; filename="+ new String(filePath.getBytes("UTF-8"), "ISO-8859-1"));// 定义文件名 response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(filePath, "UTF-8")); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Expires", " 0"); ServletOutputStream outputStream = response.getOutputStream(); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream); int swl = 0; while((swl = inputStream.read())!=-1){ bufferedOutputStream.write(swl^9527); } //6.2用来刷新缓冲区,刷新后可以再次写出 bufferedOutputStream.flush(); inputStream.close(); bufferedOutputStream.close(); } 三、加载整个文件加解密(效率快,有内存溢出风险): 1.通过inputStream.read(bytes) 加载整个文件,inputStream.read(bytes)返回bytes大小的字节,放入bytes数组中,循环异或加密: @PostMapping("/swlUpload") public void swlUpload(MultipartFile file) throws IOException { String originalFilename = file.getOriginalFilename(); InputStream inputStream = file.getInputStream(); //FileInputStream inputStream = new FileInputStream((File) file); byte[] b = new byte[8*1024]; FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\"+originalFilename)); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); //一、整体io读取、循环加密 long l = System.currentTimeMillis(); log.info(String.valueOf(System.currentTimeMillis())); int swl = 0; byte[] bytes = new byte[inputStream.available()]; while((inputStream.read(bytes))!=-1){ //System.out.println(b); for(int i=0;i<bytes.length;i++){ bufferedOutputStream.write(bytes[i]^9527); } } //6.2用来刷新缓冲区,刷新后可以再次写出 bufferedOutputStream.flush(); inputStream.close(); bufferedOutputStream.close(); log.info(String.valueOf(System.currentTimeMillis())); log.info(String.valueOf(System.currentTimeMillis()-l)); } 2.通过inputStream.read(bytes) 加载整个文件解密: @PostMapping("/swlDownloadAll") public void swlDownloadAll(HttpServletResponse response) throws IOException { File f2= new File("D:\\84333c1377d99d970a0984049db926ae.mp4"); boolean exists = f2.exists(); FileInputStream inputStream = new FileInputStream(f2); //byte[] b = new byte[1024]; String filePath = "84333c1377d99d970a0984049db926ae.mp4"; //6.1清除buffer缓存 response.reset(); response.setContentType("application/octet-stream;charset=UTF-8"); //response.setHeader("Content-Disposition", "inline; filename="+ new String(filePath.getBytes("UTF-8"), "ISO-8859-1"));// 定义文件名 //response.setHeader("Content-Disposition", "attachment; filename="+ new String(filePath.getBytes("UTF-8"), "ISO-8859-1"));// 定义文件名 response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(filePath, "UTF-8")); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Expires", " 0"); ServletOutputStream outputStream = response.getOutputStream(); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream); long l = System.currentTimeMillis(); log.info(String.valueOf(System.currentTimeMillis())); int swl = 0; byte[] bytes = new byte[inputStream.available()]; while((inputStream.read(bytes))!=-1){ for(int i=0;i<bytes.length;i++){ bufferedOutputStream.write(bytes[i]^9527); } } //6.2用来刷新缓冲区,刷新后可以再次写出 bufferedOutputStream.flush(); inputStream.close(); bufferedOutputStream.close(); log.info(String.valueOf(System.currentTimeMillis())); log.info(String.valueOf(System.currentTimeMillis()-l)); } 四、小数组加载文件加解密(效率快,无内存溢出风险)【推荐】: 1.通过inputStream.read(b) 加载整个文件,inputStream.read(b)返回b大小的字节,放入b数组中,循环异或加密: @PostMapping("/swlUploadArray") public void swlUploadArray(MultipartFile file) throws IOException { String originalFilename = file.getOriginalFilename(); InputStream inputStream = file.getInputStream(); //FileInputStream inputStream = new FileInputStream((File) file); byte[] b = new byte[8*1024]; FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\"+originalFilename)); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); //三、小数组循环io读取、循环加密 long l = System.currentTimeMillis(); log.info(String.valueOf(System.currentTimeMillis())); while((inputStream.read(b))!=-1){ //System.out.println(b); for(int i=0;i<b.length;i++){ bufferedOutputStream.write(b[i]^9527); } } //6.2用来刷新缓冲区,刷新后可以再次写出 bufferedOutputStream.flush(); inputStream.close(); bufferedOutputStream.close(); log.info(String.valueOf(System.currentTimeMillis())); log.info(String.valueOf(System.currentTimeMillis()-l)); } 2.通过inputStream.read(b) 加载整个文件解密: @PostMapping("/swlDownloadArray") public void swlDownloadArray(HttpServletResponse response) throws IOException { File f2= new File("D:\\84333c1377d99d970a0984049db926ae.mp4"); boolean exists = f2.exists(); FileInputStream inputStream = new FileInputStream(f2); byte[] b = new byte[8*1024]; String filePath = "84333c1377d99d970a0984049db926ae.mp4"; //6.1清除buffer缓存 response.reset(); response.setContentType("application/octet-stream;charset=UTF-8"); //response.setHeader("Content-Disposition", "inline; filename="+ new String(filePath.getBytes("UTF-8"), "ISO-8859-1"));// 定义文件名 //response.setHeader("Content-Disposition", "attachment; filename="+ new String(filePath.getBytes("UTF-8"), "ISO-8859-1"));// 定义文件名 response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(filePath, "UTF-8")); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Expires", " 0"); ServletOutputStream outputStream = response.getOutputStream(); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream); long l = System.currentTimeMillis(); log.info(String.valueOf(System.currentTimeMillis())); int swl = 0; while((inputStream.read(b))!=-1){ for(int i=0;i<b.length;i++){ bufferedOutputStream.write(b[i]^9527); } } //6.2用来刷新缓冲区,刷新后可以再次写出 bufferedOutputStream.flush(); inputStream.close(); bufferedOutputStream.close(); log.info(String.valueOf(System.currentTimeMillis())); log.info(String.valueOf(System.currentTimeMillis()-l)); } (编辑:均轻资讯网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐

