1GB=1024M
1M=1024KB
1KB=1024B
java.io.File类:可以描述文件或目录
  构造函数:
    File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
  常用方法:
    long getTotalSpace():分区的大小,以字节为单位;
    file.getFreeSpace();获取分区中未分配的字节数。 ,以字节为单位
    getPath():返回此对象表示的文件的相对路径名
    String getAbsolutePath( ):返回此对象表示的文件的绝对路径名

public class TestFile {
    public static void main(String[] args) {
        File file = new File("C:");
        long totalSize = file.getTotalSpace();// 获取分区总大小,以字节为单位
        long freeSize = file.getFreeSpace();// 获取分区中未分配的字节数。 ,以字节为单位
        long usedSize = file.getUsableSpace();// 
        System.out.println("C盘总大小:"+(double)totalSize/1024/1024/1024+"GB");
        System.out.println("C盘可用空间:"+(double)freeSize/1024/1024/1024+"GB");
        System.out.println("C盘 已用空间:"+(double)usedSize/1024/1024/1024+"GB");
        File file2 = new File("C:\\KFSoft\\KFDialClient");
        if(file2.exists()){
            String path = file2.getPath();
            String path2 = file2.getAbsolutePath();
            System.out.println(path);
            System.out.println(path2);
        }
    }
}
编写一个程序,实现展现特定的文件夹及其子文件(夹)。(使用递归来做)
public class TestFile2 {
    public static void main(String[] args) {
        //编写一个程序,实现展现特定的文件夹及其子文件(夹)。(使用递归来做)
//        File file = new File("D:/test");
//        getFile(file);
        
    }
    public static void getFile(File file){
        //判断file是否为空,防止空指针异常
        if(file!=null){
            File[] fs = file.listFiles();//获取该文件下的所有子文件或目录
            for (File f : fs) {
                System.out.println(f.getAbsolutePath());
                if(f.isDirectory()){//判断是否为目录
                    getFile(f);//递归调用
                }
            }
        }
        
    }
    
    
}

Java流的分类:
  1.按方向分为输入流和输出流(相对于计算机的内存来说,而不是相对于目标或源来说)
    输入流: InputStream/Reader
    输出流:OutputStream/Writer
  2.按读写单位分为字节流(8位)和字符串流(16位)
    字节流(字节输入流:InputStream和字节输出流OutputStream)
    字符流(字符输入流:Reader和字符输出流Writer)
  3.按功能分节点流和处理流
    节点流:可以直接从数据源或目的地读写数据
    处理流:(包装流):不直接连接到数据源或目的地,是其他流进行封装。目的主要是简化操作和提高性能。


InputStream/OutputStream都是抽象类,不能实例化。
java.io.FileInputStream类继承了java.io.InputStream
  常用的构造方法:
    FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream
    其中有一个检查异常需要捕获:FileNotFoundException
  常用方法:
    read():从此输入流中读取一个数据字节。 如果已到达文件末尾,则返回 -1 ,其中有一个检查异常需要捕获:IOException
    close():其中有一个检查异常需要捕获:IOException
  利用FileInputStream读取中文文本时出现乱码?
    原因:中文汉字占用1个字符(2个字节),FileInputStream每次读取1个字节,利用字符输入流解决

