file io(I)
目录
相对路径编辑
文件操作编辑
删除编辑
IO编辑 IO读编辑
Java IO流 与 Stream流 的区分与学习建议
一、核心概念区分
二、是否需要先学 Stream流 才能学 IO流?
三、不学 Stream流 会影响理解 IO流 吗?
四、学习建议
五、代码示例对比
六、总结
一次读多个
编辑一次读完所有
编辑string构造器
String(char[] value, int offset, int count)
相对路径
文件操作
删除
IO
IO读
Java IO流 与 Stream流 的区分与学习建议
一、核心概念区分
-
Java IO流
- 用途:处理输入输出操作,如文件读写、网络数据传输。
- 分类:
- 字节流:
InputStream/OutputStream(如FileInputStream、BufferedOutputStream)。 - 字符流:
Reader/Writer(如FileReader、BufferedWriter)。
- 字节流:
- 典型场景:
- 读取本地文件:
FileInputStream+BufferedReader。 - 发送网络数据:
Socket.getOutputStream()。
- 读取本地文件:
-
Java 8 Stream流
- 用途:对集合(
List、Set等)进行函数式操作(过滤、映射、归约)。 - 特点:
- 链式调用:
list.stream().filter(...).map(...).collect(...)。 - 延迟执行:操作仅在终止方法(如
collect())调用时触发。
- 链式调用:
- 典型场景:
- 筛选集合中的偶数:
list.stream().filter(x -> x%2==0).collect(Collectors.toList())。
- 筛选集合中的偶数:
- 用途:对集合(
二、是否需要先学 Stream流 才能学 IO流?
答案是否定的,二者无直接关联,学习顺序可独立安排。
| 对比维度 | IO流 | Stream流 |
|---|---|---|
| 核心目标 | 数据传输(文件、网络) | 集合数据处理(函数式操作) |
| 学习前提 | Java基础(异常处理、文件路径) | Java基础 + Lambda表达式基础 |
| 是否需要先学对方 | 不需要 | 不需要 |
关键结论:
- 学习 IO流 不需要先掌握 Stream流。
- 学习 Stream流 也不需要先学 IO流。
三、不学 Stream流 会影响理解 IO流 吗?
完全不影响,但需注意以下两点:
-
术语混淆
- IO流的类名包含
Stream(如InputStream),但和 Java 8 Stream 无关。 - 避免误将
InputStream理解为 Stream API 的流。
- IO流的类名包含
-
学习重点差异
- IO流:关注字节/字符的读写、缓冲优化、资源关闭(
try-with-resources)。 - Stream流:关注集合操作的高效性和代码简洁性。
- IO流:关注字节/字符的读写、缓冲优化、资源关闭(
四、学习建议
-
初学者的学习路径
- 先学 IO流:掌握文件读写、网络通信等基础技能。
- 后学 Stream流:在熟悉集合操作后,提升代码简洁性。
-
核心学习内容
- IO流重点:
- 字节流 vs 字符流的区别。
- 装饰器模式(如
BufferedReader包装FileReader)。 - 资源释放(
close()或try-with-resources)。
- Stream流重点:
- Lambda表达式与函数式接口。
- 中间操作(
filter、map)与终止操作(collect、forEach)。
- IO流重点:
五、代码示例对比
-
IO流示例(读取文件)
Java
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } -
Stream流示例(集合处理)
Java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList());
六、总结
- IO流 和 Stream流 是 Java 中两个独立模块,学习顺序可自由安排。
- 不学 Stream流 对理解 IO流 无任何影响,但需注意术语差异。
- 根据实际需求选择学习:
- 需要文件/网络操作 → 优先学 IO流。
- 需要处理集合数据 → 优先学 Stream流。
-
一次读多个
-
一次读完所有 -
string构造器在Java中,
String类有几个构造器,允许您以不同的方式创建String对象。以下是String类的一些常见构造器及其参数说明: -
String()- 这是一个无参构造器,它创建一个空的
String对象,不包含任何字符。
java
复制
String str = new String(); - 这是一个无参构造器,它创建一个空的
-
String(char[] value)- 这个构造器接受一个字符数组作为参数,并创建一个包含该数组中所有字符的
String对象。
java
复制
char[] chars = {'H', 'e', 'l', 'l', 'o'}; String str = new String(chars); - 这个构造器接受一个字符数组作为参数,并创建一个包含该数组中所有字符的
-
这些构造器提供了不同的方式来创建
String对象,根据您的具体需求选择合适的构造器。 -
String(char[] value, int offset, int count)- 这个构造器接受一个字符数组、一个起始偏移量(
offset)和一个计数(count)作为参数。它创建一个包含从偏移量开始的count个字符的String对象。
java
复制
char[] chars = {'H', 'e', 'l', 'l', 'o'}; String str = new String(chars, 1, 4); // 创建 "ello" - 这个构造器接受一个字符数组、一个起始偏移量(
-
String(byte[] bytes)- 这个构造器接受一个字节数组作为参数,并使用平台的默认字符集解码这些字节来创建一个
String对象。
java
复制
byte[] bytes = {72, 101, 108, 108, 111}; // ASCII 编码的 "Hello" String str = new String(bytes); - 这个构造器接受一个字节数组作为参数,并使用平台的默认字符集解码这些字节来创建一个
-
String(byte[] bytes, int offset, int length)- 这个构造器接受一个字节数组、一个起始偏移量(
offset)和一个长度(length)作为参数。它使用平台的默认字符集解码从偏移量开始的length个字节来创建一个String对象。
java
复制
byte[] bytes = {72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100}; // ASCII 编码的 "Hello World" String str = new String(bytes, 6, 5); // 创建 "World" - 这个构造器接受一个字节数组、一个起始偏移量(
-
String(byte[] bytes, int offset, int length, String charsetName)- 这个构造器接受一个字节数组、一个起始偏移量(
offset)、一个长度(length)和一个字符集名称(charsetName)作为参数。它使用指定的字符集解码从偏移量开始的length个字节来创建一个String对象。
java
复制
byte[] bytes = {206, 177, 206, 189, 206, 191, 206, 187, 206, 177}; // UTF-8 编码的 "Привет" String str = new String(bytes, 0, bytes.length, "UTF-8"); - 这个构造器接受一个字节数组、一个起始偏移量(
-
String(String original)- 这个构造器接受一个
String对象作为参数,并创建一个新的String对象,它是original的一个副本。
java
复制
String original = "Hello"; String str = new String(original); - 这个构造器接受一个
