public class JavaCopyFileProgram {
public static void main(String[] args)
{
File sourceFile = new File("F:/Study/Java/Java Programs/Factory Methods.txt");
File destFile = new File("D:/DestFile.txt");
FileInputStream inStream = null;
FileOutputStream outStream = null;
try
{
inStream = new FileInputStream(sourceFile);
outStream = new FileOutputStream(destFile);
byte[] buffer = new byte[1024];
int length;
while ((length = inStream.read(buffer)) != -1)
{
outStream.write(buffer, 0, length);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
inStream.close();
outStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
System.out.println("Success");
}
}
我无法理解write()方法是如何工作的?当它首次被调用时,它正在从0索引到字节数组的长度写入cotents,但是当它第二次被调用时,它是如何将新文本附加到前一个文本的末尾?它应该覆盖以前的内容,因为再次使用0作为起始索引调用write。如果我理解错了,请帮助我吗?
答案 0 :(得分:4)
write方法中的起始偏移量不是指FileOutputStream
中的偏移量,而是指您编写的数组中的偏移量。
您可以阅读in the documentation of OutputStream
(而不是FileOutputStream
)如何使用write
方法。
针对您的特定write
方法调用
outStream.write(buffer, 0, length);
表示:"将buffer
的内容写入流outStream
,从buffer[0]
下一个length
字节"开始。
第二个和第三个参数指的是数组的边界。该方法会将buffer[0]
写入buffer[length - 1]
。而且,由于您一次又一次地从inStream
读取(请参阅while
循环的头部),buffer
的内容将填充此输入流中的连续字节。生成的操作是文件副本。
答案 1 :(得分:2)
write()
方法的最简单形式是write( byte[] buffer )
;它将整个缓冲区写入输出流。
然而,通常情况下我们不想写一个完整的缓冲区,而只是它的一部分。这就是write( byte[] buffer, int offset, int length )
存在的原因。
您提供的代码使用write()
方法的这种变体,因为缓冲区并不总是满的,因为read()
调用并不总是读取整个缓冲区,它会读取length
字节数。
在您发布的代码中,每次调用read()
方法时偏移量为0,这意味着它从输入流中读取字节并将它们存储在从偏移量0开始的缓冲区中。因此, write()
方法还需要从缓冲区的零偏移处开始提取字节以写入输出流。这就是写入的偏移量为零的原因。
但是,如果你有一个包含100个字节的缓冲区,并且你只想写中间的80,那么你会说write( buffer, 10, 80 )
。