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

Ank*_*kit 2 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");
        }
    }   
Run Code Online (Sandbox Code Playgroud)

我无法理解 thw write() 方法是如何工作的?当它第一次被调用时,它正在将 cotents 从 0 索引写入字节数组的长度,但是当它第二次被调用时,它如何将新文本附加到前一个文本的末尾?它应该覆盖以前的内容,因为再次使用 0 作为起始索引调用 write。如果我理解错了,请帮助我?

Mar*_*rto 5

write 方法中的起始偏移量不是指 中的偏移量,FileOutputStream而是指从中写入的数组中的偏移量。

您可以阅读(而不是)应该如何使用该方法的文档OutputStreamFileOutputStreamwrite

对于您的特定write方法调用

outStream.write(buffer, 0, length);
Run Code Online (Sandbox Code Playgroud)

这意味着:“从下一个字节开始写出buffer流的内容”。outStreambuffer[0]length

第二个和第三个参数指的是数组的边界。该方法将写入buffer[0]buffer[length - 1]。并且由于您inStream一次又一次地读取(参见while循环的开头), 的内容buffer将填充来自该输入流的连续字节。结果操作是这里的文件副本。