当前位置:   article > 正文

Java文件读写(一)基础文件读写的详细操作_java 大文件读写

java 大文件读写

目录

常用的文件类

使用须知

常用文件类表格

文件读写功能简单实现

写文件

读文件

在Web程序上实现文件读写功能

上传文件

下载文件


常用的文件类

        日常生活中我们会遇到对txt、mp4等文件的读写操作,而Java中存在很多文件操作的相关类。那么先简单认识一些常用的文件操作类的特点。

        File类:一般用它来表示一个文件或目录,文件操作方面只能创建文件、修改文件的属性。

        FileInputStreamFileOutputStream类:通过字节流来读写文件,可以对文件中的数据进行操作,但是不能处理中文字符。

        FileReaderFileWriter类:通过字符流来读写文件,可以处理中文字符。

        BufferedReaderBufferedWriter类:提供通用的缓冲方式文本读取,一次性读取多个字符并缓存在内存中,以提高读取效率。

        RandomAccessFile类:用于随机访问文件的类,支持对文件的任意位置进行读取和写入操作,可以提高读写效率。

        PrintWriter类:用于将数据写入文件或标准输出的类,支持写入各种基本数据类型和字符串等。

        MultipartFile类:Spring框架提供的一个用于处理HTTP multipart请求的接口,提供了获取文件输入流的方法,可以直接操作文件的字节流,支持流式处理,适合处理大文件,但是需要依赖Spring框架。

使用须知

        对于二进制文件(如图片、音频、视频等),不能像文本文件一样使用BufferedReaderBufferedWriter来读写,因为BufferedReaderBufferedWriter是面向字符的,它们会对读取的字节进行编码和解码,可能会导致读取出来的数据不正确。

        正确方法是可以使用FileInputStreamFileOutputStream来进行读写,或者使用RandomAccessFile,它支持以字节为单位的随机访问,可以在文件中定位、读取或写入任意位置的数据。

常用文件类表格

类名功能适用对象读写方式异常处理
File文件操作任何文件N/AIOException
FileInputStream用于读取文件二进制文件、文本文件、图片、音视频等FileNotFoundException、IOException
FileOutputStream用于写入文件二进制文件、文本文件、图片、音视频等FileNotFoundException、IOException
FileReader用于读取文本文件文本文件FileNotFoundException、IOException
FileWriter用于写入文本文件文本文件FileNotFoundException、IOException
BufferedReader用于读取文本文件,可以按行读取,提供缓冲区文本文件FileNotFoundException、IOException
BufferedWriter用于写入文本文件,可以按行写入,提供缓冲区文本文件FileNotFoundException、IOException
RandomAccessFile用于随机访问文件,可以读写指定位置的数据,支持任何文件类型二进制文件、文本文件、图片、音视频等读写FileNotFoundException、IOException
PrintWriter用于写入文本文件,可以指定编码方式,提供自动刷新功能文本文件FileNotFoundException、IOException
MultipartFile用于上传文件,常用于Web应用中二进制文件、文本文件、图片、音视频等IOException

文件读写功能简单实现

        了解了相关文件类特点之后,来讲讲如何实现文件的上传。

        最简单的方法是使用FileInputStreamFileOutputStream类来实现文件读写。

写文件:

  1. /**
  2. * 写文件,并保存到指定位置
  3. * @param file 文件
  4. */
  5. void uploadFile(File file) {
  6. // 文件保存路径
  7. String path = "C:\\Users\\uploadfile\\" + file.getName();
  8. try(// 创建一个FileInputStream对象用于读取文件
  9. FileInputStream fis = new FileInputStream(file);
  10. // 创建一个FileOutputStream对象用于写入文件
  11. FileOutputStream fos = new FileOutputStream(path)) {
  12. // 定义一个byte数组用于存放读取到的数据,作为缓存区
  13. byte[] buffer = new byte[1024];
  14. // 定义一个变量用于记录读取到的数据长度
  15. int len = -1;
  16. // 循环读取数据并写入到目标文件中
  17. while ((len = fis.read(buffer)) != -1) {
  18. fos.write(buffer, 0, len);
  19. }
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. }
  23. }

