對FileInputStream.read()方法的一點心得


先上代碼

FileOutputStream outputStream = new FileOutputStream("data.txt");
        byte[] bytes = new byte[1024];
        int num = 0;
        while((num=fileInputStream.read(bytes)) != -1){
            outputStream.write(bytes,0,num);
        }
        outputStream.close();

  這段代碼簡單的把讀取的數據寫入data文件中,沒什么問題,假如換一種寫入方式,如下

FileOutputStream outputStream = new FileOutputStream("data.txt");
        byte[] bytes = new byte[1024];
        int num = 0;
        while((num=fileInputStream.read(bytes)) != -1){
            outputStream.write(bytes);
        }
        outputStream.close();

  如果讀取的文件大小超出1024個字節大小就會出現問題,最終寫入的文件大小要大於讀取的源文件大小;

這個問題有兩個方面造成的

第一個是在讀取的方法上read;

第二個是寫入的方法write;

理想化來說,有兩種解決方案,

第一種:直接讀取一整個文件,不進行長度的限制,例如byte[] length = new byte[fileInputStream.available()];當然這種方式自己測測還行,業務環節肯定不行;

第二種:寫入方法進行指定長度的寫入,

到此,問題是解決了,但是為什么出現這個問題呢,根本原因是什么呢;

通過代碼測試

        FileInputStream fileInputStream = new FileInputStream("clone.txt");
        byte[] bytes = new byte[8];
        while (fileInputStream.read(bytes) != -1){
            String s = new String(bytes);
            System.out.println(s);
            System.out.println("---------------");
        }

  發現,指定長度為8字節,文件大小為26字節的話,在讀取到第24字節的時候發現沒讀完,繼續讀,再讀2字節,發現讀完了,但是你規定了定長啊,那么會繼續讀取6字節的內容,這個內容從哪來呢,就是從已讀取2字節的內容向前數6個字節,出現多讀的情況,這就是為什么如果不規定寫入長度的時候,程序會給文件多寫內容的原因


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM