知识点

File流,字节流 基础,练习
  1. 利用File构造器,new 一个文件目录file
    1)在其中创建多个文件和目录,测试自己学过的File类的方法
    2)手动编写方法,实现删除file中指定文件的操作
//利用File构造器,new 一个文件目录file
     File file1 = new File("E:\\itcast\\test.word");
     File file2 = new File("E:\\itcast\\test.pdf");
     File file3 = new File("E:\\itcast\\test.pdf");
     File file4 = new File("E:\\itcast\\test\\testOne");
     File file5 = new File("E:\\CSDN博客");
     //1)在其中创建多个文件和目录,测试自己学过的File类的方法
     file1.createNewFile();
     file2.createNewFile();
     file3.createNewFile();
     file1.delete();
     file4.mkdirs();
     System.out.println(file4.isDirectory());
     System.out.println(file4.isFile());
     //返回文件里的文件名数组
     String[] list = file5.list();
     for (String s : list){
         System.out.println(s);
     }
     System.out.println();
     //返回文件里的文件对象数组
     File[] files = file5.listFiles();
     for (File file : files){
         System.out.println(file.getName());
     }
     System.out.println(file2.exists());
     System.out.println("--------------");
     System.out.println(file4.getAbsolutePath());
     System.out.println(file4.getPath());
  1. 判断指定目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
public class Work_two {
    public static void main(String[] args) {
        //通过File类的构造方法生成E:\ 目录的File对象
        File file = new File("E:\\itcast");
        //获取文件名的数组
        String[] list = file.list();
        //循环遍历每一个文件名
        for (String fileName : list){
            //判断该文件是目录还是文件
            if (fileName.contains(".")){
                //在文件名得到 . 的索引
                int indexOf = fileName.lastIndexOf(".");
                //截取.索引后的内容 也就是后缀名
                String substring = fileName.substring(indexOf);
                if (substring.equals(".jpg")){
                    System.out.println(fileName);
                }
            }
        }
    }
}

3. 遍历指定目录所有文件名称,包括子文件目录中的文件(注意这句话,经典递归方法,不知道思路的直接问)。

public class Work_three {
    public static void main(String[] args) {
        //①根据给定的路径创建一个File对象
        File file = new File("E:\\itcast");
        getAllFileName(file);


    }
    //②定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象
    public static void getAllFileName(File file){
        //③获取给定的File目录下所有的文件或者目录的File数组
        File[] listFiles = file.listFiles();
            //④遍历该File数组,得到每一个File对象
            for (File f : listFiles){
                // ⑤判断该File对象是否是目录;是:递归调用 ;   不是:获取文件名输出在控制台
                if (f.isDirectory()){
                    getAllFileName(f);
                }else{
                    System.out.println("file:"+f.getName());
                }
            }
    }
}
  1. 创建一个与a.txt文件同目录下的另外一个文件b.txt
public class Work_four {
    public static void main(String[] args) throws IOException {
        File file1 = new File("E:\\itcast\\test\\a.txt");
        file1.createNewFile();
        File file2 = new File("E:\\itcast\\test\\b.txt");
        file2.createNewFile();
    }
}
填空:下列程序将从file1.dat文件中读取全部数据,然后写到file2.dat文件中。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileStreamInOut {
	public static void main(String[] args) {
		try {
			File inFile = new File("____file1.dat_____");
			File outFile = new File("_____file2.dat____");
			FileInputStream fis = new FileInputStream(___"file1.dat"______);
			FileOutputStream fos = new FileOutputStream(____"file2.dat"_____);
			int c;
			while ((c = fis.read()) != -1) {
				fos.write(c);
			}
			__fis___.close();
			___fos__.close();
		} catch (FileNotFoundException e) {
			System.out.println("FileStreamsTest:" + e);
		} catch (IOException e) {
			System.out.println("FileStreamTest" + e);java
		}
	}
}

5.操作D盘下的my.txt文件

  1. 判断my.txt文件是否存在
  2. 若存在则删除;若不存在则创建
public class Work_five {
    public static void main(String[] args) throws IOException {
        File file =new File("D:\\my.txt");
        //1)   判断my.txt文件是否存在
        if (file.exists()){
            file.delete();
        }else{
            file.createNewFile();
        }
        
    }
}

6.File类的作用是什么?它是一种流吗?

File类的作用是实现java与文件数据交互的类,不是流;

7.使用File类删除某个文件夹(例如D盘下的temp文件夹)下的所有文件和文件夹:
1) 判断temp文件夹下的文件类型,如果是文件则直接删除
2) 如果是文件夹则获取该文件夹下的子文件和文件夹
3) 使用递归的方式删除所有temp文件夹下的文件和文件夹(可参考3题)

public class Work_seven {
    public static void main(String[] args) {
        File file = new File("D:\\temp");
        delFile(file);
    }

    /**
     * 递归删除该文件夹下的所有文件 和 该文件夹
     * @param file
     */
    public static void delFile(File file) {

        File[] listFiles = file.listFiles();
        for (File f : listFiles) {
            if (f.isDirectory()) {
                 //2)  如果是文件夹则获取该文件夹下的子文件和文件夹
                delFile(f);
            } else {
                //1)   判断temp文件夹下的文件类型,如果是文件则直接删除
                f.delete();
            }
        }
        //3)   使用递归的方式删除所有temp文件夹下的文件和文件夹(可参考3题)
        file.delete();
    }
}

8.分别使用节点流:FileInputStream、FileOutputStream实现文本文件/图片/视频文件的复制。并比较二者在数据复制方面的效率