public class TestFileInputStream {
    //读取D:/aa.txt的文件内容
    public static void main(String[] args) {
        FileInputStream fis=null;
        try {
            fis = new FileInputStream("D:/aa.txt");
            int len;
            //read():从输入流读取一个字节,如果已到达文件末尾,则返回 -1
            while((len=fis.read())!=-1){
                char c=(char)len;
                System.out.print(c);
            }
//            fis.close(); //关闭流应该放在try...catch..finally中的finally内,可以确保流被关闭
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                //关闭流:捕获IOException
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


字符串的构造函数
  String(byte[] bytes)通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
  String(byte[] bytes, int offset, int length)通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。
  构造函数:
    FileInputStream(File file)
  常用方法:
    read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。

public class TestFileInputStream2 {
    public static void main(String[] args) {
        File file = new File("D:/aa.txt");
        FileInputStream fis=null;
        try {
            //1.创建FileInputStream对象:将文件转换成文件字节输入流
            fis=new FileInputStream(file);//建立"管道"
            byte[] bs = new byte[1024];//缓冲区
            //2.使用read方法读取内容
            int len = fis.read(bs);//从此输入流中将最多 b.length 个字节的数据读入一个 byte数组中
//            for (byte b : bs) {
//                System.out.print((char)b);
//            }
//            String str = new String(bs);
            String str = new String(bs,0,len);
            System.out.println(str);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
        
    }
}

 

FileOutputStream类继承了OutputStream(抽象类)
  构造函数:
    FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。
    FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。
    FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。。
    FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流
  注意:
    1.FileOutputStream(File file)或FileOutputStream(String name)构造函数时 ,写入文件内容时会发生覆盖
    2.FileOutputStream(File file,boolean append)或FileOutputStream(File file, boolean append)时,
     当append为true,会追加内容
    3.FileOutputStream写入文件内容,如果文件不存在,将自动创建。
  常用的方法:
    write(byte[] b) 将 b.length 个字节从指定 byte 数组写入此文件输出流中。
    write(int b) 将指定字节写入此文件输出流
    write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
  close() 关闭流

public class TestFileOutStream {
    public static void main(String[] args) {
        File file = new File("D:/cc.txt");
        FileOutputStream fos=null;
        try {
            //如果文件不存在,创建文件
//            if(!file.exists()){
//                file.createNewFile();//创建D:/bb.txt
//            }
            //创建FileOutputStream对象
//            fos = new FileOutputStream(file);
            fos = new FileOutputStream(file,true);//true:是否追加
//            fos.write('s');
//            fos.write('x');
//            fos.write('t');
//            String str="zzsxt,is very good!";
//            byte[] bs = str.getBytes();//将字符串转换为字节的数组
//            fos.write(bs);
            String str2="zzsxt,is very good!";
            byte[] bs2 = str2.getBytes();//将字符串转换为字节的数组
//            fos.write(bs2);
            fos.write(bs2,0,bs2.length);
            System.out.println("写入完毕!");
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
        
    }
}

 

文件复制:
  将D:/bb.txt文件复制到F:/bb.txt中
  步骤:
    1.使用文件输入流读取D:/bb.txt
    2.使用文件输出流写入到F:/bb.txt

public class FileCopy {
    public static void main(String[] args) {
        File source=new File("D:/bb.txt");//数据源
        File target=new File("F:/bb.txt");//目的地
        FileInputStream fis=null;
        FileOutputStream fos=null;
        try {
            //1.读取文件
            //创建字节文件输入流(读文件)和输出流(写内容)
            fis = new FileInputStream(source);
            fos = new FileOutputStream(target);
            int len;
            //使用循环读取文件内容
            while((len=fis.read())!=-1){
                //将读取文件内容写入目标文件中
                fos.write(len);
            }
            System.out.println("文件复制完成!");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                //关闭流
                fis.close();
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
        
    }
}

 

需求:将D盘下的"TreeSet.png"复制到当前项目下

public class FileCopy2 {
    public static void main(String[] args) {
        File source  = new File("D:/TreeSet.png");
//        File target  = new File("F:/workspaces/ioDemo/TreeSet.png");
        File target  = new File("TreeSet.png");//相对路径(当前项目的路径)
        FileInputStream fis=null;
        FileOutputStream fos=null;
        try {
            fis = new FileInputStream(source);
            fos = new FileOutputStream(target);
//            //通过输入流读取图片信息 
            byte[] bs = new byte[1024];
            int len;
            while((len=fis.read(bs))!=-1){
                fos.write(bs,0,len);
            }
//            int len;
//            while((len=fis.read())!=-1){
//                fos.write(len);
//            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                fis.close();
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    }
}