java基础-IO流进阶

文章目录

  • 一、File类
    • 1.1File概述
    • 1.2File类的构造函数
    • 1.3File类创建和删除功能
    • 1.4File类的判断功能
    • 1.5File类的获取功能和修改名字功能
    • 1.6File类的其它获取功能
    • 1.7获取文件夹下的所有.java文件
    • 1.8删除文件夹
  • 二、字符流与字节流
    • 2.1概述
    • 2.2复制文本文件
      • 2.2.3利用字符流复制文本
      • 2.2.2利用字节流复制文本文件
    • 2.3复制图片
      • 2.3.1字符流
      • 2.3.2字节流

一、File类

1.1File概述

File是文件目录路径名的抽象表示形式。
即,Java中把文件或者目录(文件夹)都封装成File对象。
也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可
那么我们就要研究研究File这个类中都有那些功能可以操作文件或者文件夹呢

1.2File类的构造函数

  • File(String pathname) 将一个字符串路径封装成File对象
  • File(String parent,String child)传入一个父级路径和子级路径
  • File(File parent,String child)传入一个File类型的父级路径和子级路径
	public static void main(String[] args) {
		//1.直接写文件路径或者文件名
		//  java.io.File.File(String pathname)
		File file1 = new File("demoIO.txt");
		//2.java.io.File.File(String parent, String child)
		//  路径拼接
		File file2 = new File("D:/", "a.txt");
		//3.java.io.File.File(File parent, String child)
		//  文件对象和路径/文件拼接
		File file3 = new File(file2, "b.txt");
	}

1.3File类创建和删除功能

  • boolean createNewFile():指定路径不存在该文件时时创建文件,返回true,否则返回false
  • boolean mkdir():当指定的单级文件夹不存在时创建文件夹并返回true,否则返回false
  • boolean mkdirs():当指定的多级文件夹某一级文件夹不存在时,创建多级文件夹并返回true,否则返回false
  • boolean delete():删除文件或者删除单级文件夹

相对路径:以盘符开头
绝对路径:以参照物开头,不能以盘符开头

public static void main(String[] args) throws IOException {
    // 1.创建文件
    File f1 = new File("demoIO.txt");
    System.out.println(f1.createNewFile()); // true
	
    // 2.创建文件夹
    File f2 = new File("demoIO.txt"); // false,已经存在该对象
    System.out.println(f1.mkdir());
    File f3 = new File("a.txt");
    System.out.println(f3.mkdir()); // true 目录名为a.txt
    // 3.创建多级文件目录
    File f4 = new File("a/b/c");
    System.out.println(f4.mkdirs()); // true
    // 4.删除文件/文件夹
    System.out.println(f1.delete()); // true
    System.out.println(f2.delete()); // false
    System.out.println(f3.delete()); // true
    System.out.println(f4.delete()); // true a/b目录仍存在
    System.out.println(new File("a").delete()); //false 只能删除空目录
}

1.4File类的判断功能

  • boolean exists():判断指定路径的文件或文件夹是否存在
  • boolean isAbsolute():判断当前路路径是否是绝对路径
  • boolean isDirectory():判断当前路径是否为文件夹
  • boolean isFile():判断当前路径是否是一个文件
  • boolean isHidden():判断当前路径是否是隐藏文件
public static void main(String[] args) throws IOException {
    File f1 = new File("a.txt");
    File f2 = new File("a");

    // 1.判断文件、文件夹是否存在
    System.out.println(f1.exists());
    System.out.println(f2.exists());

    // 2.判断是否问绝对路径
    System.out.println(f1.isAbsolute());
    // 3.判断是否有隐藏属性
    System.out.println(f2.isHidden());

    // 4.判断是否是一个文件,若不存在也返回false
    System.out.println(f1.isFile());
    System.out.println(f2.isFile());
    // 5.判断是否否是一个文件夹,若不存在也返回false
    System.out.println(f1.isDirectory());
    System.out.println(f2.isDirectory());
}

