---
title: Java IO è®¾è®¡æ¨¡å¼æ»ç»
category: Java
tag:
- Java IO
- Javaåºç¡
---
è¿ç¯æç« æä»¬ç®åæ¥ççæä»¬ä» IO ä¸è½å¤å¦ä¹ å°åªäºè®¾è®¡æ¨¡å¼çåºç¨ã
## è£
饰卿¨¡å¼
**è£
饰å¨ï¼Decoratorï¼æ¨¡å¼** å¯ä»¥å¨ä¸æ¹ååæå¯¹è±¡çæ
åµä¸æå±å
¶åè½ã
è£
饰卿¨¡å¼éè¿ç»åæ¿ä»£ç»§æ¿æ¥æ©å±åå§ç±»çåè½ï¼å¨ä¸äºç»§æ¿å
³ç³»æ¯è¾å¤æçåºæ¯ï¼IO è¿ä¸åºæ¯åç§ç±»çç»§æ¿å
³ç³»å°±æ¯è¾å¤æï¼æ´å å®ç¨ã
对äºåèæµæ¥è¯´ï¼ `FilterInputStream` ï¼å¯¹åºè¾å
¥æµï¼å`FilterOutputStream`ï¼å¯¹åºè¾åºæµï¼æ¯è£
饰卿¨¡å¼çæ ¸å¿ï¼åå«ç¨äºå¢å¼º `InputStream` å`OutputStream`å类对象çåè½ã
æä»¬å¸¸è§ç`BufferedInputStream`(åèç¼å²è¾å
¥æµ)ã`DataInputStream` çç齿¯`FilterInputStream` çåç±»ï¼`BufferedOutputStream`ï¼åèç¼å²è¾åºæµï¼ã`DataOutputStream`çç齿¯`FilterOutputStream`çåç±»ã
举个ä¾åï¼æä»¬å¯ä»¥éè¿ `BufferedInputStream`ï¼åèç¼å²è¾å
¥æµï¼æ¥å¢å¼º `FileInputStream` çåè½ã
`BufferedInputStream` æé 彿°å¦ä¸ï¼
```java
public BufferedInputStream(InputStream in) {
this(in, DEFAULT_BUFFER_SIZE);
}
public BufferedInputStream(InputStream in, int size) {
super(in);
if (size <= 0) {
throw new IllegalArgumentException("Buffer size <= 0");
}
buf = new byte[size];
}
```
å¯ä»¥çåºï¼`BufferedInputStream` çæé 彿°å
¶ä¸çä¸ä¸ªåæ°å°±æ¯ `InputStream` ã
`BufferedInputStream` 代ç 示ä¾ï¼
```java
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"))) {
int content;
long skip = bis.skip(2);
while ((content = bis.read()) != -1) {
System.out.print((char) content);
}
} catch (IOException e) {
e.printStackTrace();
}
```
è¿ä¸ªæ¶åï¼ä½ å¯ä»¥ä¼æ³äºï¼**ä¸ºå¥æä»¬ç´æ¥ä¸å¼ä¸ä¸ª`BufferedFileInputStream`ï¼å符ç¼å²æä»¶è¾å
¥æµï¼å¢ï¼**
```java
BufferedFileInputStream bfis = new BufferedFileInputStream("input.txt");
```
妿 `InputStream`çåç±»æ¯è¾å°çè¯ï¼è¿æ ·åæ¯æ²¡é®é¢çãä¸è¿ï¼ `InputStream`çåç±»å®å¨å¤ªå¤ï¼ç»§æ¿å
³ç³»ä¹å¤ªå¤æäºã妿æä»¬ä¸ºæ¯ä¸ä¸ªåç±»é½å®å¶ä¸ä¸ªå¯¹åºçç¼å²è¾å
¥æµï¼é£å²ä¸æ¯å¤ªéº»ç¦äºã
å¦æä½ å¯¹ IO æµæ¯è¾çæçè¯ï¼ä½ ä¼åç°`ZipInputStream` å`ZipOutputStream` è¿å¯ä»¥åå«å¢å¼º `BufferedInputStream` å `BufferedOutputStream` çè½åã
```java
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName));
ZipInputStream zis = new ZipInputStream(bis);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileName));
ZipOutputStream zipOut = new ZipOutputStream(bos);
```
`ZipInputStream` å`ZipOutputStream` åå«ç»§æ¿èª`InflaterInputStream` å`DeflaterOutputStream`ã
```java
public
class InflaterInputStream extends FilterInputStream {
}
public
class DeflaterOutputStream extends FilterOutputStream {
}
```
è¿ä¹æ¯è£
饰卿¨¡å¼å¾éè¦çä¸ä¸ªç¹å¾ï¼é£å°±æ¯å¯ä»¥å¯¹åå§ç±»åµå¥ä½¿ç¨å¤ä¸ªè£
饰å¨ã
为äºå®ç°è¿ä¸ææï¼è£
饰å¨ç±»éè¦è·åå§ç±»ç»§æ¿ç¸åçæ½è±¡ç±»æè
å®ç°ç¸åçæ¥å£ãä¸é¢ä»ç»å°çè¿äº IO ç¸å
³çè£
饰类ååå§ç±»å
±åçç¶ç±»æ¯ `InputStream` å`OutputStream`ã
对äºåç¬¦æµæ¥è¯´ï¼`BufferedReader` å¯ä»¥ç¨æ¥å¢å `Reader` ï¼å符è¾å
¥æµï¼åç±»çåè½ï¼`BufferedWriter` å¯ä»¥ç¨æ¥å¢å `Writer` ï¼å符è¾åºæµï¼åç±»çåè½ã
```java
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8"));
```
IO æµä¸çè£
饰卿¨¡å¼åºç¨çä¾åå®å¨æ¯å¤ªå¤äºï¼ä¸éè¦ç¹æè®°å¿ï¼å®å
¨æ²¡å¿
è¦åï¼ææ¸
äºè£
饰卿¨¡å¼çæ ¸å¿ä¹åï¼ä½ å¨ä½¿ç¨çæ¶åèªç¶å°±ä¼ç¥éåªäºå°æ¹è¿ç¨å°äºè£
饰卿¨¡å¼ã
## éé
卿¨¡å¼
**éé
å¨ï¼Adapter Patternï¼æ¨¡å¼** 主è¦ç¨äºæ¥å£äºä¸å
¼å®¹çç±»çåè°å·¥ä½ï¼ä½ å¯ä»¥å°å
¶èæ³å°æä»¬æ¥å¸¸ç»å¸¸ä½¿ç¨ççµæºéé
å¨ã
éé
卿¨¡å¼ä¸åå¨è¢«éé
ç对象æè
类称为 **éé
è
(Adapter)** ï¼ä½ç¨äºéé
è
ç对象æè
类称为**éé
å¨(Adapter)** ãéé
å¨å为对象éé
å¨åç±»éé
å¨ãç±»éé
å¨ä½¿ç¨ç»§æ¿å
³ç³»æ¥å®ç°ï¼å¯¹è±¡éé
å¨ä½¿ç¨ç»åå
³ç³»æ¥å®ç°ã
IO æµä¸çå符æµååèæµçæ¥å£ä¸åï¼å®ä»¬ä¹é´å¯ä»¥åè°å·¥ä½å°±æ¯åºäºéé
卿¨¡å¼æ¥åçï¼æ´åç¡®ç¹æ¥è¯´æ¯å¯¹è±¡éé
å¨ãéè¿éé
å¨ï¼æä»¬å¯ä»¥å°åèæµå¯¹è±¡éé
æä¸ä¸ªå符æµå¯¹è±¡ï¼è¿æ ·æä»¬å¯ä»¥ç´æ¥éè¿åèæµå¯¹è±¡æ¥è¯»åæè
åå
¥åç¬¦æ°æ®ã
`InputStreamReader` å `OutputStreamWriter` å°±æ¯ä¸¤ä¸ªéé
å¨(Adapter)ï¼ åæ¶ï¼å®ä»¬ä¸¤ä¸ªä¹æ¯åèæµåå符æµä¹é´çæ¡¥æ¢ã`InputStreamReader` ä½¿ç¨ `StreamDecoder` ï¼æµè§£ç å¨ï¼å¯¹åèè¿è¡è§£ç ï¼**å®ç°åèæµå°å符æµç转æ¢ï¼** `OutputStreamWriter` 使ç¨`StreamEncoder`ï¼æµç¼ç å¨ï¼å¯¹å符è¿è¡ç¼ç ï¼å®ç°å符æµå°åèæµç转æ¢ã
`InputStream` å `OutputStream` çåç±»æ¯è¢«éé
è
ï¼ `InputStreamReader` å `OutputStreamWriter`æ¯éé
å¨ã
```java
// InputStreamReader æ¯éé
å¨ï¼FileInputStream æ¯è¢«éé
çç±»
InputStreamReader isr = new InputStreamReader(new FileInputStream(fileName), "UTF-8");
// BufferedReader å¢å¼º InputStreamReader çåè½ï¼è£
饰卿¨¡å¼ï¼
BufferedReader bufferedReader = new BufferedReader(isr);
```
`java.io.InputStreamReader` é¨åæºç ï¼
```java
public class InputStreamReader extends Reader {
//ç¨äºè§£ç ç对象
private final StreamDecoder sd;
public InputStreamReader(InputStream in) {
super(in);
try {
// è·å StreamDecoder 对象
sd = StreamDecoder.forInputStreamReader(in, this, (String)null);
} catch (UnsupportedEncodingException e) {
throw new Error(e);
}
}
// ä½¿ç¨ StreamDecoder 对象åå
·ä½ç读åå·¥ä½
public int read() throws IOException {
return sd.read();
}
}
```
`java.io.OutputStreamWriter` é¨åæºç ï¼
```java
public class OutputStreamWriter extends Writer {
// ç¨äºç¼ç ç对象
private final StreamEncoder se;
public OutputStreamWriter(OutputStream out) {
super(out);
try {
// è·å StreamEncoder 对象
se = StreamEncoder.forOutputStreamWriter(out, this, (String)null);
} catch (UnsupportedEncodingException e) {
throw new Error(e);
}
}
// ä½¿ç¨ StreamEncoder 对象åå
·ä½çåå
¥å·¥ä½
public void write(int c) throws IOException {
se.write(c);
}
}
```
**éé
卿¨¡å¼åè£
饰卿¨¡å¼æä»ä¹åºå«å¢ï¼**
**è£
饰卿¨¡å¼** æ´ä¾§éäºå¨æå°å¢å¼ºåå§ç±»çåè½ï¼è£
饰å¨ç±»éè¦è·åå§ç±»ç»§æ¿ç¸åçæ½è±¡ç±»æè
å®ç°ç¸åçæ¥å£ãå¹¶ä¸ï¼è£
饰卿¨¡å¼æ¯æå¯¹åå§ç±»åµå¥ä½¿ç¨å¤ä¸ªè£
饰å¨ã
**éé
卿¨¡å¼** æ´ä¾§éäºè®©æ¥å£ä¸å
¼å®¹èä¸è½äº¤äºçç±»å¯ä»¥ä¸èµ·å·¥ä½ï¼å½æä»¬è°ç¨éé
å¨å¯¹åºçæ¹æ³æ¶ï¼éé
å¨å
é¨ä¼è°ç¨éé
è
ç±»æè
åéé
ç±»ç¸å
³çç±»çæ¹æ³ï¼è¿ä¸ªè¿ç¨éæçãå°±æ¯å¦è¯´ `StreamDecoder` ï¼æµè§£ç å¨ï¼å`StreamEncoder`ï¼æµç¼ç å¨ï¼å°±æ¯åå«åºäº `InputStream` å `OutputStream` æ¥è·å `FileChannel`对象并è°ç¨å¯¹åºç `read` æ¹æ³å `write` æ¹æ³è¿è¡åèæ°æ®ç读åååå
¥ã
```java
StreamDecoder(InputStream in, Object lock, CharsetDecoder dec) {
// çç¥å¤§é¨å代ç
// æ ¹æ® InputStream 对象è·å FileChannel 对象
ch = getChannel((FileInputStream)in);
}
```
éé
å¨åéé
è
两è
ä¸éè¦ç»§æ¿ç¸åçæ½è±¡ç±»æè
å®ç°ç¸åçæ¥å£ã
å¦å¤ï¼`FutureTask` 类使ç¨äºéé
卿¨¡å¼ï¼`Executors` çå
é¨ç±» `RunnableAdapter` å®ç°å±äºéé
å¨ï¼ç¨äºå° `Runnable` éé
æ `Callable`ã
`FutureTask`åæ°å
å« `Runnable` çä¸ä¸ªæé æ¹æ³ï¼
```java
public FutureTask(Runnable runnable, V result) {
// è°ç¨ Executors ç±»ç callable æ¹æ³
this.callable = Executors.callable(runnable, result);
this.state = NEW;
}
```
`Executors`ä¸å¯¹åºçæ¹æ³åéé
å¨ï¼
```java
// å®é
è°ç¨çæ¯ Executors çå
é¨ç±» RunnableAdapter çæé æ¹æ³
public static