字节流和字符流。字节流继承于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中释放外部资源 ,从而让代码更加优雅。