Java IO(输入/输出)是Java中处理数据流的核心机制,涵盖了从文件读取和写入到网络通信的各种功能。以下是一些Java IO的基本概念和使用方法:
1. Java IO的主要包
java.io
:这是最常用的IO包,包含了用于文件和数据流操作的类。java.nio
:即“New IO”,提供了对NIO(非阻塞IO)的支持,主要用于高性能的数据处理。
2. 核心类
File
:用于操作文件和目录的类,如创建、删除、重命名文件等。InputStream
和OutputStream
:用于字节流的输入和输出操作,基类有各种具体实现,如FileInputStream
、FileOutputStream
等。Reader
和Writer
:用于字符流的输入和输出操作,基类有各种具体实现,如FileReader
、FileWriter
等。BufferedReader
和BufferedWriter
:用于缓冲字符流,提高读写效率。
3. 基本操作
文件操作
// 创建文件对象
File file = new File("example.txt");
// 判断文件是否存在
if (file.exists()) {
System.out.println("File exists");
}
// 创建新文件
boolean created = file.createNewFile();
if (created) {
System.out.println("File created successfully");
}
字节流操作
// 写入字节到文件
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
fos.write("Hello, World!".getBytes());
}
// 读取字节从文件
try (FileInputStream fis = new FileInputStream("output.txt")) {
int content;
while ((content = fis.read()) != -1) {
System.out.print((char) content);
}
}
字符流操作
// 写入字符到文件
try (FileWriter fw = new FileWriter("output.txt")) {
fw.write("Hello, World!");
}
// 读取字符从文件
try (FileReader fr = new FileReader("output.txt")) {
int content;
while ((content = fr.read()) != -1) {
System.out.print((char) content);
}
}
4. 缓冲流
缓冲流可以显著提高读写效率:
// 使用 BufferedWriter 写入文件
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
bw.write("Hello, World!");
}
// 使用 BufferedReader 读取文件
try (BufferedReader br = new BufferedReader(new FileReader("output.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
5. 序列化
序列化是将对象转换为字节流的过程,用于持久化或在网络中传输。
// 序列化对象
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat"))) {
oos.writeObject(new MyClass());
}
// 反序列化对象
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.dat"))) {
MyClass obj = (MyClass) ois.readObject();
}
6. 异常处理
在IO操作中,异常处理非常重要,例如:
try {
// IO操作
} catch (IOException e) {
e.printStackTrace();
}
我们做一个简单的小项目:一个基本的图书管理系统。这个项目将展示如何使用Java进行文件读写、对象序列化、以及简单的命令行交互。
项目目标
创建一个简单的图书管理系统,用户可以添加图书、查看图书列表、以及保存和加载图书数据。图书信息包括标题、作者和出版年份。
项目结构
- Book - 表示一本图书的类。
- BookManager - 处理图书添加、显示和保存/加载操作的类。
- BookManagerApp - 提供用户界面的主应用程序类。
1. Book
类
这个类将表示一本图书,并实现 Serializable
接口以便对象可以被序列化。
import java.io.Serializable;
public class Book implements Serializable {
private static final long serialVersionUID = 1L;
private String title;
private String author;
private int year;
public Book(String title, String author, int year) {
this.title = title;
this.author = author;
this.year = year;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public int getYear() {
return year;
}
@Override
public String toString() {
return String.format("Title: %s, Author: %s, Year: %d", title, author, year);
}
}
2. BookManager
类
这个类负责图书的管理,包括添加、显示、保存和加载图书。
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class BookManager {
private static final String FILE_NAME = "books.ser";
private List<Book> books;
public BookManager() {
books = new ArrayList<>();
loadBooks();
}
public void addBook(Book book) {
books.add(book);
saveBooks();
}
public void displayBooks() {
if (books.isEmpty()) {
System.out.println("No books available.");
} else {
for (Book book : books) {
System.out.println(book);
}
}
}
private void saveBooks() {
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_NAME))) {
oos.writeObject(books);
} catch (IOException e) {
System.err.println("Error saving books: " + e.getMessage());
}
}
@SuppressWarnings("unchecked")
private void loadBooks() {
File file = new File(FILE_NAME);
if (file.exists()) {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
books = (List<Book>) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
System.err.println("Error loading books: " + e.getMessage());
}
}
}
}
3. BookManagerApp
类
这是应用程序的主入口,提供简单的命令行界面来与用户交互。
import java.util.Scanner;
public class BookManagerApp {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
BookManager bookManager = new BookManager();
while (true) {
System.out.println("Book Manager");
System.out.println("1. Add Book");
System.out.println("2. View Books");
System.out.println("3. Exit");
System.out.print("Choose an option: ");
int option = scanner.nextInt();
scanner.nextLine(); // Consume newline
switch (option) {
case 1:
System.out.print("Enter title: ");
String title = scanner.nextLine();
System.out.print("Enter author: ");
String author = scanner.nextLine();
System.out.print("Enter year: ");
int year = scanner.nextInt();
scanner.nextLine(); // Consume newline
Book book = new Book(title, author, year);
bookManager.addBook(book);
System.out.println("Book added.");
break;
case 2:
System.out.println("Books in Library:");
bookManager.displayBooks();
break;
case 3:
System.out.println("Exiting...");
scanner.close();
return;
default:
System.out.println("Invalid option. Please try again.");
}
}
}
}
运行项目
- 编译代码:将每个类保存为一个
.java
文件,然后使用javac
编译它们。 - 运行程序:使用
java BookManagerApp
运行主程序。
总结
这个小项目演示了如何使用Java进行基本的文件操作、对象序列化、以及简单的用户交互。你可以根据需要扩展这个项目,比如添加图书删除功能、图书搜索功能、或者提供更复杂的用户界面。