先上代碼
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個字節,出現多讀的情況,這就是為什么如果不規定寫入長度的時候,程序會給文件多寫內容的原因