一、字符流知识点总结

Java sftp 远程复制 java实现复制文件_数据源

 

 二、两道经典练习题

1、复制单级文件夹

单级文件夹:该文件夹中不再包含有子文件夹,仅包含各类文件。

package io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
 * 案例:复制单级文件夹(一个目录下没有子目录,只有文件)
 * 需求:把"D:\\itcase"这个文件夹复制到模块目录下
 * 思路:
 * 1、创建数据源目录File对象,路径是D:\\itcase
 * 2、获取数据源目录File对象的名称(itcase)
 * 3、创建目的地目录File对象,路径名是模块名+itcase组成(src\\itcase)
 * 4、判断目的地目录对应的File是否存在,若不存在,就创建
 * 5、获取数据源目录下所有文件的File数组
 * 6、遍历File数组,得到每一个File对象,该File对象,就是数据源文件
 * 7、获取数据源文件File对象的名称
 * 8、创建目的地文件File对象,路径名是目的地目录+mn.jpg组成(src\\itcase\\mn.jpg)
 * 9、复制文件
 * 由于文件不仅仅是文本文件,还有图片,所以采用字节流复制文件
 */

public class IoDemo1 {
    public static void main(String[] args) throws IOException{
        //1、创建数据源目录File对象,路径是D:\\itcase
        File srcFolder=new File("D:\\itcase");//这里的File对象是一个目录
        
        //2、获取数据源目录File对象的名称(itcase)
        String srcFolderName=srcFolder.getName();//保证程序的可维护性
        
        //3、创建目的地目录File对象,路径名是模块名+itcase组成(src\\itcase)
        //File copyFile=new File("src//"+name);//是错误的
        File destFoler=new File("src",srcFolderName);
        
        //4、判断目的地目录对应的File是否存在,若不存在,就创建
        if(!destFoler.exists()) {//若存在,则直接覆盖掉里面的文件
            destFoler.mkdir();
        }
        //5、获取数据源目录下所有文件的File数组
        File[] listFiles=srcFolder.listFiles();//得到的是文件,而不是目录(因为是单级目录)
        
        //6、遍历File数组,得到每一个File对象,该File对象,就是数据源文件
        for(File srcFile:listFiles) {
            
            //7、获取数据源文件File对象的名称
            String srcFileName=srcFile.getName();
            
            //创建目的地文件File对象,路径名是目的地目录+mn.jpg组成(src\\itcase\\mn.jpg)
            //得到的是文件,不是目录
            File destFile=new File(destFoler,srcFileName);
            
            //9、复制文件
            //只能把文件复制到文件中去,不能直接把文件复制给一个文件夹
            copy(srcFile,destFile);
        }
    }

    private static void copy(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,0,len);
        }
        bos.close();
        bis.close();
    }
}

2、复制多级文件夹

多级文件夹:该文件夹下可能包含有子文件夹,也可能包含有文件;它的子文件夹下还可能有文件夹及文件。

本次程序采用递归的方式,来遍历文件夹。

package io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
 * 案例:复制多级文件夹(一个目录下不仅有子目录,还有文件)
 * 需求:把"D:\\itcase"这个多级文件夹复制到F盘下
 * 思路:
 * 1、创建数据源目录File对象,路径是D:\\itcase
 * 2、创建目的地File对象,路径是C:\\
 * 3、写方法实现文件夹的复制,参数为数据源File对象和目的地File对象
 * 4、判断数据源File是否是目录:
 * 5、是:
 * A:在目的地下创建和数据源File名称相同的目录
 * B:获取数据源File所有文件或者目录的File数组
 * C:遍历该File数组,得到每一个File对象
 * D:把该File对象作为数据源对象,递归调用复制文件夹的方法
 * 不是:说明是文件,由于文件不仅仅是文本文件,还有图片,所以采用字节流复制文件
 */

public class IoDemo1 {
    public static void main(String[] args) throws IOException{
        //1、创建数据源目录File对象,路径是D:\\itcase
        //FileNotFoundException
        File rawFolder=new File("D:\\itcase");//封装源文件路径
        
        //2、创建目的地File对象,路径是C:\\
        File destFolder=new File("C:\\");//封装目的地路径
        
        //3、写方法实现文件夹的复制,参数为数据源File对象和目的地File对象
        //copyFile(rawFolder,destFolder);
        copyFolder(rawFolder,destFolder);//调用复制文件夹的方法
    }

    private static void copyFolder(File rawFolder, File destFolder) throws IOException {
        // 4、判断数据源File是否是目录:
        if(rawFolder.isDirectory()) {//如果源文件是目录
            //A:在目的地下创建和数据源File名称相同的目录
            String rawFolderName=rawFolder.getName();//先创建一个"E:\\itcase"
            File newFolder=new File(destFolder,rawFolderName);//只是封装了路径,没有创建目录
            if(!newFolder.exists()) {
                newFolder.mkdir();
            }
            //B:获取数据源File所有文件或者目录的File数组
            File[] arrFile=rawFolder.listFiles();//得到源文件路径中的所有File对象
            //C:遍历该File数组,得到每一个File对象
            for(File file:arrFile) {
                //D:把该File对象作为数据源对象,递归调用复制文件夹的方法
                copyFolder(file,newFolder);//无论这些File对象是不是文件夹,都调用复制文件夹的方法
            }
        }
        else {
            File newFile=new File(destFolder,rawFolder.getName());
            copyFile(rawFolder,newFile);
        }
        
    }

