从输入流里读取字节数据
read()方法要么返回下一次从流里读取的字节数(0到255,包括0和255),要么在达到流的末端时返回-1。
InputStream in = (...);
try {
while (true) {
int b = in.read();
if (b == -1)
break;
(... process b ...)
}
} finally {
in.close();
}
从输入流里读取块数据
read()方法不一定会填满整个buf,所以你必须在处理逻辑中考虑返回的长度。
InputStream in = (...);
try {
byte[] buf = new byte[100];
while (true) {
int n = in.read(buf);
if (n == -1)
break;
(... process buf with offset=0 and length=n ...)
}
} finally {
in.close();
}
从文件里读取文本
BufferedReader in = new BufferedReader(
new InputStreamReader(new FileInputStream(...), "UTF-8"));
try {
while (true) {
String line = in.readLine();
if (line == null)
break;
(... process line ...)
}
} finally {
in.close();
}
- BufferedReader对象的创建显得很冗长。这是因为Java把字节和字符当成两个不同的概念来看待。
- 你可以使用任何类型的InputStream来代替FileInputStream,比如socket。
- 当达到流的末端时,BufferedReader.readLine()会返回null。
- 要一次读取一个字符,使用Reader.read()方法。
向文件里写文本
PrintWriter out = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(...), "UTF-8"));
try {
out.print("Hello ");
out.print(42);
out.println(" world!");
} finally {
out.close();
}
- Printwriter对象的创建显得很冗长。这是因为Java把字节和字符当成两个不同的概念来看待。
- 就像System.out,你可以使用print()和println()打印多种类型的值。