常用的文件操作:
目录的操作和文件删除:
mkdir创建一级目录:D:\demo
mkdirs创建多级目录:D:\demo\a\b\c
delete删除空目录或文件
    public class Directory{
        public static void main(String[] args) {
            //判断 d:\\news1.txt是否存在,如果存在就删除
            public void m1(){
                String filePath = "d:\\news1.txt";
                File file = new File(filePath);
                if (file.exists()) {
                    if (file.delete()) {
                        System.out.print("删除成功!!");
                    }
                }
                else{
                    System.out.print("该文件不存在~~");
                }
            }
            //判断 D:\\demo02是否存在,存在就删除,否则提示不存在
            //在Java编程中,目录也被当成文件
            public void m2(){
                String filePath = "D:\\demo02";
                File file = new File(filePath);
                if (file.exists()) {
                    if (file.delete()) {
                        System.out.print("删除成功!!");
                    }
                }
                else{
                    System.out.print("该目录不存在~~");
                }
            }
            //判断 D:\\demo\\a\\b\\c 目录是否存在,如果存在就提示已经存在,否则就创建
            public void m3(){
                String directoryPath = "D:\\demo\\a\\b\\c";
                File file = new File(directoryPath);
                if (file.exists()) {
                    System.out.print("该目录已存在~~");
                }else{
                    if(file.mkdirs()){
                        System.out.print(directoryPath + "创建成功");
                    }else{
                        System.out.print("创建失败~~");
                    }
                }
            }
        }
    }   
IO流原理及流的分类:
JavaIO流原理:
- I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理数据传输。如读/写文件,网络通讯等
 - Java程序中,对于数据的输入/输出操作以”流(stream)”的方式进行
 - java.io包下提供了各种”流”类和接口,用以获取不同种类的数据,并通过方法输入或输出数据
 - 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(中)
 - 输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中
 
流的分类:
按操作数据单位不同分为:字节流(8bit)对二进制文件友好,字符流(按字符)对文本文件友好
按操作流的流向不同分为:输入流,输出流
按流的角色的不同分为:节点流,处理流/包装流
| (抽象基类) | 字节流 | 字符流 | 
|---|---|---|
| 输入流 | InputStream | Reader | 
| 输出流 | OutputStream | Writer | 
- Java的IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的
 - 由这4个类派生出来的子类名称都是以其父名作为子类名后缀
 
InputStream:字节输入流
InputStream抽象类是所有类字节输入流的超类
InputStream常用的子类:
- FileInputStream:文件输入流
 - BufferedInputStream:缓冲字节输入流
 - ObjectInputStream:对象字节输入流
 
