IO习题练习

1.将一个文件中的内容读取,然后倒叙写回

读取文件中的内容 将读取到的内容 追加到一个 StringBuilder中
调用reverse方法 将内容反转  将反转后的字符串 写回到文件中

代码实现:

public class Test {
    public static void main(String[] args) throws IOException {
        Reader r = new FileReader("d:\\work\\abc\\2.txt");
        StringBuilder sb = new StringBuilder();
        char[] chs = new char[1024];
        int len =0;
        while((len = r.read(chs))!=-1){
            //将读取的数据放入缓冲区中
            sb.append(new String(chs,0,len));
        }
        Writer w = new FileWriter("d:\\work\\abc\\2.txt");
        //将数据反转写回
        w.write(sb.reverse().toString());
        r.close();
        w.close();
    }
}

2.将1.txt中的内容和2.txt中的内容合并 写到3.txt中
代码实现:

public class Test {
    public static void main(String[] args) throws IOException {
        Reader r1 = new FileReader("d:\\work\\abc\\1.txt");
        Reader r2 = new FileReader("d:\\work\\abc\\2.txt");
        StringBuilder sb = new StringBuilder();
        char[] chs = new char[1024];
        int len =0;
        while((len = r1.read(chs))!=-1){
            //将读取的数据放入缓冲区中
            sb.append(new String(chs,0,len));
        }
        while((len = r2.read(chs))!=-1){
            //将读取的数据放入缓冲区中
            sb.append(new String(chs,0,len));
        }
        Writer w = new FileWriter("d:\\work\\abc\\3.txt");
        w.write(sb.toString());
        r1.close();
        r2.close();
        w.close();
    }
}

3.从类似的文件中的读取信息,然后按照年龄进行排序后将排序后的内容按照格式写回文件中
代码实现

public class Test {
    public static void main(String[] args) throws IOException {
        Reader r = new FileReader("d:\\work\\abc\\1.txt");
        StringBuilder sb = new StringBuilder();
        char[] chs = new char[1024];
        int len = 0;
        while ((len = r.read(chs))!=-1){
            //将数据添加到缓冲区中
            sb.append(new String(chs,0,len));
        }
        r.close();
//        System.out.println(sb.toString());
        //切割为数组
        String[] arr = sb.toString().split("-");
        //对数组排序
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                String age1 = o1.split(",")[1];
                String age2 = o2.split(",")[1];
                return Integer.parseInt(age1)-Integer.parseInt(age2);
            }
        });
//        System.out.println(Arrays.toString(arr));
        Writer w = new FileWriter("d:\\work\\abc\\1.txt");
        //遍历数组将元素 写回
        for (int i = 0; i < arr.length; i++) {
            w.write(arr[i]);
            //如果不是最后一个索引 拼接一个"-"
            if(i!=arr.length-1){
                w.write("-"); //dalang,8-tangyang,18-liuyan,38-jinlian,138
            }
        }
        w.close();
    }
}

4.编写一个程序将一个文件夹下的所有.java文件复制到另一个文件夹下,并将后缀改为.jad(单级目录);
代码实现:

public class Test {
    public static void main(String[] args) throws IOException {
        File srcDir = new File("d:\\copy");
        File destDir = new File("d:\\work\\abc");
        File[] fileArr = srcDir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if (pathname.isDirectory()){
                    return  false;
                }
                return pathname.getName().toLowerCase().endsWith(".java");
            }
        });
        for (File srcFile : fileArr) {
            String fileName = srcFile.getName();
            //将文件名截取出来   0索引开始 最后一个.结束
            String newFileName = fileName.substring(0, fileName.lastIndexOf(".") )+".jad";
          //  System.out.println(newFileName);
            //确定数据目的
            File destFile = new File(destDir,newFileName);
            //文件复制
            copyFile(srcFile,destFile);
        }
    }
    public static void copyFile(File src,File dest) throws IOException {
        //创建字节输入缓冲流对象
        InputStream in = new BufferedInputStream(new FileInputStream(src));
        //创建字节输出缓冲流对象
        OutputStream out = new BufferedOutputStream(new FileOutputStream(dest));
        //循环读写
        byte[] bytes = new byte[1024*10*10];
        int len = 0;
        while((len = in.read(bytes))!=-1){
            out.write(bytes,0,len);
        }
        //关闭资源
        out.close();
        in.close();
    }
}

