面试系列 - java输入出入流和文件上传下载详细讲解

目录

一、输入流和输出流

二、基本的输入输出流

1、读取文件内容

2、写入文件内容

3、关闭流

4、缓冲流

5、字符流

6、数据流

三、java 上传和下载文件详解

1、文件上传

2、配置文件上传解析器

3、 编写文件上传的控制器

4、 配置上传文件的表单

1、文件下载

2、编写文件下载的控制器

3、 配置文件下载的链接


Java 的输入输出流(I/O)是处理输入和输出数据的重要方式,用于与文件、网络、控制台等交互。Java 提供了丰富的 I/O 类库,支持不同类型的数据操作。以下是关于 Java 输入输出流的详细讲解:

一、输入流和输出流

在 Java 中,I/O 流主要分为两种类型:输入流(Input Stream)和输出流(Output Stream)。

  • 输入流(Input Stream): 输入流用于从外部数据源(如文件、网络、键盘等)读取数据到 Java 程序中。InputStreamReader 是常见的输入流类。

  • 输出流(Output Stream): 输出流用于将数据从 Java 程序写入到外部数据源中。OutputStreamWriter 是常见的输出流类。

二、基本的输入输出流

以下是一些常见的基本输入输出流类:

  • FileInputStreamFileOutputStream 用于读写文件的二进制数据。
  • FileReaderFileWriter 用于读写文件的字符数据。
  • BufferedInputStreamBufferedOutputStream 提供了缓冲功能,提高了读写文件的性能。
  • BufferedReaderBufferedWriter 提供了字符缓冲功能。
  • DataInputStreamDataOutputStream 用于读写基本数据类型(如整数、浮点数)的二进制数据。

1、读取文件内容

以下是一个示例,演示如何使用 FileInputStream 来读取文件的内容:

import java.io.FileInputStream;
import java.io.IOException;

public class ReadFileExample {
    public static void main(String[] args) {
        try (FileInputStream inputStream = new FileInputStream("example.txt")) {
            int data;
            while ((data = inputStream.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这个示例打开名为 "example.txt" 的文件,使用 FileInputStream 逐字节读取文件内容,并将其输出到控制台。

2、写入文件内容

以下是一个示例,演示如何使用 FileOutputStream 来写入文件内容:

import java.io.FileOutputStream;
import java.io.IOException;

public class WriteFileExample {
    public static void main(String[] args) {
        try (FileOutputStream outputStream = new FileOutputStream("output.txt")) {
            String content = "Hello, World!";
            byte[] bytes = content.getBytes();
            outputStream.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这个示例创建一个名为 "output.txt" 的文件,使用 FileOutputStream 将字符串 "Hello, World!" 写入文件。

3、关闭流

在使用输入输出流时,要确保及时关闭流以释放资源。可以使用 Java 7 引入的 try-with-resources 语句来自动关闭流,如上述示例所示。

try (FileInputStream inputStream = new FileInputStream("example.txt")) {
    // 读取文件内容
} catch (IOException e) {
    e.printStackTrace();
}

4、缓冲流

缓冲流(如 BufferedInputStreamBufferedOutputStream)可以提高 I/O 操作的性能,因为它们会在内存中维护一个缓冲区,减少了单独读写的次数。这通常用于大文件或网络通信中。

try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("example.txt"))) {
    // 使用缓冲流读取文件内容
} catch (IOException e) {
    e.printStackTrace();
}

5、字符流

对于文本数据,你可以使用字符流(如 FileReaderFileWriter)来进行读写,字符流会自动处理字符编码。

try (FileReader reader = new FileReader("example.txt")) {
    // 使用字符流读取文本文件内容
} catch (IOException e) {
    e.printStackTrace();
}

6、数据流

DataInputStreamDataOutputStream 允许你以二进制形式读写基本数据类型,如整数、浮点数、布尔值等。

try (DataOutputStream outputStream = new DataOutputStream(new FileOutputStream("data.dat"))) {
    outputStream.writeInt(42); // 写入整数
    outputStream.writeDouble(3.14); // 写入浮点数
} catch (IOException e) {
    e.printStackTrace();
}

三、java 上传和下载文件详解

Java 中文件上传和下载通常涉及与Web应用程序的交互,涉及到处理HTTP请求和响应。以下是文件上传和下载的详细解释,包括基本概念和示例:

1、文件上传

Spring: Spring 提供了 MultipartFile 接口和 MultipartResolver 来处理文件上传。你可以使用 @RequestParam 注解来处理文件上传。

确保Spring MVC 项目已经正确配置,并且具备处理文件上传的依赖,比如 Apache Commons FileUpload。

2、配置文件上传解析器

在 Spring 配置文件(通常是 spring-servlet.xml)中配置文件上传解析器 CommonsMultipartResolver。确保它能够识别 multipart/form-data 类型的请求。


     

3、 编写文件上传的控制器

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.io.File;
import java.io.IOException;

@Controller
public class FileUploadController {

    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) {
        if (!file.isEmpty()) {
            try {
                String uploadDir = "uploads/";
                File uploadPath = new File(uploadDir);

                if (!uploadPath.exists()) {
                    uploadPath.mkdirs();
                }

                String fileName = file.getOriginalFilename();
                File dest = new File(uploadPath.getAbsolutePath() + File.separator + fileName);
                file.transferTo(dest);

                redirectAttributes.addFlashAttribute("message", "上传成功:" + fileName);
            } catch (IOException e) {
                redirectAttributes.addFlashAttribute("message", "上传失败:" + e.getMessage());
            }
        } else {
            redirectAttributes.addFlashAttribute("message", "上传失败:文件为空");
        }

        return "redirect:/";
    }
}

上述控制器 handleFileUpload 方法接受一个 MultipartFile 类型的文件参数,将上传的文件保存到指定目录中。

4、 配置上传文件的表单

创建一个表单用于上传文件:




    
    文件上传


    

1、文件下载

对于文件下载,可以使用 ResponseEntity 来构建响应,将文件内容发送给客户端浏览器。

2、编写文件下载的控制器

import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

import java.io.File;
import java.io.IOException;

@Controller
public class FileDownloadController {

    @GetMapping("/download/{fileName:.+}")
    public ResponseEntity downloadFile(@PathVariable("fileName") String fileName) {
        String filePath = "uploads/";
        File file = new File(filePath + fileName);

        if (file.exists()) {
            HttpHeaders headers = new HttpHeaders();
            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName);
            headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);

            try {
                FileSystemResource resource = new FileSystemResource(file);
                return ResponseEntity.ok()
                        .headers(headers)
                        .contentLength(resource.contentLength())
                        .contentType(MediaType.APPLICATION_OCTET_STREAM)
                        .body(resource);
            } catch (IOException e) {
                return ResponseEntity.badRequest().body(null);
            }
        } else {
            return ResponseEntity.notFound().body(null);
        }
    }
}

上述控制器 downloadFile 方法根据文件名构建响应,设置响应头以及文件内容,然后将文件发送给客户端。

3、 配置文件下载的链接

在视图页面中,创建一个链接,允许用户下载文件:




    
    文件下载


    下载文件


这个链接指向了 /download/{fileName} 路径,允许用户点击链接下载指定文件。

以上是使用 Spring MVC 实现文件上传和下载的简单示例。

你可能感兴趣的:(面试系列,面试,java,职场和发展)