字節流和字符流。字節流繼承於InputStream、OutputStream,字符流繼承於Reader、Writer。在java.io 包中還有許多其他的流,主要是為了提高性能和使用方便。關於Java的I/O需要注意的有兩點:一是兩種對稱性(輸入和輸出的對稱性,字節和字符的對稱性);二是兩種設計模式(適配器模式和裝潢模式)。另外Java中的流不同於C#的是它只有一個維度一個方向。
面試題 - 編程實現文件拷貝。(這個題目在筆試的時候經常出現,下面的代碼給出了兩種實現方案)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.OutputStream;
import
java.nio.ByteBuffer;
import
java.nio.channels.FileChannel;
public
final
class
MyUtil {
private
MyUtil() {
throw
new
AssertionError();
}
public
static
void
fileCopy(String source, String target)
throws
IOException {
try
(InputStream in =
new
FileInputStream(source)) {
try
(OutputStream out =
new
FileOutputStream(target)) {
byte
[] buffer =
new
byte
[
4096
];
int
bytesToRead;
while
((bytesToRead = in.read(buffer)) != -
1
) {
out.write(buffer,
0
, bytesToRead);
}
}
}
}
public
static
void
fileCopyNIO(String source, String target)
throws
IOException {
try
(FileInputStream in =
new
FileInputStream(source)) {
try
(FileOutputStream out =
new
FileOutputStream(target)) {
FileChannel inChannel = in.getChannel();
FileChannel outChannel = out.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(
4096
);
while
(inChannel.read(buffer) != -
1
) {
buffer.flip();
outChannel.write(buffer);
buffer.clear();
}
}
}
}
}
|
注意:上面用到Java 7的TWR,使用TWR后可以不用在finally中釋放外部資源 ,從而讓代碼更加優雅。