例1
使用FileInputStream读取hello.txt文件,并将文件内容显示到控制台
read()方法单个字节读取,效率较低
    public void readFile01(){
        int readData = 0;
        String filePath = "e:\\hello.txt";
        FileInputStream fileInputStream = null;
        //read()方法单个字节读取,效率较低
        try{
            //创建FileInputStream对象,用于读取文件
            fileInputStream = new FileInputStream(filePath);
            //从该输入流读取一个字节的数据。如果没有输入可用,此方法将阻止
            //如果返回-1,表示读取完毕
            while((readData = fileInputStream.read()) != -1){
                System.out.print((char)readData);   //转成char显示
                //如果有汉字,会出现乱码
            }
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            try{
                fileInputStream.close();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
使用read(byte[] b)方法读取文件,提高效率
    public void readFile02(){
        //字节数组
        byte[] buf = new byte[8];//一次读取8个字节
        int readLen = 0;
        String filePath = "e:\\hello.txt";
        FileInputStream fileInputStream = null;
        //read()方法单个字节读取,效率较低
        try{
            //创建FileInputStream对象,用于读取文件
            fileInputStream = new FileInputStream(filePath);
            //从该输入流读取最多b.length字节的数据。此方法将阻塞,直到某些输入可用
            //如果返回-1,表示读取完毕
            //如果读取正常,返回实际读取的字节数
            while((readLen = fileInputStream.read(buf)) != -1){
                System.out.print(new String(buf,0,readLen));    //转成char显示
                //如果有汉字,会出现乱码
            }
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            try{
                fileInputStream.close();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
例2
使用FileOutputStream将数据写到文件中,如果该文件不存在,则创建该文件
    public void writerFile(){
        //创建FileOutputStream对象
        String filePath = "e:\\a.txt";
        FileOutputStream fileOutputStream = null;
        try{
            /*
                1、new FileOutputStream(filePath)创建方式,当写入内容时,会覆盖原来的内容
                2、new FileOutputStream(filePath,true)创建方式,当写入内容时,是追加到文件后面
            */
            //得到FileOutputStream对象
            fileOutputStream = new FileOutputStream(filePath);
            //写入一个字节
            fileOutputStream.writer("H");
            //写入字符串
            String str = "hello,world!"
            //str.getBytes() 可以把 字符串->字节数组
            fileOutputStream.writer(str.getBytes());
            //或者witle(byte[] b,int off, int len)
        }catch(IOException e){
            e.printStackTrace
        }finally{
            try{
                fileInputStream.close();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
完成文件拷贝:将e:\Koala.jpg 拷贝到c:\
    /*
        1、创建文件的输入流,将文件读入到程序
        2、创建文件的输出流,将读取到的文件数据,写入到指定的文件
    */
    String srcFilePath = "e\\Koala.jpg"
    String destFilePath = "e\\Koala2.jpg"
    FileInputStream fileInputStream = null;
    FileOutputStream fileOutputStream = null;
    //try-catch
    fileInputStream = new FileInputStream(srcFilePath);
    fileOutputStream = new FileOutputStream(destFilePath);
    //定义一个字节数组,提高读取效果
    byte[] buf = new byte[1024];
    int readLen = 0;
    while ((readLen = fileInputStream.read(buf)) != -1 ) {
        //读取到后,就写入到文件,通过fileOutputStream
        //即是一边读一边写
        fileOutputStream.writer(buf,0,readLen);
    }
    System.out.print("拷贝成功~~");
    //try-catch
    finally{
        //try-catch
        //关闭输入流和输出流
        if(fileInputStream != null){
            fileInputStream.close();
        }
        if (fileOutputStream != null) {
            fileOutputStream.close();
        }
        //try-catch
    }
FileReader 和 FileWriter:
FileReader 和 FileWriter 是字符流,即按照字符来操作IO
FileReader相关方法:
- new FileReader(File/String)
 - read:每次读单个字符,返回该字符,如果到文件末尾返回-1
 - read(char[]):批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回-1
 
相关API:
- new String(char[]):将char[]转换成String
 - new String(char[],off,len):将char[]的指定部分转换成String
 
FileWriter常用方法:
- new FileWriter(File/String):覆盖模式,相当于流的指针在首段
 - new FileWriter(File/String,true):追加模式,相当于流的指针在尾端
 - write(int):写入单个字符
 - write(char[]):写入指定数组
 - write(char[],off,len):写入指定数组的指定部分
 - write(string):写入整个字符串
 - write(string,off,len):写入字符串的指定部分
 
相关API:
String类:toCharArray:将String转换成char[]
例1使用FileReader从story.txt读取内容,并显示
按单个字符读取文件
    String filePath = "e:\\stroy.txt";
    FileReader fileReader = null;
    char data = 0;
    //1、创建FileReader对象
    //try-carch
    fileReader = new FileReader(filePath);
    //循环读取 使用read方法,单个字符读取
    while ((data = fileReader.read()) != -1) {
        System.out.print(char() data);
    }
    //try-catch
    finally{
        //try-catch
        if (fileReader != null) {
            fileReader.close();
        }
        //try-catch
    }
使用字符数组读取文件
    String filePath = "e:\\stroy.txt";
    FileReader fileReader = null;
    int readLen = 0;
    char[] buf = new char[8]; 
    //1、创建FileReader对象
    //try-carch
    fileReader = new FileReader(filePath);
    //循环读取 使用read(buf)方法,返回的是实际读取到的字符数
    //如果返回-1,说明到文件结束
    while ((readLen = fileReader.read(buf)) != -1) {
        System.out.print(new String(buf), 0, readLen);
    }
    //try-catch
    finally{
        //try-catch
        if (fileReader != null) {
            fileReader.close();
        }
        //try-catch
    }
例2使用FileWriter将”风雨之后,定见彩虹”写入到note.txt文件中
    public static void main(String[] args) {
        String filePath = "e:\\note.txt";
        //创建FileWriter对象
        FileWriter fileWriter = null;
        char[] chars = {'a','b','c'};
        //try-catch
        fileWriter = new FileWriter(filePath);
        /*      
            write(int):写入单个字符
            write(char[]):写入指定数组
            write(char[],off,len):写入指定数组的指定部分
            write(string):写入整个字符串
            write(string,off,len):写入字符串的指定部分
        */
        //write(int):写入单个字符
        fileWriter.write("H");
        //write(char[]):写入指定数组
        fileWriter.write(chars);
        //write(char[],off,len):写入指定数组的指定部分
        fileWriter.write("ABCDEF".toCharArray(), 0, 3);
        //write(string):写入整个字符串
        fileWriter.write(" 你好北京~~");
        //write(string,off,len):写入字符串的指定部分
        fileWriter.write("上海天津", 0, 2); //写入 上海 ,天津没写进去
        fileWriter.write("风雨之后,定见彩虹");
        //在数据量大的情况下,可以使用循环操作
        //try-catch
        finally{
            //对于FileWriter,一定要关闭流,或者flush才能真正的把数据写入到文件  
            //try-catch
            //fileWriter.flush();
            //关闭文件流,等价于flush() + 关闭
            fileWriter.close();
            //try-catch
        }
        System.out.print("程序结束~~");
    }