public class Work_eight {
    public static void main(String[] args) throws IOException {
        //数据源
        FileInputStream fis1 = new FileInputStream("E:\\itcast\\mn.jpg");
        FileInputStream fis2 = new FileInputStream("E:\\itcast\\字节流复制图片.avi");
        FileInputStream fis3 = new FileInputStream("E:\\itcast\\窗里窗外.txt");
        //目的地
        FileOutputStream fos1 = new FileOutputStream("D:\\目的地\\mn.jpg");
        FileOutputStream fos2 = new FileOutputStream("D:\\目的地\\字节流复制图片.avi");
        FileOutputStream fos3 = new FileOutputStream("D:\\目的地\\窗里窗外.txt");

        //复制数据
        copyData(fis1,fos1);
        copyData(fis2,fos2);
        copyData(fis3,fos3);

        //释放资源
        close(fis1,fos1);
        close(fis2,fos2);
        close(fis3,fos3);

    }
    public static void close(FileInputStream fis,FileOutputStream fos) throws IOException {
        //释放资源
        fos.close();
        fis.close();
    }
    public static void copyData(FileInputStream fis,FileOutputStream fos) throws IOException {
        //复制数据
        int by;
        while((by = fis.read()) != -1){
            fos.write(by);
        }
    }
}
//视频复制得非常慢

9.获取自定义文本上每个字符出现的次数
提示:遍历文本的每一个字符;字符及出现的次数保存在Map中;将Map中数据写入文件

public class Work_nine {
    public static void main(String[] args) throws IOException {
        Map<Character,Integer> map = new HashMap<>();
        String s = "aaabbbcabcdcccdd";
        Set<Character> keySet = map.keySet();
        //获取自定义文本上每个字符出现的次数
        for (int i = 0;i < s.length();i++){
            //获取key
            char key = s.charAt(i);
            //根据字母键找到记录个数的value值
            Integer value = map.get(key);
            //如果value为空则代表该字母第一次出现,将他的值设置为1
            if (value == null){
                map.put(key,1);
            }else {
                //不为空则出现过,在原来的值上加一
                value++;
                map.put(key,value);
            }
        }

        //目的地
        FileOutputStream fos = new FileOutputStream("E:\\Work8_0_9\\mapData.txt");
        //提示:遍历文本的每一个字符;字符及出现的次数保存在Map中;将Map中数据写入文件
        for (Character key:keySet){
            //数据源
            Integer value = map.get(key);
            //将value转换为String
            String s1 = String.valueOf(value);
            //复制数据
            fos.write(key);
            fos.write(s1.getBytes);

        }

        //释放资源
        fos.close();
    }
}

10.编写一个应用程序,将用户从键盘输入的10个整数存入文件,再顺序读出。

public class Work_ten {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        //目的目
        FileOutputStream fos = new FileOutputStream("E:\\Work8_0_10\\CopyTenIntNumber.txt");
        //将用户从键盘输入的10个整数存入文件,
        System.out.println("请输入10个以逗号分隔的整数:");
        int[] intArr = new int[10];
        String s = scanner.nextLine();
        String[] split = s.split(",");
        //字符串数组转整形数组
        //int[] array = Arrays.asList(strings).stream().mapToInt(Integer::parseInt).toArray();
        int[] array = Arrays.asList(split).stream().mapToInt(Integer::parseInt).toArray();
        Arrays.sort(array);
        for (int i = 0; i < intArr.length; i++) {
            String i1 = String.valueOf(array[i]);
            //复制数据
            fos.write(i1.getBytes());
            fos.write("  ".getBytes());
        }
        System.out.println("成功!");
        //释放资源
        fos.close();

        //再顺序读出
        FileInputStream fis = new FileInputStream("E:\\Work8_0_10\\CopyTenIntNumber.txt");
        int by;
        while ((by = fis.read()) != -1){
            System.out.print((char) by);

        }
        //10,14,41,52,36,78,88,42,56,95
    }
}

11.编写程序向文本文件中写入自己的信息,

  • 格式为:姓名:XXX 性别:X 年龄:XX 班级:XXX,
  • 将该信息读出后显示的屏幕上后把文件删除。
  • (思考,为什么读取中文出现乱码?应该用什么流来读取最好??可以往后面的知识看看)
public class Work_eleven {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        //编写程序向文本文件中写入自己的信息,
        File file = new File("E:\\Work8_0_11\\myselfData.txt");
        FileOutputStream fos = new FileOutputStream("E:\\Work8_0_11\\myselfData.txt");
        FileInputStream fis = new FileInputStream("E:\\Work8_0_11\\myselfData.txt");
        System.out.println("请输入自己的姓名:");
        String name = scanner.next();
        name = "姓名:"+name;
        System.out.println("请输入自己的年龄:");
        String age = scanner.next();
        age = "年龄:"+age;
        System.out.println("请输入自己的性别:");
        String sex = scanner.next();
        sex = "性别:"+sex;
        System.out.println("请输入自己的班级:");
        String garde = scanner.next();
        garde = "班级:"+garde;
        //格式为:姓名:XXX 性别:X 年龄:XX 班级:XXX,
        fos.write(name.getBytes());
        fos.write("  ".getBytes());
        fos.write(age.getBytes());
        fos.write("  ".getBytes());
        fos.write(sex.getBytes());
        fos.write("  ".getBytes());
        fos.write(garde.getBytes());
        fos.write("  ".getBytes());
        System.out.println("成功!");
        //将该信息读出后显示的屏幕上后把文件删除。
        //将数据按一组一组数组读
        byte[] bytes = new byte[2048];
        //一个数组读取的实际字符个数
        int len;
       while ((len=fis.read(bytes)) != -1){
           System.out.print(new String(bytes,0,len));
        }
       //释放资源
        fos.close();
        fis.close();
        //必须在释放后删除!
        file.delete();
    }
}