FileInputStream和FileOutputStream如何在Java中工作?

我正在阅读Java Tutorials Docs中Java中的所有输入/输出流。 教程编写者使用此示例:

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(); } } } } 

xanadu.txt文件数据:

 In Xanadu did Kubla Khan A stately pleasure-dome decree: Where Alph, the sacred river, ran Through caverns measureless to man Down to a sunless sea. 

输出到outagain.txt文件:

 In Xanadu did Kubla Khan A stately pleasure-dome decree: Where Alph, the sacred river, ran Through caverns measureless to man Down to a sunless sea. 
  1. 为什么即使我们正在阅读字符,作者也会使用int c

  2. 为什么在条件下使用-1

  3. 怎么out.write(c); 方法将int转换为再次字符?

1:现在我想问为什么作家使用int c? 即使我们正在读字。

FileInputStream.read()int返回一个数据字节。 这是有效的,因为一个字节可以表示为int而不会损失精度。 请参阅此答案以了解为什么返回int而不是byte

2:第二个为什么在条件下使用-1?

到达文件末尾时,返回-1。

3:如何out.write(c); 方法将int转换为再次字符? 在outagain.txt文件中提供相同的输出

FileOutputStream.write()将byte参数作为int 。 由于int跨越多于一个字节的值,因此忽略给定int的24个高位,使其成为字节兼容值:Java中的int 始终为32位 。 通过删除24个高位,您可以降低到8位值,即一个字节。

我建议你仔细阅读每种方法的Javadocs。 作为参考,他们回答了您的所有问题:

read

从输入流中读取下一个数据字节。 值字节作为int返回,范围为0到255.如果没有字节可用,因为已到达流的末尾,则返回值-1。 此方法将阻塞,直到输入数据可用,检测到流的末尾或抛出exception。

write

将指定的字节写入此输出流。 写入的一般合同是将一个字节写入输出流。 要写入的字节是参数b的八个低位。 b的24个高位被忽略。

只需阅读文档。

这里是read方法docs http://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#read()

public int read()throws IOException从此输入流中读取一个数据字节。 如果尚未提供输入,此方法将阻止。

指定者:在类InputStream中读取

返回:数据的下一个字节,如果到达文件末尾,则返回-1。

那个int是你的下一组字节数据。 现在,这是答案。

1)当你为一个int赋一个char时,它表示它是int的ascii数。

如果您有兴趣,请在此处列出字符及其ascii代码列表https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html

2)-1如果到达文件的末尾。 这样就可以检查数据是否存在。

3)当您向打印编写器发送ascii代码时,它会将相应的char打印到文件中。