1.5File类的获取功能和修改名字功能

  • File getAbsoluteFile():获取文件的绝对路径,返回File对象
  • String getAbsolutePath():获取文件的绝对路径,返回路径的字符串
  • File getParentFile():获取当前路径的父级路径,以字File对象形式返回该父级路径
  • String getParent():获取当前路径的父级路径,以字符串形式返回该父级路径

  • String getName():获取文件或文件夹的名称
  • String getPath():获取File对象中封装的路径
  • long lastModified():以毫秒值返回最后修改时间
  • long length():返回文件的字节数
  • boolean renameTo(File dest): 将当前File对象所指向的路径 修改为 指定File所指向的路径
public static void main(String[] args) throws IOException {
    File f1 = new File("a.txt");
    File f2 = new File("a/b");
    // 1.获取文件、文件夹的绝对路径
    System.out.println(f1.getAbsolutePath()); // E:\eclipse\myIO\a.txt
    System.out.println(f2.getAbsolutePath()); // E:\eclipse\myIO\a\b
    System.out.println(new File("a/b/c/d/e").getAbsoluteFile()); 
    		//E:\eclipse\myIO\a\b\c\d\e;调用了file的toString()
    // 2.获取文件、文件夹 构造时的参数路径
    System.out.println(f1.getPath()); // a.txt
    System.out.println(f2.getPath()); // a\b
    System.out.println(new File(f2, "c").getPath()); // a\b\c
    // 3.获取构造时文件的上一层目录
    System.out.println(f1.getParent()); // null
    System.out.println(f2.getParent()); // a
    System.out.println(new File(f1, "d").getParent()); // a.txt
    System.out.println(new File(f2, "d").getParent()); // a\b
    System.out.println(new File("a/b/c/c").getParent()); // a\b\c
    // 4.获取文件夹/文件名称
    System.out.println(new File("a/b/c").getName()); // c
    System.out.println(new File("a.txt").getName()); // a.txt
    // 5.获取文件最后的修改时间
    System.out.println(new File("a.txt").lastModified()); // 0 文件不存在
    // 6.文件重命名
    System.out.println(f1.renameTo(f2)); //false 不能将文件命名为文件夹
    System.out.println(f2.mkdirs()); // false
    System.out.println(f2.renameTo(new File("b.txt"))); // true
    // 7.获取文件大小 bytes  文件夹为0
    f1.createNewFile();
    System.out.println(f1.length());
}

1.6File类的其它获取功能

  • String[] list():以字符串数组的形式返回当前路径下所有的文件和文件夹的名称
  • File[] listFiles():以File对象的形式返回当前路径下所有的文件和文件夹的名称
  • static File[] listRoots():获取计算机中所有的盘符
public static void main(String[] args) throws IOException {
    // 1.String[] java.io.File.list()
    // 获取该文件夹下的所有内容的名称,包括隐藏的文件夹和文件
    System.out.println(new File("").getAbsolutePath()); // E:\eclipse\myIO
    System.out.println(new File("").list()); // null 为何?
    System.out.println(new File(".").getAbsolutePath()); // E:\eclipse\myIO\.
    for (String value: new File(".").list()) {
        System.out.println(value);
        // 输出 E:\eclipse\myIO下的所有内容
    }
    System.out.println(new File("/").getAbsolutePath()); // E:\
    System.out.println(new File("\\").getAbsolutePath()); // E:\
    // 2.File[] java.io.File.listFiles()获取的是文件对象
    for (File file: new File(".").listFiles()) {
        System.out.println(file);
    }
    // 指向文件时,返回null
    System.out.println(new File("a.txt").listFiles());
    // 3.File[] java.io.File.listRoots()返回本机的所有盘符
    for (File value: new File("").listRoots()) {
        System.out.println(value); // C:\
    }
}

1.7获取文件夹下的所有.java文件

1.判断file对象为文件夹
2.获取文件夹下所有newFile对象
3.判断newFile对象为文件,判断文件类型为.java
4.判断newFile对象为文件夹,重复2、3、4步骤

	public static void getJavaFile(File file) {
		if (file.isDirectory()) {
			for (File f : file.listFiles()) {
				if (f.isFile()) {
					if (f.getName().endsWith(".java")) {
						System.out.println(f.getName());
					}
				} else {
					getJavaFile(f);
				}
			}
		}
	}

1.8删除文件夹

1.判断file对象为文件夹
2.获取文件夹下所有newFlie对象
3.判断newFile对象为文件,直接删除
4.判断newFile对象为文件夹,重复1,2,3步骤
5.删除该file对象

