流(Stream)
流是一个非常强大的概念,它提供了一种高效且便捷的方式来处理集合数据。你可以将流看作是一系列数据项的管道,你可以对这些数据进行各种操作,如过滤、映射、排序和归约。
流的创建
在Java中,你可以通过集合、数组或输入/输出操作来创建流。下面是一些创建流的示例:
- 通过集合创建流:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Stream<String> stream = names.stream();
- 通过数组创建流:
String[] names = {"Alice", "Bob", "Charlie"};
Stream<String> stream = Arrays.stream(names);
- 通过输入/输出操作创建流:
try (Stream<String> stream = Files.lines(Paths.get("data.txt"))) {// 处理流中的数据
} catch (IOException e) {e.printStackTrace();
}
流的操作
流提供了丰富的操作方法,你可以使用它们来处理流中的数据。下面是一些常见的流操作:
- 过滤操作:使用
filter
方法根据指定的条件过滤流中的元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
- 映射操作:使用
map
方法将流中的元素映射为另一个元素。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Integer> nameLengths = names.stream().map(String::length).collect(Collectors.toList());
- 排序操作:使用
sorted
方法对流中的元素进行排序。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> sortedNames = names.stream().sorted().collect(Collectors.toList());
- 归约操作:使用
reduce
方法将流中的元素归约为一个值。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce(0, (a, b) -> a + b);
流的分类
-
根据功能分类:
-
节点流(Node Stream):
- 描述:节点流直接与数据源或目标进行交互,提供最基本的读取和写入功能。
- 包含的流类型:
- 字节节点流(Byte Node Stream):用于处理字节数据的节点流。
- 示例:
InputStream
、OutputStream
、FileInputStream
、FileOutputStream
等。
- 示例:
- 字符节点流(Character Node Stream):用于处理字符数据的节点流。
- 示例:
Reader
、Writer
、FileReader
、FileWriter
等。
- 示例:
- 字节节点流(Byte Node Stream):用于处理字节数据的节点流。
-
缓冲流(Buffered Stream):
-
描述:缓冲流是对节点流的包装,提供了缓冲功能,以提高I/O操作的效率。
-
包含的流类型:
-
缓冲字节流(Buffered Byte Stream):对字节节点流进行缓冲的流。
- 示例:
BufferedInputStream
、BufferedOutputStream
等。
- 示例:
-
缓冲字符流(Buffered Character Stream):对字符节点流进行缓冲的流。
- 示例:
BufferedReader
、BufferedWriter
等。
- 示例:
-
-
-
区别:节点流直接与数据源或目标进行交互,数据在读取或写入时不会进行缓冲,每次操作都涉及直接访问底层数据源或目标。缓冲流在读取或写入数据时,先将数据存储到内部的缓冲区,然后从缓冲区中读取或写入数据。这样可以减少对底层资源的直接访问次数,提高I/O操作的效率。
-
-
根据数据类型分类:
-
字节流(Byte Stream):
-
描述:字节流以字节为单位进行读取和写入操作,适用于处理二进制数据。
-
包含的流类型:
- 字节节点流(Byte Node Stream):直接与字节数据源或目标进行交互的节点流。
- 缓冲字节流(Buffered Byte Stream):包装了字节节点流的缓冲流。
-
-
字符流(Character Stream):
- 描述:字符流以字符为单位进行读取和写入操作,适用于处理文本数据。
- 包含的流类型:
- 字符节点流(Character Node Stream):直接与字符数据源或目标进行交互的节点流。
- 缓冲字符流(Buffered Character Stream):包装了字符节点流的缓冲流。
-
区别:字节流处理的是二进制数据,适合于处理图像、音频、视频等非文本数据。字符流处理的是文本数据,提供了对字符编码的支持,适合于处理文本文件、配置文件等。
-
输入/输出(IO)
输入/输出(IO)是与外部环境进行数据交互的基本操作。在Java中,我们使用IO流来读取和写入数据。
IO流的分类
Java中的IO流分为字节流和字符流。字节流用于处理二进制数据,而字符流用于处理文本数据。
常见的字节流类有:InputStream
、OutputStream
、FileInputStream
、FileOutputStream
等。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class ByteNodeStreamExample {public static void main(String[] args) {try {FileInputStream inputStream = new FileInputStream("input.txt");FileOutputStream outputStream = new FileOutputStream("output.txt");int data;while ((data = inputStream.read()) != -1) {outputStream.write(data);}inputStream.close();outputStream.close();} catch (IOException e) {e.printStackTrace();}}
}
缓冲
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class BufferedByteStreamExample {public static void main(String[] args) {try {BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("input.txt"));BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("output.txt"));byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}inputStream.close();outputStream.close();} catch (IOException e) {e.printStackTrace();}}
}
常见的字符流类有:Reader
、Writer
、FileReader
、FileWriter
等。
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class CharacterNodeStreamExample {public static void main(String[] args) {try {FileReader reader = new FileReader("input.txt");FileWriter writer = new FileWriter("output.txt");int data;while ((data = reader.read()) != -1) {writer.write(data);}reader.close();writer.close();} catch (IOException e) {e.printStackTrace();}}
}
缓冲
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class BufferedCharacterStreamExample {public static void main(String[] args) {try {BufferedReader reader = new BufferedReader(new FileReader("input.txt"));BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));String line;while ((line = reader.readLine()) != null) {writer.write(line);writer.newLine();}reader.close();writer.close();} catch (IOException e) {e.printStackTrace();}}
}
文件的读写操作
文件的读写是IO操作中最常见的任务之一。下面是一些文件读写的示例:
读取文件内容
try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}
} catch (IOException e) {e.printStackTrace();
}
写入文件内容
try (BufferedWriter writer = new BufferedWriter(new FileWriter("data.txt"))) {writer.write("Hello, World!");
} catch (IOException e) {e.printStackTrace();
}
文件(File)
在Java中,我们可以使用java.io.File
类进行文件的常见操作,如创建文件、删除文件、重命名文件等。下面是一些文件处理的示例:
创建文件
File file = new File("data.txt");
try {if (file.createNewFile()) {System.out.println("文件创建成功!");} else {System.out.println("文件已存在!");}
} catch (IOException e) {e.printStackTrace();
}
删除文件
File file = new File("data.txt");
if (file.delete()) {System.out.println("文件删除成功!");
} else {System.out.println("文件删除失败!");
}
重命名文件
File file = new File("data.txt");
File newFile = new File("newdata.txt");
if (file.renameTo(newFile)) {System.out.println("文件重命名成功!");
} else {System.out.println("文件重命名失败!");
}
System.out.println("文件删除成功!");
} else {
System.out.println(“文件删除失败!”);
}
#### 重命名文件```java
File file = new File("data.txt");
File newFile = new File("newdata.txt");
if (file.renameTo(newFile)) {System.out.println("文件重命名成功!");
} else {System.out.println("文件重命名失败!");
}