暑期学习:自学java第二十七天

第15章 输入/输出 (IO) 笔记
一、 文件操作 (File类)
1.File类是干嘛的?
它只管文件和目录的“外壳”,比如创建、删除、重命名、判断文件是否存在。
重点: 它不能读写文件里面的内容!想读写内容,得靠后面的“流”。
路径问题:可以用绝对路径(从盘符开始),也可以用相对路径(从项目根目录开始)。
注意: Windows路径分隔符是反斜杠 \,但在Java字符串里是转义字符,所以要写成 \ 或者直接用 /(Java支持)。
文件过滤器:用 FilenameFilter 接口可以过滤文件,比如只列出 .java 结尾的文件。
小技巧: 因为它只有一个抽象方法,所以可以用 Lambda 表达式来写,代码超简洁。

二、 IO流基础概念
1.流的分类:
1.输入流 vs 输出流: 方向是相对于内存来说的。数据进内存叫输入,出内存叫输出。
2.字节流 vs 字符流:
字节流 (InputStream/OutputStream): 万能,啥都能读(图片、视频、文本),但读文本容易乱码。
字符流 (Reader/Writer): 专门读文本,能处理字符编码,不会乱码。
3.节点流 vs 处理流:
节点流: 直接连在数据源上(比如 FileInputStream)。
处理流: 套在别的流外面(比如 BufferedInputStream),用来增强功能(比如加个缓冲区,或者提供 readLine 方法)。
2.设计模式:Java IO 大量使用了装饰器模式。就像给流“穿衣服”,一层层包装,功能越来越强。

三、 常用流详解
1.缓冲流 (Buffered):
BufferedReader 和 BufferedWriter 是最常用的。
核心功能: BufferedReader 有个 readLine() 方法,能一次读一行,超级方便。
注意: 用了缓冲流,写数据时记得 flush() 一下,或者 close() 的时候会自动 flush,确保数据真的写进文件了。
2.转换流:
InputStreamReader:把字节流变成字符流(解码)。
OutputStreamWriter:把字符流变成字节流(编码)。
场景: 比如读键盘输入 System.in,它默认是字节流,用这个转换一下就能按字符读了。
3.打印流 (PrintStream/PrintWriter):
功能超强,System.out 就是 PrintStream。
可以直接打印各种数据类型,不用自己转换。
4.数据流 (DataInputStream/DataOutputStream):
可以读写 Java 的基本数据类型(int, boolean, double等),保证数据格式跨平台一致。
5.对象流 (ObjectInputStream/ObjectOutputStream):
专门用来搞序列化的,后面细说。
6.RandomAccessFile (随机访问文件):
特点: 它不属于IO流的四大基类,但功能很强大。
它有一个“文件指针”,可以随意移动(seek 方法),想读哪读哪,想写哪写哪。
模式:r (只读), rw (读写)。
应用: 多线程下载(断点续传)就是靠它实现的。

四、 对象序列化 (Serialization)
1.是指把内存里的 Java 对象变成一串二进制字节,可以存到硬盘,也可以通过网络发给别人。
反序列化就是把这个二进制流再变回对象。
2.类必须实现 Serializable 接口。这是一个“标记接口”,里面啥方法都没有,就是告诉JVM“这个类可以序列化”。
3.serialVersionUID: 手动写一个 private static final long serialVersionUID。如果不写,JVM会根据类信息自动生成一个。一旦类改了(比如加了个字段),自动生成的ID就变了,老的对象就读不出来了。手动写了ID,只要ID不变,就能兼容。
4.transient 关键字: 如果某个字段不想被序列化(比如密码),就加上 transient 修饰。
5.静态变量不序列化: static 修饰的变量属于类,不属于对象,所以不会被序列化。
6.引用传递: 如果对象A里引用了对象B,序列化A的时候,B也会被一起序列化。如果A和C都引用了同一个B,序列化时B只会被保存一次。

五、 NIO (New IO)
1.和传统IO的区别:
传统IO是面向流的,像水管,一次读一个字节,效率低。
NIO是面向块的,像卡车运货,一次搬一块(Buffer),效率高。
2.三大核心:
1.Buffer (缓冲区):本质就是个数组。
三个重要属性: capacity (容量,最大能装多少), limit (界限,最多能读/写到哪), position (位置,当前读到哪了)。
两个关键方法:
flip():写模式切换到读模式。把 limit 设为当前 position,position 归零。
clear():读完清空,准备下一次写。position 归零,limit 设为 capacity。(注意:数据还在,只是指针动了)。
2.Channel (通道):类似流,但可以双向读写。
FileChannel 有个 map() 方法,可以把文件直接映射到内存,操作超大文件飞快。
3.Charset (字符集):专门处理编码解码的,比如 GBK, UTF-8。

六、 NIO.2 (Java 7 新特性)
1.Path 和 Files:
Path 取代了老旧的 File 类,表示路径。
Files 是个工具类,里面全是静态方法,比如 Files.copy(), Files.readAllLines(),比传统IO写起来简单多了。
2.文件监控 (WatchService):可以监听一个文件夹,一旦里面有文件被创建、修改、删除,程序就能立刻收到通知。以前只能傻傻地每隔几秒去扫一遍,效率低。
3.文件属性:可以读取和修改更底层的文件属性,比如文件所有者、权限等。

posted @ 2026-08-11 21:06  hxzzzzzzz  阅读(5)  评论(0)    收藏  举报