5/18笔记

集合到文件(数据排序改进版):

键盘录入三个学生信息(姓名,语文成绩,数学成绩,英语成绩)。要求按照成绩总分从高到低写入文本文件。

格式:姓名,语文成绩,数学成绩,英语成绩

思路:

  1. 定义学生类
  2. 创建TreeSet集合,定义比较器(难点)
  3. 键盘录入学生数据(难点,Scanner运用不熟练)
  4. 创建学生对象,将键盘录入的数据对应赋值给学生对象的成员变量
  5. 将学生对象添加到TreeSet集合
  6. 创建字符缓冲输出流对象
  7. 遍历集合,得到每一个学生对象
  8. 将学生对象的数据拼接成指定格式字符串
  9. 写出数据
        TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                //成绩总分从高到低
                int num = o2.getSum() - o1.getSum();
                //如果总成绩相同比较语文成绩
                int num2 = (num == 0) ? o2.getChinese() - o1.getChinese() : num;
                //如果总成绩和语文成绩相同比较数学成绩
                int num3 = (num2 == 0) ? o2.getMath() - o1.getMath() : num2;
                //如果总成绩,语文成绩和数学成绩都相同,比较英语成绩
                int num4 = (num3 == 0) ? o2.getEnglish() - o1.getEnglish() : num3;
                return num4;
            }
        });

        //键盘录入学生数据
        for (int i = 0; i < 5; i++) {
            Scanner sr = new Scanner(System.in);
            System.out.println("Please input the" + (i + 1) + "student's grades");
            System.out.println("name:");
            String name = sr.nextLine();
            System.out.println("chinese grade:");
            int chinese = sr.nextInt();
            System.out.println("math grade:");
            int math = sr.nextInt();
            System.out.println("english grade:");
            int english = sr.nextInt();

            Student s = new Student(name, chinese, math, english);
            //把学生对象添加到treeset集合
            ts.add(s);
        }
        //创建字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\IdeaProject\\untitledDemo\\test.txt"));
        //遍历集合,得到每一个学生对象
        for (Student s : ts){
            //拼接要写入到文件的字符串
            StringBuilder sb = new StringBuilder();
            sb.append(s.getName()).append(",").append(s.getChinese()).append(",").append(s.getMath()).append(",").append(s.getEnglish());
            bw.write(sb.toString());
            bw.newLine();
        }
        bw.flush();
        bw.close();

复制单级文件夹:

将D盘下的itcast下的文件(里面没有文件夹)复制到D盘下IdeaProject里的untitledDemo里。

        //创建数据源目录
        File srcFolder = new File("D:\\itcast");
        //获取目录下的文件对象名称
        String srcFolderName = srcFolder.getName();
        //创建模块下的抽象路径
        File destFolder = new File("D:\\IdeaProject\\untitledDemo",srcFolderName);
        //判断此路径的文件是否存在,不存在,创建文件夹
        if (!destFolder.exists()){
            destFolder.mkdir();
        }

        File[] listFiles = srcFolder.listFiles();
        for (File srcFile:listFiles){
            String srcFileName = srcFile.getName();
            File destFile = new File(destFolder,srcFileName);
            copyFile(srcFile,destFile);
        }

    }

    private static void copyFile(File srcFile, File destFile) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
        byte[] bys = new byte[1024];
        int len;
        while ((len=bis.read(bys))!=-1){
            bos.write(bys);
        }
        bos.flush();
        bos.close();
        bis.close();
    }

复制多级文件夹

将D盘下的itcast下的文件(里面还有文件夹)复制到D盘下IdeaProject里的untitledDemo里。

  1. 创建数据源File对象:D:\\itcast
  2. 创建目的地File对象:D:\\itcast\\IdeaProject\\untitledDemo
  3. 写方法实现文件夹的复制,参数为数据源File对象和目的地File对象
  4. 判断数据源File是否为目录: 是的话,创建和数据源一样的File目录,获取数据源的File数组,遍历数组得到每一个File对象,并将这些File对象作为数据源File对象递归调用copyFolder方法. 不是的话,直接调用copyFile方法
    public static void main(String[] args) throws IOException {
        //创建数据源文件和目的地文件
        File srcFile = new File("D:\\itcast");
        File destFile = new File("D:\\IdeaProject\\untitledDemo");

        copyFolder(srcFile,destFile);

    }

    private static void copyFolder(File srcFile, File destFile) throws IOException {
        //判断srcFile是否为目录
         if (srcFile.isDirectory()){
             //获取目录名,并在目的地文件夹内创建相同的目录
             String srcFileName = srcFile.getName();
             File newFolder = new File(destFile,srcFileName);//newFolder:untitledDemo\\itcast
             if (!newFolder.exists()){
                 newFolder.mkdir();
             }
             //遍历srcFile里的所有File
             File[] files = srcFile.listFiles();
             for (File file:files){
                 copyFolder(file,newFolder); //javaDemo.txt,untitledDemo\\itcast
             }
         } else {
             //说明是文件,直接复制
             File newFile = new File(destFile, srcFile.getName());//untitledDemo\\itcast, javaDemo.txt
             copyFile(srcFile, newFile);//D:\\itcast\\javeDemo.txt, untitledDemo\\itcast\\javaDemo.txt
         }
    }

    private static void copyFile(File srcFile, File destFile) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
        byte[] bys = new byte[1024];
        int len;
        while ((len=bis.read(bys))!=-1){
            bos.write(bys);
        }
        bos.flush();
        bos.close();
        bis.close();
    }

复制文件的异常处理的三种方法:

前两种是重点

5/18笔记

标准输入流:

5/18笔记

之前的字符输入流中,FileReader是InputStreamReader的子类。他们俩的比较代码如下:

        //使用缓冲字符流读取文件
        BufferedReader br = new BufferedReader(new FileReader("D:\\IdeaProject\\untitledDemo\\text.txt"));
        //代码功能和上面的一样
        BufferedReader br2 = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\IdeaProject\\untitledDemo\\text.txt"),"utf-8"));

使用InputStreamReader读取键盘输入字符,一次只能读取一个字符

        InputStreamReader input = new InputStreamReader(System.in);
        //只能一次读取一个字符
        int read = input.read();
        System.out.println((char) read);

使用BfferedReader读取键盘输入,一次可以读取一行

       InputStreamReader input = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(input);
        //只能一次读取一个字符
        String s = br.readLine();
        System.out.println(s);

今日学习感悟:

今天从308看到312,四节。还算挺难的这几节,不要给自己加任务!!!量力而行!!

 

上一篇:shutil文件操作


下一篇:IO小练习--使用io流剪切文件夹