public static void deleteFile(File file) {
    if (file.isDirectory()) {
        for (File newFile: file.listFiles()) {
            if (newFile.isFile()) {
                System.out.println(newFile.getName());
                newFile.delete();
            } else {
                deleteFile(newFile);
            }
        }
    }

    System.out.println(file.getName());
    file.delete();
}

二、字符流与字节流

2.1概述

IO流分类:

  • 流向
    • 输入流 读取数据 FileReader Reader
    • 输出流 写出数据 FileWriter Writer
  • 数据类型
    • 字节流:可以处理音频、图片
      字节输入流 读取数据 InputStream
      字节输出流 写出数据 OutputStream
    • 字符流
      字符输入流 读取数据 Reader
      字符输出流 写出数据 Writer

2.2复制文本文件

一次读一个字符或者一个字节,返回类型都是Int
一次读一个数组,分别将char[]和byte[]数组作为参数

2.2.3利用字符流复制文本

public static void main(String[] args) throws IOException {
    //创建字符输入流对象
    FileReader fr = new FileReader("IODemo.java");
    //创建字符输出流对象
    FileWriter fw = new FileWriter("d:\\IODemo.java");

    //一次读写一个字符
    /*int ch;
		while((ch = fr.read()) != -1) {
			fw.write(ch);
			fw.flush();
		}*/

    //一次读写一个字符数组
    int len; //用于存储读到的字符个数
    char[] chs = new char[1024];
    while ((len = fr.read(chs)) != -1) {
        fw.write(chs, 0, len);
        fw.flush();
    }

    //释放资源
    fw.close();
    fr.close();
}

2.2.2利用字节流复制文本文件

// 打印文件夹下的所有.java文件
public static void main(String[] args) throws IOException {
    // 1.创建输入流对象
    FileInputStream fis = new FileInputStream("a.txt");
    // 创建输出流对象
    FileOutputStream fos = new FileOutputStream("b.txt");
    // 2.读写数据
    // 2.1一次读写一个byte
    // int in;//读到的内容
    // while ((in = fis.read()) != -1) {
    // System.out.println(in);
    // fos.write(in);
    // }
    // 2,2一次读写一个数组
    int len;
    byte[] by = new byte[1024]; // 一个汉字占3个字节
    while ((len = fis.read(by)) != -1) {
        fos.write(by, 0, len);
        // fos.flush(); 字节流不需要刷新
    }
    // 3.释放资源
     fos.close();
     fis.close();
}

2.3复制图片

2.3.1字符流

复制以后图片大小增加了,打开失败

public static void main(String[] args) throws IOException {
    // 1.创建输入流对象
    FileReader fis = new FileReader("1.png");
    // 创建输出流对象
    FileWriter fos = new FileWriter("2.png");
    // 2.读写数据
    // 2.1一次读写一个byte
    // int in;//读到的内容
    // while ((in = fis.read()) != -1) {
    // System.out.println(in);
    // fos.write(in);
    // }
    // 2,2一次读写一个数组
    int len;
    char[] by = new char[1024]; // 一个汉字占3个字节
    while ((len = fis.read(by)) != -1) {
        fos.write(by, 0, len);
        // fos.flush(); 字节流不需要刷新
    }
    // 3.释放资源
     fos.close();
     fis.close();
}

2.3.2字节流

可以复制,图片从上往下复制;
复制后文件大小不变

public static void main(String[] args) throws IOException {
    // 1.创建输入流对象
    FileInputStream fis = new FileInputStream("1.png");
    // 创建输出流对象
    FileOutputStream fos = new FileOutputStream("2.png");
    // 2.读写数据
    // 2.1一次读写一个byte
    // int in;//读到的内容
    // while ((in = fis.read()) != -1) {
    // System.out.println(in);
    // fos.write(in);
    // }
    // 2,2一次读写一个数组
    int len;
    byte[] by = new byte[1024]; // 一个汉字占3个字节
    while ((len = fis.read(by)) != -1) {
        fos.write(by, 0, len);
        // fos.flush(); 字节流不需要刷新
    }
    // 3.释放资源
    fos.close();
    fis.close();

}

你可能感兴趣的:(java基础)