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);
- 这个构造器接受一个