java_io 涉及到文件(txt,图片)上传,下载,读取文件,
2022-09-08 本文已影响0人
Raral
java_io 涉及到文件(txt,图片)上传,下载,读取文件,excel上传和下载
字符流和字节流
- UML
字符流
byte.png字节流
[图片上传失败...(image-d5611-1662632030088)]
- 字符流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();
}
}
- 总结
- 字符流 比 字节流 效率慢;字符流适合中文读写操作
- 可以使用缓冲流 提升读写效率;字节流 =》 字符流 =》 缓存字符流
- 注意:中文乱码bug
- 序列化问题
- 编码格式
上传和下载
excel上传和下载
使用第三方的jar
<!-- excel导入和导出工具 easypoi-base-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.2.0</version>
</dependency>
- 后台代码
//实体必须加上注解@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";
}
}
- 前端 代码 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>