我刚开始使用java中的I / O,请原谅我,如果我的疑问是愚蠢的,但我发现很难理解这段代码是如何工作的? 下面代码中的变量c没有递增,那么while循环将永远不会终止,即使输入流中只有一个字符,输出流将只连续填充一个字符,但这段代码实际上工作得很满意,我不明白为什么?
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyBytes {
public static void main(String[] args) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("xanadu.txt");
out = new FileOutputStream("outagain.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
答案 0 :(得分:4)
从Java API:“FileInputStream从文件系统中的文件获取输入字节。可用的文件取决于主机环境。”
您的字符c用于从流中“读取”字节,当没有剩余字节要读取时,read()方法返回-1并且会破坏循环。
这就是
((c = in.read()) != -1)
表示读取,直到值为-1。
答案 1 :(得分:2)
当您使用read ()
方法时,实际上每次都会移动您正在阅读的位置,直到您到达文件末尾。这就是它的原因。
答案 2 :(得分:2)
in.read()
方法一次读取一个字符。每次迭代one character
都被读取并分配给c。
请考虑xanadu.txt
文件中存在以下字符。
"ABCDE-1"
注意:文件结尾的-1
含义(-1
仅用于说明目的)
在第一次迭代中
c=A
while-> A!=-1
然后是真的。然后继续while循环并将c='A'
保存到outagain.txt
文件。
在第二次迭代中
c=B
while -> B!=-1
然后是真的。然后继续while循环并将c='B'
保存到outagain.txt
文件。
在第三次迭代中
c=C
while -> C!=-1
然后是真的。然后继续while循环并将c='C'
保存到outagain.txt
文件。
在第四次迭代中
c=D
while -> D!=-1
然后是真的。然后继续while循环并将c='D'
保存到outagain.txt
文件。
在第五次迭代中
c=E
while -> E!=-1
然后是真的。然后继续while循环并将c='E'
保存到outagain.txt
文件。
在第六次迭代中
c=-1
while -> -1!=-1
然后是假的。然后退出while循环
答案 3 :(得分:0)
来自read
对象的函数FileInputStream
返回下一个数据字节,如果到达文件末尾则返回-1
。 (它实际上返回int
)
来源:http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read%28%29
在您的循环中,您正在执行:c = in.read()
,直到c
等于-1
。因此,在每次迭代时,c
包含下一个字节。 read
进行增量本身。