write(byte[],int,int) 方法是如何工作的?
How is the write(byte[],int,int) method working?
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 索引写入到字节数组的长度,但是当它第二次被调用时,它如何将新文本附加到前一个文本的末尾?它应该覆盖以前的内容,因为再次以 0 作为起始索引调用 write。如果我理解有误,请帮助我?
write 方法中的起始偏移量不是指FileOutputStream
中的偏移量,而是指您写入的数组中的偏移量。
您可以阅读 in the documentation of OutputStream
(而不是 FileOutputStream
)如何使用 write
方法。
针对您的特定 write
方法调用
outStream.write(buffer, 0, length);
表示:"write out the contents of buffer
to stream outStream
starting at buffer[0]
the next length
bytes".
第二个和第三个参数指的是数组的边界。该方法会将 buffer[0]
写入 buffer[length - 1]
。由于您一次又一次地从 inStream
中读取(请参阅 while
循环的开头),因此 buffer
的内容将被此输入流中的连续字节填充。生成的操作是这里的文件复制。
write()
方法的最简单形式是 write( byte[] buffer )
;它将整个缓冲区写入输出流。
然而,通常情况下我们不想写入整个缓冲区,而只想写入其中的一部分。这就是 write( byte[] buffer, int offset, int length )
存在的原因。
您提供的代码使用了 write()
方法的这种变体,因为缓冲区并不总是满的,因为 read()
调用并不总是读取整个缓冲区,它读取 length
字节数。
在您发布的代码中,每次调用偏移量为 0 的 read()
方法,这意味着它从输入流中读取字节并将它们存储到从偏移量 0 开始的缓冲区中。因此,write()
方法还需要从缓冲区的零偏移量开始获取字节以写入输出流。这就是为什么要写入的偏移量被指定为零。
然而,如果你有一个包含 100 个字节的缓冲区,而你只想写中间的 80 个,那么你会说 write( buffer, 10, 80 )
。
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 索引写入到字节数组的长度,但是当它第二次被调用时,它如何将新文本附加到前一个文本的末尾?它应该覆盖以前的内容,因为再次以 0 作为起始索引调用 write。如果我理解有误,请帮助我?
write 方法中的起始偏移量不是指FileOutputStream
中的偏移量,而是指您写入的数组中的偏移量。
您可以阅读 in the documentation of OutputStream
(而不是 FileOutputStream
)如何使用 write
方法。
针对您的特定 write
方法调用
outStream.write(buffer, 0, length);
表示:"write out the contents of buffer
to stream outStream
starting at buffer[0]
the next length
bytes".
第二个和第三个参数指的是数组的边界。该方法会将 buffer[0]
写入 buffer[length - 1]
。由于您一次又一次地从 inStream
中读取(请参阅 while
循环的开头),因此 buffer
的内容将被此输入流中的连续字节填充。生成的操作是这里的文件复制。
write()
方法的最简单形式是 write( byte[] buffer )
;它将整个缓冲区写入输出流。
然而,通常情况下我们不想写入整个缓冲区,而只想写入其中的一部分。这就是 write( byte[] buffer, int offset, int length )
存在的原因。
您提供的代码使用了 write()
方法的这种变体,因为缓冲区并不总是满的,因为 read()
调用并不总是读取整个缓冲区,它读取 length
字节数。
在您发布的代码中,每次调用偏移量为 0 的 read()
方法,这意味着它从输入流中读取字节并将它们存储到从偏移量 0 开始的缓冲区中。因此,write()
方法还需要从缓冲区的零偏移量开始获取字节以写入输出流。这就是为什么要写入的偏移量被指定为零。
然而,如果你有一个包含 100 个字节的缓冲区,而你只想写中间的 80 个,那么你会说 write( buffer, 10, 80 )
。