目录
一、输入流和输出流
二、基本的输入输出流
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 程序中。InputStream
和 Reader
是常见的输入流类。
输出流(Output Stream): 输出流用于将数据从 Java 程序写入到外部数据源中。OutputStream
和 Writer
是常见的输出流类。
以下是一些常见的基本输入输出流类:
FileInputStream
和 FileOutputStream
: 用于读写文件的二进制数据。FileReader
和 FileWriter
: 用于读写文件的字符数据。BufferedInputStream
和 BufferedOutputStream
: 提供了缓冲功能,提高了读写文件的性能。BufferedReader
和 BufferedWriter
: 提供了字符缓冲功能。DataInputStream
和 DataOutputStream
: 用于读写基本数据类型(如整数、浮点数)的二进制数据。以下是一个示例,演示如何使用 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
逐字节读取文件内容,并将其输出到控制台。
以下是一个示例,演示如何使用 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!" 写入文件。
在使用输入输出流时,要确保及时关闭流以释放资源。可以使用 Java 7 引入的 try-with-resources 语句来自动关闭流,如上述示例所示。
try (FileInputStream inputStream = new FileInputStream("example.txt")) {
// 读取文件内容
} catch (IOException e) {
e.printStackTrace();
}
缓冲流(如 BufferedInputStream
和 BufferedOutputStream
)可以提高 I/O 操作的性能,因为它们会在内存中维护一个缓冲区,减少了单独读写的次数。这通常用于大文件或网络通信中。
try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("example.txt"))) {
// 使用缓冲流读取文件内容
} catch (IOException e) {
e.printStackTrace();
}
对于文本数据,你可以使用字符流(如 FileReader
和 FileWriter
)来进行读写,字符流会自动处理字符编码。
try (FileReader reader = new FileReader("example.txt")) {
// 使用字符流读取文本文件内容
} catch (IOException e) {
e.printStackTrace();
}
DataInputStream
和 DataOutputStream
允许你以二进制形式读写基本数据类型,如整数、浮点数、布尔值等。
try (DataOutputStream outputStream = new DataOutputStream(new FileOutputStream("data.dat"))) {
outputStream.writeInt(42); // 写入整数
outputStream.writeDouble(3.14); // 写入浮点数
} catch (IOException e) {
e.printStackTrace();
}
Java 中文件上传和下载通常涉及与Web应用程序的交互,涉及到处理HTTP请求和响应。以下是文件上传和下载的详细解释,包括基本概念和示例:
Spring: Spring 提供了 MultipartFile
接口和 MultipartResolver
来处理文件上传。你可以使用 @RequestParam
注解来处理文件上传。
确保Spring MVC 项目已经正确配置,并且具备处理文件上传的依赖,比如 Apache Commons FileUpload。
在 Spring 配置文件(通常是 spring-servlet.xml
)中配置文件上传解析器 CommonsMultipartResolver
。确保它能够识别 multipart/form-data
类型的请求。
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
类型的文件参数,将上传的文件保存到指定目录中。
创建一个表单用于上传文件:
文件上传
对于文件下载,可以使用 ResponseEntity
来构建响应,将文件内容发送给客户端浏览器。
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
方法根据文件名构建响应,设置响应头以及文件内容,然后将文件发送给客户端。
在视图页面中,创建一个链接,允许用户下载文件:
文件下载
下载文件
这个链接指向了 /download/{fileName}
路径,允许用户点击链接下载指定文件。
以上是使用 Spring MVC 实现文件上传和下载的简单示例。