1. IO 种类
-
定义
在 Java 里,IO(输入 / 输出)主要分为字节流和字符流这两种类型。字节流以字节为单位处理数据,适合处理二进制数据,像图片、音频、视频等;字符流以字符为单位处理数据,适用于处理文本数据。
-
要点
- 字节流处理二进制数据,字符流处理文本数据。
- 字节流的基类是
InputStream
和OutputStream
,字符流的基类是Reader
和Writer
。
-
应用
在实际开发中,读取图片等二进制文件用字节流,读取文本文件用字符流。比如读取配置文件、保存图片等场景。
-
代码示例
java
import java.io.*;
public class IODemo {
public static void main(String[] args) {
// 字节流示例:复制图片
try (FileInputStream fis = new FileInputStream("input.jpg");
FileOutputStream fos = new FileOutputStream("output.jpg")) {
int byteRead;
while ((byteRead = fis.read()) != -1) {
fos.write(byteRead);
}
} catch (IOException e) {
e.printStackTrace();
}
// 字符流示例:读取文本文件
try (FileReader fr = new FileReader("input.txt");
BufferedReader br = new BufferedReader(fr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 先进先出置换算法(FIFO)
-
定义
FIFO 是一种页面置换算法,当内存空间不足时,该算法会选择最先进入内存的页面进行置换。
-
要点
- 简单易实现,只需一个队列记录页面进入内存的顺序。
- 可能出现 Belady 异常,即增加页面帧数时,缺页率反而增加。
-
应用
在一些对内存管理要求不高的简单系统中使用,例如早期的一些小型操作系统。
-
代码示例
java
import java.util.LinkedList;
import java.util.Queue;
public class FIFOPageReplacement {
public static int pageFaults(int[] pages, int capacity) {
Queue<Integer> queue = new LinkedList<>();
int pageFaults = 0;
for (int page : pages) {
if (!queue.contains(page)) {
if (queue.size() == capacity) {
queue.poll();
}
queue.add(page);
pageFaults++;
}
}
return pageFaults;
}
public static void main(String[] args) {
int[] pages = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5};
int capacity = 3;
System.out.println("Page faults: " + pageFaults(pages, capacity));
}
}
3. 最近最久未使用(LRU) 算法
-
定义
LRU 算法是一种页面置换算法,它会选择最近最久未使用的页面进行置换。
-
要点
- 性能较好,能较好地反映程序的局部性原理。
- 实现相对复杂,需维护一个链表记录页面的使用顺序。
-
应用
常用于缓存系统,如浏览器缓存、数据库缓存等,以提高数据的访问效率。
-
代码示例
java
import java.util.LinkedHashMap;
import java.util.Map;
public class LRU