主线程中的异常 "main" java.lang.ArrayIndexOutOfBoundsException: arraycopy: length -1 is negative
at java.base/java.lang.System.arraycopy(Native Method)
at java.base/java.io.BufferedOutputStream.write(BufferedOutputStream.java:129)
at itheima11.copyfolders.copyFile(copyfolders.java:52)
at itheima11.copyfolders.copy(copyfolders.java:31)
at itheima11.copyfolders.copy(copyfolders.java:25)
at itheima11.copyfolders.copy(copyfolders.java:25)
at itheima11.copyfolders.copy(copyfolders.java:25)
at itheima11.copyfolders.main(copyfolders.java:13)
這是我在複製多層文件夾時遇到的問題,經過各種調試後發現原因是某一個.txt 文件為空
因為那個.txt 文件為空
當執行這條語句時
int length = bfdips.read(b1);
會讓 length 為 - 1
再執行這條語句時
bfdops.write(b1, 0, length);
從 0 開始,-1 的長度很明顯出錯了
解決辦法:
第一種的時候加上判斷條件,如果 length 為 - 1 的話就不進去
第二種,write 的時候,不要 read 和 write 一個數組。而是一個字節一個字節的 read 和 write
read 和 write 一個數組
byte b1[] = new byte[10241024];
int length = bfdips.read(b1);
bfdops.write(b1, 0, length);
一個字節一個字節的 read 和 write
while (true) {
int i = bfdips.read();
if (i != -1) {
bfdops.write(i);
} else {
break;
}
}
以下是我自己遇到問題的代碼:
package itheima11;
import java.io.*;
//把demo裡的所有文件複製到demo2裡面去
public class copyfolders {
public static void main(String[] args) throws IOException {
File f1 = new File("E:\\文檔\\demo");
File f2 = new File("E:\\文檔\\demo2");
copy(f1, f2);
}
public static void copy(File f1, File f2) throws IOException {
if (f1.exists()) {
if (f1.isDirectory()) { //如果是目錄
String s1 = f1.getName(); //獲取這個文件夾的名字
File f3 = new File(f2, s1);
f3.mkdir(); //在目的地創建這個文件夾
File farr[] = f1.listFiles();
for (File f : farr) {
copy(f, f3); //遞歸
}
} else if (f1.isFile()) { //如果是文件
//E:\\文檔\\demo\\wenjina\\xiaowenjianjia\\123.txt
String s1 = f1.getName();
File f4 = new File(f2, s1); //終點文件名
copyFile(f1, f4);
}
}
}
public static void copyFile(File start, File des) throws IOException {
BufferedInputStream bfdips = new BufferedInputStream(new FileInputStream(start));
BufferedOutputStream bfdops = new BufferedOutputStream(new FileOutputStream(des));
// while (true) {
// int i = bfdips.read();
// if (i != -1) {
// bfdops.write(i);
// } else {
// break;
// }
// }
byte b1[] = new byte[10241024];
int length = bfdips.read(b1);
bfdops.write(b1, 0, length);
bfdips.close();
bfdops.close();
}
}