Java——io流

一、IO基本分类

  1、IO基本分类:(input and output stream)

    1.字节流:byte[];没有缓冲区;

      抽象基类:InputStreamOutputStream

    2.字符流char[];有缓冲区;//读取文档使用,可以防止中文乱码;

      抽象基类:ReaderWriter

  2、资源释放:jdk1.8新特性;

     try(){}小括号内写需要释放资源的代码,会自动释放;

      //无需把close()写在finally代码块中;

二、File:

  1、File类:用于文件管理;位于java.io包;

  2、构造方法:File(String pathname)//File file=new File("c:/")

  3、常用方法:

    1.权限控制:

      (1boolean canExecute();查看是否有执行权;

      (2boolean canRead();查看是否有读取权;

      (3boolean canWrite();查看是否有读取权;

public class Test {
    public static void main(String[] args) {
        File file = new File("e:/test");
        System.out.println(file.canExecute());
        System.out.println(file.canRead());
        System.out.println(file.canWrite());
    }
}

    2.文件方法:

      创建(1boolean         createNewFile();创建一个文件;

        //返回值:如果创建成功返回true,如果已经存在创建不成功返回false,不会覆盖原有文件;

        //文件必须包含文件名和扩展名;

public class Test {
    public static void main(String[] args) throws IOException {
        File file = new File("e:/test.txt");
        boolean newFile1 = file.createNewFile();
        boolean newFile2 = file.createNewFile();
        System.out.println(newFile1);  //true
        System.out.println(newFile2);  //false
    }
}

      判断(2boolean exists();判断目录或文件是否存在;

      判断(3boolean isFile();判断是否是标准文件;

      判断(4boolean isHidden();判断是否是隐藏文件;

      删除(5boolean delete();删除目录或文件;//返回值;删除成功返回true,失败返回false

      删除(6void deleteOnExit();关闭jvm时删除文件;

public class Test {
    public static void main(String[] args) throws IOException {
        File file = new File("e:/test.txt");
        System.out.println(file.exists());  //false
        file.createNewFile();
        System.out.println(file.exists());  //true
        System.out.println(file.isFile());  //true
        System.out.println(file.isHidden());  //false
        file.exists();
    }
}

    3.目录方法:

      查询(1String getName();返回目录或文件名;

      查询(2String getParent();返回文件的目录,不包含文件本身的名称;无可返回的值,返回null

      查询(3String getPath();返回文件的目录,包含文件本身的名称;无可返回的值,返回null

      查询(4String toString();返回文件的目录,包含文件本身的名称;

public class Test {
    public static void main(String[] args) throws IOException {
        File file = new File("e:/test/test.txt");
        System.out.println(file.getParent());  //e:\test
        System.out.println(file.getPath());  //e:\test\test.txt
        System.out.println(file.toString());  //e:\test\test.txt
    }
}

      判断(5boolean isDirectory();判断是否是一个目录;

      获取(6File[] listFiles();返回目录下所有的目录和文件的完整路径名File数组;

      获取(7String[] list();返回目录下所有的目录和文件的本身名称File数组;

public class Test {
    public static void main(String[] args) throws IOException {
        File file = new File("e:/logs");
        File[] files = file.listFiles();
        System.out.println(Arrays.toString(files));  
        //[e:\logs\dev, e:\logs\prod, e:\logs\sprintboot_2019-0722.log, e:\logs\test]
        String[] list = file.list();
        System.out.println(Arrays.toString(list));
        //[dev, prod, sprintboot_2019-0722.log, test]
    }
}

      获取(8String[] list(FilenameFilter filter);返回

        //传入一个匿名内部类;new FilenameFilter(){重写accpet方法}

public class Test {
    public static void main(String[] args) throws IOException {
        File file = new File("e:/logs");
        String[] list = file.list(new FilenameFilter(){

            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".log");
            }
        });
        System.out.println(Arrays.toString(list));
    }
}

      创建(9boolean mkdir();根据指定的File对象创建一个目录,不支持级联构建;

      创建(10boolean mkdirs();根据指定的File对象创建一个目录,支持级联构建;

Reader所有字符流输入流的基类;不可创建对象;

  1、抽象方法:

    (1)int read();一次读取流中的一个字符,且会自动往下;

    (2)int read(char[] arr);将字符读入数组;

      //返回值为读出的个数,且重复调用会向后读(每次重复调用指针回0),如果没有读出返回-1;

public class Test {
    public static void main(String[] args) throws IOException {
        File file = new File("e:/test.txt");
        FileReader fileReader = new FileReader(file);
        char[] arr = new char[1024];
        int num = 0;
        while ((num = fileReader.read(arr))!=-1){
            System.out.println(new String(arr,0,num));
        }
        fileReader.close();
    }
}

    (2).close();关闭此流,不会刷新

  2、FileReader:Read的操作文件子类;

    构造方法:FileReader(String fileName);

    //FileReader fw=new FileReader("demo.txt");

  3、BufferedReaderRreader的子类,用于提升效率;

    (1)构造方法:BufferedReader(Reader in[, int sz]);

    (2)特有方法:String readLine();读取一行,不返回回车符;读取到空行时,返回null

  4、LineNumberReader:BufferedWriter的子类;

    (1)构造方法:LineNumberReader(Reader in);

    (2)特有方法:

      1void setLineNumber(int lineNumber);设置当前行号;

      2int getLineNumber();获得当前行号;

四、Writer所有字符流输出流的基类;不可创建对象;

  1、抽象方法:

  (1).writer(str);写入数据到该流缓冲中;

  (2).fulsh();刷新该流缓冲;

  (3).close();关闭此流,并刷新

  2、FileWriter:Writer的操作文件子类;

    构造方法:FileWriter(String fileName, boolean append);参数二表示是否续写,true续写;

    注释:\r\n:换行

    //FileWriter fw=new FileWriter("demo.txt");

    //会创建该文件到指定目录下,如果已经存在会被覆盖

  3、BufferedWriterWriter的子类,用于提升效率;

    (1)构造方法:BufferedWriter(Writer out[, int sz]);//sz指定大小;

    (2)特有方法:newLine();换行;

   4、示例和异常处理:

public class Test {
    public static void main(String[] args) {
        FileWriter fw = null;
        try {
            //创建FileWriter对象
            fw = new FileWriter("e:/test.txt");
            //写入数据;
            fw.write("123");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭流;
            try {
                if (fw != null) {    //判断是否为空,为空则无需关闭;
                    fw.close();    //在finally中关闭流;防止try中产生异常无法关闭;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

五、Reader/Writer文件复制:

public class Test {
    public static void main(String[] args) throws Exception {

        FileReader fr = new FileReader("e:/test.txt");
        FileWriter fw = new FileWriter("e:/test2.txt");

        char[] arr = new char[1024];
        int len = 0;
        while ((len = fr.read(arr)) != -1) {
            fw.write(arr, 0, len);
        }
        fw.flush();
        fw.close();
        fr.close();
    }
}

六、InputStream所有字节流输入流的基类;不可创建对象;

1、抽象方法:

(1)void close();关闭;

(2)int read();读取一个字节;返回0-255的字节值;如无字节返回-1;

(3)int read(byte[] b);把数据流读入到名为b的byte类型的数组中;

  //可多次读取,依次向后,每次返回读取的个数,如无数据可读返回-1;

(4)int read(byte[],int off,int len);把数据流中最多len个字节读入到byte数组的指定开始位置;

  //参数:off:数组存储的开始位置;len:长度;

(5int available();返回总字节数;//数据太大时不建议使用,会导致内存溢出;

2、FileIputStreamInputStream的核心实现类;

  构造方法:

  (1)FileInputStream(File file);构建一个FileInputStream对象指向一个File对象;

  (2)FileInputStream(String name);构建一个FileInputStream对象指向一个name表示的路径对应的资源;

3、BufferedInputStreamInputStream的子类,用于提升效率;

七、OutputStream所有字节流输入流的基类;不可创建对象;

1、抽象方法:

(1)void close();关闭,且刷新流;

(2)void flush();刷新了流;

(3)void write(int b);将一个字节写入;

(4)void write(byte[] b);把一个字节数组写入;

(5)void write(byte[] b,int off,int len);参数:off数组开始位置;len传入的长度;

2、FileOutputStreamOutputStream的核心实现类;

  构造方法:

  (1FileOutputStream(File file[, boolean append]);

  (2FileOutputStream(String name[, boolean append]);

    //会创建该文件到指定目录下,如果已经存在会被覆盖

   文件覆盖问题解决方案:

  (1)每次生成一个新的文件;//用时间命名文件,getTime(); 

  (2)在原文件的基础上追加内容;//构造函数

3、BufferedOutputStreamOutputStream的子类,用于提升效率;

4、代码示例,文件复制:

  //try(){}catch{}在()中声明流可以自动关闭;1.8jdk

public class Test {
    public static void main(String[] args) throws Exception {
        try (FileInputStream fis = new FileInputStream("D:/Users/Desktop/123.avi");
             FileOutputStream fos = new FileOutputStream("D:/Users/Desktop/demo.avi");) {
            byte[] arr = new byte[1024];
            int len = 0;
            while ((len = fis.read(arr)) != -1) {
                fos.write(arr, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

 

posted @ 2019-07-27 20:37  开拖拉机的拉风少年  阅读(228)  评论(0编辑  收藏  举报