[toc]
## 1. FileInputStream类与FileOutputStream类
FileInputStream类与FileOutputStream类用来向磁盘文件进行读取和写入,数据的单位是字节。
```java
public class FileIOStreamTest {
@Test
public void writeAndRead() {
File targetFile = new File("E:\\temp\\word.txt");
/**** 向文件 E:\temp\word.txt 写入数据 ****/
try {
OutputStream out = new FileOutputStream(targetFile);
String content = "我有一只小毛驴,但我从来不骑!";
byte[] writeByte = content.getBytes();
// 将数据写入文件中
out.write(writeByte);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
/**** 读取文件 E:\temp\word.txt ****/
try {
InputStream in = new FileInputStream(targetFile);
byte[] readByte = new byte[1024];
// 将数据读取到 readByte 中。在读取完文件后,read函数返回 -1
while (in.read(readByte) != -1) {
System.out.println(new String(readByte, "UTF-8"));
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
<br/>
## 2. FileReader类与FileWriter类
FileReader类与FileWriter类分别用来向文件读取和写入数据,数据单位是字符。汉字在文件中占用2个字节,如果使用字节流搞不好会出现乱码。
```java
public class FileRWTest {
@Test
public void readAndWrite() {
File targetFile = new File("E:\\temp\\word.txt");
/**** 向文件 E:\temp\word.txt 写入数据 ****/
try {
FileWriter out = new FileWriter(targetFile);
String content = "FileWriter负责写入,FileReader负责读取。";
out.write(content);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
/**** 读取文件 E:\temp\word.txt ****/
try {
FileReader in = new FileReader(targetFile);
char readByte[] = new char[1024];
// 将数据读取到 readByte 中。在读取完文件后,read函数返回 -1
while (in.read(readByte) != -1) {
System.out.println(new String(readByte));
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
<br/>
## 3. BufferedInputStream类与BufferedOutputStream类
BufferedInputStream类与BufferedOutputStream类分别用来向文件读取和写入数据,数据单位是字节。
<br/>
这两个类拥有**缓存区**的功能,可以提高文件读取和写入的性能。最优的缓存区大小取决于操作系统,内存空间和机器配置,默认为32位。
```java
public class BufferedIOStreamTest {
@Test
public void readAndWrite() {
File targetFile = new File("E:\\temp\\word.txt");
/**** 向文件 E:\temp\word.txt 写入数据 ****/
try {
OutputStream out = new FileOutputStream(targetFile);
OutputStream bufOut = new BufferedOutputStream(out);
String writeDatas[] = {"好久不见,", "最近好吗?", "常联系。"};
for (String data : writeDatas) {
bufOut.write(data.getBytes());
}
bufOut.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
/**** 读取文件 E:\temp\word.txt ****/
try {
InputStream in = new FileInputStream(targetFile);
InputStream bufIn = new BufferedInputStream(in);
byte[] readByte = new byte[1024];
// 将数据读取到 readByte 中。在读取完文件后,read函数返回 -1
while (bufIn.read(readByte) != -1) {
System.out.println(new String(readByte, "UTF-8"));
}
bufIn.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
<br/>
## 4. BufferedReader类与BufferedWriter类
BufferedReader类与BufferedWriter类分别用来向文件读取和写入数据,数据单位是字符。
<br/>
这两个类拥有**缓存区**的功能,可以提高文件读取和写入的性能。最优的缓存区大小取决于操作系统,内存空间和机器配置,默认为32位。
```java
public class BufferedRWTest {
@Test
public void readAndWrite() {
File targetFile = new File("E:\\temp\\word.txt");
/**** 向文件 E:\temp\word.txt 写入数据 ****/
try {
FileWriter out = new FileWriter(targetFile);
BufferedWriter bufOut = new BufferedWriter(out);
String writeDatas[] = {"好久不见,", "最近好吗?", "常联系。"};
for (String data : writeDatas) {
bufOut.write(data);
// 换行
bufOut.newLine();
}
bufOut.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
/**** 读取文件 E:\temp\word.txt ****/
try {
FileReader in = new FileReader(targetFile);
BufferedReader bufIn = new BufferedReader(in);
String content = null;
int index = 0;
while ((content = bufIn.readLine()) != null) {
index++;
System.out.println("第" + index + "行:" + content);
}
bufIn.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
<br/>
## 5. DataInputStream类和DataOutputStream类
DataInputStream类和DataOutputStream类也是用来向文件读取和写入数据。不同于前面4种输入输出类的是:它不需要关心数据的单位是字节,还是字符。
<br/>
如果调用 DataOutputStream 的 writeXXX 方法写入字符串,则必须使用 DataInputStream 对应的 readXXX 方法将字符串取出来。
```
public class DataIOStreamTest {
@Test
public void readAndWrite() {
try {
FileOutputStream fos = new FileOutputStream("E:\\temp\\word.txt");
DataOutputStream dos = new DataOutputStream(fos);
String writeDatas[] = {"好久不见,", "最近好吗?", "常联系。"};
for (String data : writeDatas) {
dos.writeUTF(data);
}
// 写入end作为结束符号
dos.writeUTF("end");
dos.writeBytes("writeBytes方法写入!");
dos.close();
fos.close();
FileInputStream fis = new FileInputStream("E:\\temp\\word.txt");
DataInputStream dis = new DataInputStream(fis);
String content = null;
// 上面使用 writeUTF 方法写入数据,则读取时需要调用 readUTF 读取
// 其他的 readXXX 方法是读取不到的,所以这里读取不到内容 `writeBytes方法写入!`
while (!(content = dis.readUTF()).equals("end")) {
System.out.println(content);
}
//好久不见,
//最近好吗?
//常联系。
dis.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
- 网络通信
- 网络协议
- 端口和套接字
- TCP网络程序
- UDP网络程序
- 多线程聊天室
- 多线程
- 线程相关概念
- 线程实现方式
- 中断线程
- 线程生命周期
- 线程优先级
- 优先级规则
- 案例演示
- 线程同步机制
- 线程同步机制
- synchronized关键字
- ReentrantLock类
- Condition类
- 监视器概念
- volatile关键字
- final变量
- 死锁
- 线程局部变量
- 读/写锁
- 原子类
- 阻塞队列
- 工作规则
- 案例演示
- 常用阻塞队列
- 线程安全集合
- 高效的映射/集/队列
- 并发集视图
- 写数组的拷贝
- Arrays类的并行数组算法
- 同步包装器
- Callable与Future
- 执行器
- 线程池
- 预定执行
- 控制任务组
- Fork-Join框架
- 同步器
- 同步器
- 信号量
- CountDownLatch类
- CyclicBarrier类
- Exchanger类
- SynchronousQueue类
- 线程与Swing
- Swing与线程问题
- 两个原则
- Swing工作线程
- 单一线程规则
- 文件IO
- File类
- 文件输入输出
- ZIP压缩文件
- 集合
- 集合框架
- 集合接口
- 集合实现类
- 线程安全集合
- 集合算法
- 迭代器
- 集合排序
- JDBC
- JDBC是什么
- JDBC-ODBC桥
- JDBC驱动程序类型
- JDBC常用类与接口
- 数据库操作
- 连接数据库
- 增/删/改/查/预处理
- 事务
- 批处理
- commons-dbutils工具
- 安全问题
- Jedis
- 使用Jedis操作Redis数据库
- JSON转换
- 使用连接池
- 案例
- 单例破坏
- 单例定义
- 单例实现方式
- 懒汉式实现单例
- 饿汉式实现单例
- 单例破坏
- 类的单例破坏
- 枚举的单例破坏
- 克隆
- 克隆是什么
- 浅克隆
- 深克隆
- 注解
- 注解是什么
- 三大注解
- 内置注解
- 元注解
- 自定义注解
- NIO
- 相关概念
- BIO/NIO/AIO
- 多线程编程
- 线程同步
- 线程通信
- NIO
- NIO三大核心组件
- NIO网络编程
- NIO文件读写
- AIO
- Java8新特性
- Lambda表达式
- 方法引用
- 函数式接口
- 默认方法
- 什么是默认方法
- 默认方法语法格式
- 多个同名的默认方法问题
- 静态默认方法
- 默认方法实例
- Stream
- Stream是什么
- Stream示例
- Optional容器
- 新的日期时间API
- Base64
- SPI
- SPI是什么
- SPI与API的区别
- 常见场景
- 使用SPI需遵循的约定
- SPI使用步骤