write(byte [],int,int)方法如何工作?

时间:2017-05-01 08:45:52

标签: java fileinputstream fileoutputstream

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。如果我理解错了,请帮助我吗?

2 个答案:

答案 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 )