阿飞飞飞

学而时习之

导航

流的概念以及一点固定模式的用法

什么是流???

流本身就是一个抽象的概念,当程序需要从某个数据源读入数据的时候,就会开启一个数据流,数据源可以是文件、内存或网络......流就是一组有序的数据序列

流的分类有哪些???

1)按照流的方向

  输入流:由外->内

  输出流:由内->外

2)按照处理数据单位

  字符流:char[]

  字节流:byte[]

3)按照流的功能

  节点流:直接面向数据源的流(基础流)

  处理流:扩展了节点流在某些特定领域的操作

 

如何利用文件流创建目录和文件???

        File dir = new File("D:\\xxxxx\\xxx");
        dir.mkdir();
        File file = new File("D:\\xxxxx\\xxx\\xx.txt");
        file.createNewFile();        

创建目录的方法有两种,dir.mkdir()指代的是创建最后一级目录,而dir.mkdirs()指代的是创建所有不存在的目录

若需要利用文件流对是否存在目录和文件或者是否是目录和文件的问题进行判断,可以利用下方代码

boolean exists = dir/file.exists();目录/文件是否存在

boolean isDir/isFile = dir.isDirectory()/file.isFile();是否是目录/文件

 

下面给出一个实例递归某一文件夹下所有包含的目录和文件

  //递归遍历所有目录,子目录,文件
    public static void showDir(String path,String sep){
        File what = new File(path);
        if (!what.exists()){    
            return;
        }
        if (what.isFile()){  //如果是文件
            System.out.println(sep+"file:\t"+what.getName());   //输出文件
            return;
        }
        sep+="-";
        System.out.println(sep+"dir:\t"+path);  
        for (File file : what.listFiles()) {
            showDir(file.getPath(),sep);
        }
    }
    public static void main(String[] args) {
        showDir("D:\\Java\\study\\collection","");
    }

从代码来看,递归的过程就是不断判断是否为目录/文件的过程,并且需要对是否为文件或是否存在进行判断,

因为what不是文件就是目录,若是文件则输出,若是目录则在输出后在进行遍历,判断其子类是否为目录或文件。

 

下面还有一些关于文件其他特性的判断方法(不常用)

    String parentDir = file.getParent() //获取父目录字符串
    File parent = file.getParentFile() //获取父目录对象
    String fileName = file.getName() //获取文件名称
    long realSize = file.length() //获取文件实际字节数
    long freeSpace  = file.getFreeSpace()//获取文件可存剩余字节数
    long lastMod = file.lastModified() //获取文件上一次修改的长整时间    

 

 文件流分为字符文件流和字节文件流,而字符文件流,又可以分为三种:

  字符文件输入流;

  字符文件输出流;

  字符缓存读写流.

 

字符流

  以下便是输入流,读取的条件是file存在,文件流都必须以xxx.close()结尾

        FileReader fr = new FileReader(file);
        char[] cs = new char[1];
        int len = -1;
        while (-1!=(len = fr.read(cs))){    //len = -1 :表示读到了文件末尾,否则为实际读取的字符数
            System.out.print(new String(cs,0,len));
        }
        fr.close();   

 

 

  对于输出流,有两种情况,一种为覆盖模式,即将原文件内容替换,另一种为追加模式,对于追加模式需要判断append是false 还是true 默认为false

        FileWriter fw = new FileWriter(file); 
        fw.write("henry");          //覆盖模式
        fw.close();

        FileWriter ff = new FileWriter(file,true); 
        ff.write("lina");          //追加模式
        ff.close();    

 

  字符缓存读写流分为两种:读  写

        BufferedReader br = new BufferedReader(new     
        FileReader(file));//输入   读
        String line = null;
        while (null!=(line = br.readLine())){
            System.out.println(line);
        }
        br.close();     //关闭流 并释放资源
        
       BufferedWriter bw = new BufferedWriter(new             
       FileWriter(file,true));   //输出    写
       bw.newLine();
       bw.write("fffs");
       bw.newLine();
       bw.write("eeeee");
       bw.close();     //关闭流 并释放资源                

 

 

  字节流

  当需要将某一目录中的文件输出到另一个目录中,可以采取字节流边读边写的模式

    //边读边写
        FileInputStream fis = new FileInputStream(src);     //read
        FileOutputStream fos = new FileOutputStream(dest);   //write

        final int M8 = 8*1024*1024;
        final int M64 = 8*64;

        BufferedInputStream bis = new BufferedInputStream( fis,M64);
        BufferedOutputStream bos = new BufferedOutputStream( fos,M64);

        byte[] bs = new byte[M8];
        int len = -1;

        while (-1 != (len = bis.read(bs))){
            bos.write(bs,0,len);
            Thread.sleep(1000);
        }
        bos.close();  //先开的后关
        bis.close();

 

 

 

posted on 2020-06-13 20:05  阿飞飞飞  阅读(423)  评论(0编辑  收藏  举报