    //字节缓冲流复制文件
    private static void copyFile(File rawFolder, File newFile) throws IOException {
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(newFile));
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream(rawFolder));
        byte[] bys=new byte[1024];
        int len;
        while((len=bis.read())!=-1) {
            bos.write(bys,0,len);
        }
        bos.close();
        bis.close();
    }
        
}

三、结合具体的类,来使用字符流

学生类:

package io;

public class Student implements Comparable<Student>{
//public class Student {    
    private String name;
    private int mathScore;
    private int chineseScore;
    private int englishScore;
    
    public Student() {
        super();
    }

    public Student(String name, int mathScore, int chineseScore,int englishScore) {
        super();
        this.name = name;
        this.mathScore = mathScore;
        this.chineseScore = chineseScore;
        this.englishScore=englishScore;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @return the mathScore
     */
    public int getMathScore() {
        return mathScore;
    }

    /**
     * @return the chineseScore
     */
    public int getChineseScore() {
        return chineseScore;
    }
    
    public int getenglishScore() {
        return englishScore;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @param mathScore the mathScore to set
     */
    public void setMathScore(int mathScore) {
        this.mathScore = mathScore;
    }

    /**
     * @param chineseScore the chineseScore to set
     */
    public void setChineseScore(int chineseScore) {
        this.chineseScore = chineseScore;
    }
    
    public void setenglishScore(int englishScore) {
        this.englishScore = englishScore;
    }
    
    public int getSumScore() {
        return this.chineseScore+this.mathScore+this.englishScore;
    }

    @Override
    public String toString() {
        return name+","+mathScore+","+chineseScore+","+englishScore+","+this.getSumScore();
    }
    
    public int compareTo(Student other) {
        //int diff=(Integer.compare(this.getSumScore(), other.getSumScore()))*(-1);
        int diff=other.getSumScore()-this.getSumScore();
        int diff1=diff==0?this.getChineseScore()-other.getChineseScore():diff;
        int diff2=diff1==0?this.getMathScore()-other.getMathScore():diff1;
        int diff3=diff2==0?this.getName().compareTo(other.getName()):diff2;
        return diff3;
    }
}

主类:

package io;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/*
 * 案例:集合到文件(数据排序改进版)
 * 需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)
 * 要求按照成绩总分从高到低写入文本文件
 * 格式:姓名,语文成绩,数学成绩,英语成绩
 * 举例:林青霞,98,99,100
 */
import java.util.Scanner;
import java.util.*;

public class IoDemo1 {
    public static void main(String[] args) throws IOException{
        //通过比较器排序进行排序
        TreeSet<Student>trs=new TreeSet<Student>();
//        TreeSet<Student>trs=new TreeSet<Student>(new Comparator<Student>() {
//
//            @Override
//            public int compare(Student s1, Student s2) {
//                //主要条件
//                int num=s2.getSumScore()-s1.getSumScore();
//                //次要条件
//                int num1=num==0?s1.getChineseScore()-s2.getChineseScore():num;
//                int num2=num1==0?s1.getMathScore()-s2.getMathScore():num1;
//                int num3=num2==0?s1.getName().compareTo(s2.getName()):num2;
//                return num3;
//            }
//            
//        });
        Scanner in=new Scanner(System.in);
        for(int i=1;i<6;i++) {
            System.out.println("请输入第"+i+"个学生的成绩:(格式为:林青霞,98,99,100)");
            String line=in.nextLine();
            String[] str=line.split(",");
            Student s=new Student();
            s.setName(str[0]);
            s.setChineseScore(Integer.parseInt(str[1]));
            s.setMathScore(Integer.parseInt(str[2]));
            s.setenglishScore(Integer.parseInt(str[3]));
            trs.add(s);
        }
        in.close();
        
        BufferedWriter bfw=new BufferedWriter(new FileWriter("D:\\troye.txt"));
        String s;
        for(Student stu:trs) {
            s=stu.toString();
            bfw.write(s);
            bfw.newLine();
            bfw.flush();
        }
        bfw.close();
    }
}

四、总结

今天可能是学java以来效率最高的一天,各种知识点掌握得也很快。别看每一次的练习都不难,但是还是很容易出现岔子。以前在集合排序这一块还是会纠结老半天,想不出来。今天学着学着突然顿悟了,发现不过就是那么回事。所以如果当下没有解决的技术问题,先放在一边,慢慢地在后续的学习中会找到答案的!