5.定义一个方法可以将一个视频文件进行文件拆分 拆分到当前文件夹下的part目录中,定义一个方法可以将拆分的part目录中的文件 合并成视频文件. 拆分大小自己指定 我指定的是 byte[1024*100]
代码实现:

public class Test {
    public static void main(String[] args) throws IOException {

        //文件拆分
        File file=new File("d:\\work\\abc\\1.flv");
        SplitFile(file);

//        //文件合并
//        File dir = new File("d:\\work\\abc\\part");
//        mergeFile(dir);

    }
    //传入要切割的文件
    private static void SplitFile(File file) throws IOException {
        File parentFile = file.getParentFile();
        File destDir = new File(parentFile,"part");
        //健壮性判断,如果不存在,创建多级目录
        if (!destDir.exists()) {
            destDir.mkdirs();
        }
        //用读取流关联源文件
        FileInputStream fis = new FileInputStream(file);
        //创建缓冲区,指定每一块文件的大小
        byte[] bytes = new byte[1024 * 100];
        int len = 0;
        //计数器,用来记录碎块数
        int count = 0;
        //循环一次 写到一个文件中 大小为 byte数组的大小
        while ((len = fis.read(bytes)) != -1) {
            //每次需要创建一个新的输出流
            OutputStream out = new FileOutputStream(new File(destDir, (++count) + ".part"));//实例化输出流,并将目的文件传给构造函数,每个块名称不同
            out.write(bytes, 0, len);//写入
            out.close();//每次写入完毕,关闭流
        }
        fis.close();
        //将视频名称和  切割的份数写到配置文件中
        Properties p = new Properties();
        //将被切割文件的信息保存到pro集合中。
        p.setProperty("count", count + "");
        p.setProperty("name", file.getName());
        Writer w = new FileWriter(new File(destDir, "my.properties"));
        //使用store方法存储到硬盘中
        p.store(w, "");
        w.close();
    }
    //合并文件
    private static void mergeFile(File dir) throws IOException {
        //获取当前文件夹下的properties文件
        File[] fileArr = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().toLowerCase().endsWith(".properties");
            }
        });
        if(fileArr.length!=1){
            throw new RuntimeException("文件格式不符合规定");
        }
        //读取配置文件中的信息
        File file  = fileArr[0];
        Properties p = new Properties();
        Reader r = new FileReader(file);
        p.load(r);
        String fileName = p.getProperty("name");
        String count = p.getProperty("count");
        //获取所有.part文件
        File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().toLowerCase().endsWith(".part");
            }
        });
        //定义一个集合 用来 存储输入流
        List<InputStream> list = new ArrayList<>();
        for(int i = 1 ;i<=Integer.parseInt(count);i++){
            //获取所有part文件
            File srcFile = new File(dir,i+".part");
            //创建对应的 输入流对象 放入到list集合中
            list.add(new FileInputStream(srcFile));
        }
        //创建字节输出流对象
        File parentFile = dir.getParentFile();
        //确定目标文件
        File destFile = new File(parentFile,fileName);
        OutputStream out = new FileOutputStream(destFile);
        //创建byte数组  和 分块时byte数组大小一致
        byte[] bytes = new byte[1024*100];
        //循环list集合 获取到每个输入流对象  每个输入流读一次  让输出流写数据
        for(InputStream in : list){
            int length = in.read(bytes);
            out.write(bytes, 0, length);
            in.close();
        }
        out.close();
    }
}

今日总结:😁
明日计划:💪

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值