读文件:

  1. /**
  2. * 读文件,并输出文件内容
  3. * @param file 文件
  4. */
  5. void downloadFile(File file) {
  6. try(FileInputStream fis = new FileInputStream(file)) {
  7. // 创建缓存数组
  8. byte[] buffer = new byte[1024];
  9. // 循环读取文件内容
  10. int len = -1;
  11. while ((len = fis.read(buffer)) != -1) {
  12. // 处理读取到的数据,例如将字节数组转换为字符串输出到控制台
  13. String content = new String(buffer, 0, len);
  14. System.out.print(content);
  15. }
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }

        当然,如果用读文件方法去读取一个图片,则会显示乱码


在Web程序上实现文件读写功能

        在Web程序上我们就应该使用更方便的MultipartFile类来实现文件读写功能。

上传文件:

  1. /**
  2. * 文件上传
  3. * @param multipartFile 选择文件
  4. * @return 文件保存路径
  5. */
  6. @PostMapping("/test")
  7. //@ApiOperation("上传文件")
  8. public String uploadFile(@RequestParam("file") MultipartFile multipartFile) {
  9. //判断文件是否为空 isEmpty
  10. if (multipartFile == null || multipartFile.isEmpty()){
  11. return null;
  12. }
  13. //方法一:获取文件的原名称 getOriginalFilename
  14. String fileName = multipartFile.getOriginalFilename();
  15. //方法二(推荐):获取时间戳和文件的扩展名,拼接成一个全新的文件名; 用时间戳来命名是为了避免文件名冲突
  16. // String sourceFilename = multipartFile.getOriginalFilename();
  17. // String fileName = System.currentTimeMillis() + "." + sourceFilename.substring(sourceFilename.lastIndexOf(".") + 1);
  18. //定义文件存放路径
  19. String filePath = "C:\\Users\\uploadfile";
  20. //新建一个目录(文件夹)
  21. File dest = new File(filePath+ "\\" + fileName);
  22. //判断filePath目录是否存在,如不存在,就新建一个
  23. if (!dest.getParentFile().canExecute()){
  24. dest.getParentFile().mkdirs(); //新建一个目录
  25. }
  26. try {
  27. //文件输出
  28. multipartFile.transferTo(dest);
  29. }
  30. catch (Exception e) {
  31. e.printStackTrace();
  32. //拷贝失败要有提示
  33. return null;
  34. }
  35. String url = filePath + "\\" + fileName;
  36. return url;
  37. }

        下载文件的的代码在Web程序上的编写就有所不同了。本地电脑访问服务器资源一般都是用域名+资源路径拼接来实现的,但是这样会出现线上访问的情况。如果我们要实现下载功能则需要修改响应头信息

下载文件:

  1. /**
  2. * 文件下载
  3. * @param fileName 文件名称
  4. * @return http报文,直接让浏览器下载文件
  5. */
  6. @GetMapping("/downloadfile")
  7. //@ApiOperation("下载文件")
  8. public ResponseEntity<byte[]> downloadFile(@RequestParam("filename") String fileName) {
  9. File file = new File("C:\\Users\\uploadfile\\" + fileName);
  10. HttpHeaders headers = new HttpHeaders();
  11. headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
  12. headers.setContentDisposition(ContentDisposition.builder("attachment").filename(file.getName()).build());
  13. try {
  14. byte[] bytes = Files.readAllBytes(file.toPath());
  15. return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
  16. } catch(IOException e) {
  17. e.printStackTrace();
  18. return null;
  19. }
  20. }

        要注意,正规流程是需要将返回值插入HashMap中或者是其Web专用的HashMap子类中来给前端传递信息的。

        方法参数也应使用模板类来存储MultipartFile类和其它信息,模板类需要实现Serializable接口使其可以被序列化(好处:数据持久化、便于对象传输)。在这里就简单带过了。


Java文件读写(一)基础文件读写的详细操作:http://t.csdn.cn/yuIH1 (所在位置)

Java文件读写(二)网络传输大型文件的原理:http://t.csdn.cn/xyJpo

后面我会持续更新有关文件读写的文章。

关注作者,获取更多精彩内容!

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号