java.lang.ArrayIndexOutOfBoundsException: arraycopy: length -1 is negativ

Exception in thread "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)

这是我在IO流复制多级文件夹时遇到的问题,各种调试过后发现原因是某一个.txt文件为空

因为那个.txt文件为空

当执行这条语句时

int length = bfdips.read(b1);

会让length为-1

再执行这条语句时

bfdops.write(b1, 0, length);

从0开始,-1的长度很明显出错了

---------------------------------------------------------------------------------------------------------------------------------

解决办法:

第一种:write的时候加上判断条件,如果length为-1的话就不进去

第二种:read,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();

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值