Java 流(Stream)、文件(File)和IO详解
Java中,流(Stream)、文件(File)和输入输出(IO)操作是非常重要的内容。这些功能用于处理数据的读取、写入以及流式处理。本文将详细介绍Java中流、文件和IO的使用方法,包括代码示例和应用场景。
一、Java流(Stream)
Java 8引入了Stream API,用于处理集合数据。Stream是一种可以执行一系列操作(如过滤、映射、减少等)以处理数据的抽象。
1.1 创建Stream
可以从集合、数组、生成器等创建Stream。
示例:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
// 从集合创建Stream
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream1 = list.stream();
// 从数组创建Stream
String[] array = {"x", "y", "z"};
Stream<String> stream2 = Arrays.stream(array);
// 使用Stream.of创建Stream
Stream<String> stream3 = Stream.of("1", "2", "3");
}
}
1.2 常见操作
Stream支持多种操作,如过滤(filter)、映射(map)、归约(reduce)等。
示例:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamOperationsExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
// 过滤偶数
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println("Even numbers: " + evenNumbers);
// 将数字平方
List<Integer> squaredNumbers = numbers.stream()
.map(n -> n * n)
.collect(Collectors.toList());
System.out.println("Squared numbers: " + squaredNumbers);
// 计算总和
int sum = numbers.stream()
.reduce(0, Integer::sum);
System.out.println("Sum: " + sum);
}
}
二、Java文件操作(File)
Java的java.io.File
类用于表示文件和目录路径名。可以使用File类创建、删除、检查文件和目录的属性等。
2.1 创建文件和目录
示例:
import java.io.File;
import java.io.IOException;
public class FileExample {
public static void main(String[] args) {
try {
// 创建文件
File file = new File("example.txt");
if (file.createNewFile()) {
System.out.println("File created: " + file.getName());
} else {
System.out.println("File already exists.");
}
// 创建目录
File directory = new File("exampleDir");
if (directory.mkdir()) {
System.out.println("Directory created: " + directory.getName());
} else {
System.out.println("Directory already exists.");
}
} catch (IOException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
}
}
2.2 读取和写入文件
可以使用FileReader
和FileWriter
类来读取和写入文件。
示例:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileReadWriteExample {
public static void main(String[] args) {
try {
// 写入文件
FileWriter writer = new FileWriter("example.txt");
writer.write("Hello, World!");
writer.close();
// 读取文件
FileReader reader = new FileReader("example.txt");
int character;
while ((character = reader.read()) != -1) {
System.out.print((char) character);
}
reader.close();
} catch (IOException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
}
}
三、Java IO(输入输出)
Java IO库提供了多种输入输出流类,用于处理字节和字符数据。主要分为字节流和字符流两类。
3.1 字节流
字节流用于处理8位字节数据,主要的类是InputStream
和OutputStream
及其子类。
3.1.1 FileInputStream和FileOutputStream
示例:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamExample {
public static void main(String[] args) {
try {
// 写入字节文件
FileOutputStream fos = new FileOutputStream("byteFile.txt");
String data = "Hello, Byte Stream!";
fos.write(data.getBytes());
fos.close();
// 读取字节文件
FileInputStream fis = new FileInputStream("byteFile.txt");
int byteData;
while ((byteData = fis.read()) != -1) {
System.out.print((char) byteData);
}
fis.close();
} catch (IOException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
}
}
3.2 字符流
字符流用于处理16位字符数据,主要的类是Reader
和Writer
及其子类。
3.2.1 FileReader和FileWriter
示例:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharStreamExample {
public static void main(String[] args) {
try {
// 写入字符文件
FileWriter writer = new FileWriter("charFile.txt");
writer.write("Hello, Character Stream!");
writer.close();
// 读取字符文件
FileReader reader = new FileReader("charFile.txt");
int charData;
while ((charData = reader.read()) != -1) {
System.out.print((char) charData);
}
reader.close();
} catch (IOException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
}
}
四、综合应用示例
在实际应用中,可能会综合使用文件操作和流来处理复杂的数据。下面是一个示例,展示如何读取一个文件的内容并通过流进行处理。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class FileStreamExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
List<String> lines = br.lines().collect(Collectors.toList());
List<String> filteredLines = lines.stream()
.filter(line -> line.contains("keyword"))
.collect(Collectors.toList());
filteredLines.forEach(System.out::println);
} catch (IOException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
}
}
五、总结
本文详细介绍了Java中的流(Stream)、文件(File)和IO操作,涵盖了基本概念、常用操作和示例代码。掌握这些知识对于处理数据、文件读写以及流式数据处理非常重要。希望这篇文章对你理解和应用Java的流、文件和IO有所帮助。如果你有任何问题或建议,欢迎在评论区讨论。