java IO流,文件

1. IO 流

1.1 根据流的流向分类

  1. Input 输入流
  2. Output 输出流

1.2 根据流操作的数据来分类

  1. 字符流: 操作字符
    只能操作普通文本文件
  2. 字节流:操作字节
    能操作一切文件

1.3 java中的四大流

  1. 字符输入流

    1. 父类:Reader
      1. FileReader
      2. BufferedReader
    2. 功能: 读取一个字符,读取一个字符数组
  2. 字符输出流

    1. 父类:Write
      1. FileWrite
      2. BufferedWrite
    2. 功能:写一个字符,写一个字符数组,字符串
  3. 字节输入流

    1. 父类:InputStream
      1. FileInputStream
      2. BufferedInputStream
    2. 功能:读取一个字节,读取一个字节数组
  4. 字节输出流

    1. 父类:OutputStream
      1. FileOutputStream
      2. BufferedOutputStream
    2. 功能:写一个字节,写一个字节数组
  5. 规律
    只要是输入流 此流方法名一定叫read
    只要是输出流 此流方法名一定叫write

java中的流命名规范;
功能+父类的名字

2 OutputStream

字节输出流的根类,是一个抽象类

  1. void close();
    关闭流

  2. void flush();
    刷新流

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

  4. void write(byte[] bs);
    写一个字节数组

  5. void write(byte[] bs, int startIndex, int lenght);
    写一个字节数组的一部分

2.1 构造

  1. FileOutPutStream(String filename)
    不可以续写
  2. FileOutPutStream(String filename,boolean flag)
    可以续写
  3. FileOutPutStream(File file,boolean flag)

2.2 使用

demo:

public void outputStreamdemo() throws IOException {
    //创建数据流
    FileOutputStream fileOutputStream = new FileOutputStream("2.txt",true);
    //写数据

    fileOutputStream.write("hello".getBytes());

    //关闭数据流
    fileOutputStream.close();
}

3 InputStream

字节输入流的根类,是一个抽象类

  1. void close();
    关闭流
  2. int read();
    读取一个字节,返回的是ASSIC码
  3. int read(byte[] bs);
    读取一个字节数组,读出的数据是传入的,返回实际读出的数量

3.1 构造

  1. FileInputStream

3.2 使用

demo:

    public void inputStreamDemo() throws IOException{
        FileInputStream fileInputStream = new FileInputStream("2.txt");

        //一个个读
        int b = 0;
        while ((b = fileInputStream.read()) != -1){
            System.out.print((char)b);
        }

        fileInputStream.close();
    }

    public void inputStreamDemo2() throws IOException{
        FileInputStream fileInputStream = new FileInputStream("2.txt");

        //一次读一个数组
        int tempLen = 0;
        byte[] bs = new byte[4];
        while ((tempLen=fileInputStream.read(bs))!=-1){
            String s = new String(bs,0,tempLen);
            System.out.print(s);
        }

        fileInputStream.close();
    }

复制文件

public class CopyFileDemo {
    public static void main(String[] args) throws IOException {
        String inputSrc = "C:\\Users\\81022\\Downloads\\copyFile\\原始文件\\无标题.png";
        String outputSrc = "C:\\Users\\81022\\Downloads\\copyFile\\目标文件夹\\test.png";
        //创建两个流
        FileInputStream fileInputStream = new FileInputStream(inputSrc);
        FileOutputStream fileOutputStream = new FileOutputStream(outputSrc,true);

        //复制
        //一次读一个字节  太慢
        /*int b = 0;
        while ((b=fileInputStream.read())!=-1){
            fileOutputStream.write(b);
        }*/

        byte[] bs = new byte[1024];
        int len = 0;
        while ((len=fileInputStream.read(bs))!=-1){
            fileOutputStream.write(bs,0,len);
        }


        //关流
        fileInputStream.close();
        fileOutputStream.close();

    }
}

4 缓冲流

相比没有换成功流,效率更高

4.2 BufferedOutputStream 缓冲输出流

  1. 创建
     BufferedOutputStream bufOutputStr = new BufferedOutputStream(new FileOutputStream(outSrc));
    
  2. 方法
        //写一个字节
        bufOutputStr.write(11);
        //写一个字节数组
        bufOutputStr.write("test".getBytes());
        //写一个字符串
        byte[] bs= new byte[10];
        bs = "你好!!!".getBytes();
        bufOutputStr.write(bs);
        bufOutputStr.write(bs,0,2);
    

4.1 BufferedInputStream 缓冲输入流

  1. 创建
     BufferedInputStream bufdInputStr = new BufferedInputStream(new FileInputStream(inSrc));
    
  2. 方法
        int n = 0;
        while ((n = bufdInputStr.read())!=-1){
            System.out.print((char)n);
        }
    
    
        //读一个字符串
        byte[] bs = new byte[10];
        int len = 0;
        String s;
        while ((len = bufdInputStr2.read(bs))!=-1){
            s= new String(bs,0,len);
            System.out.print(s);
        }
    

5 字符流

使用字节流读中文会出现乱码

5.1 FileReader

和字节流差不多

5.2 BufferedReader

和字节流差不多
多了一个 readLine();

5.3 FileWrite

和字节流差不多
多了写字符串的功能

5.4 BufferWrite

和字节流差不多
多一个newLine()

demo:

    @Test
    public void ReaderDemo1() throws IOException {
        FileReader fileReader = new FileReader(new File("fileTest.txt"));
        int n = 0;
        while ((n=fileReader.read())!=-1){
            System.out.print((char)n);
        }

        fileReader.close();
    }

    @Test
    public void ReaderDemo2() throws IOException {
        FileReader fileReader = new FileReader("fileTest.txt");

        int len = 0;
        char[] cr = new char[10];
        while ((len = fileReader.read(cr))!=-1){
            System.out.print(cr);
        }

        fileReader.close();
    }

    @Test
    public void RederDemo3() throws IOException{
        BufferedReader bfReader = new BufferedReader(new FileReader("fileTest.txt"));

        String s;
        while ((s = bfReader.readLine())!=null){
            System.out.println(s);
        }

        bfReader.close();
    }



    @Test
    public void RederDemo4() throws IOException{
        FileWriter fr = new FileWriter("fileTest.txt");
        fr.write("这里是测试写入");
        fr.close();
    }


    @Test
    public void RederDemo5() throws IOException{
        BufferedWriter br = new BufferedWriter(new FileWriter("fileTest.txt",true));

        br.newLine();
        br.write("sdfsfd");
        br.close();
    }

文件归类demo:

    import net.sf.json.JSONObject;
    
    import java.io.*;
    import java.util.Map;
    import java.util.Scanner;
    import java.util.Set;
    
    /**
     * @author chenPeng
     * @version 1.0.0
     * @ClassName MoveFile.java
     * @Description TODO
     * @createTime 2019年01月26日 15:41:00
     */
    public class MoveFile {
        static String src;
        static String toSrc;
        static Set<Map.Entry<String,String>> fenLei;
        static JSONObject json;
    
    
        public static void init() throws IOException{
            File directory = new File("");
            BufferedReader fileReader = new BufferedReader(new FileReader(directory.getAbsoluteFile()+"/config.json"));
            StringBuffer strBuf = new StringBuffer();
            String temp;
            while ((temp = fileReader.readLine())!=null){
                System.out.println(temp);
                strBuf.append(temp);
            }
    
            fileReader.close();
    
            json = JSONObject.fromObject(strBuf.toString());
            //获取连接
            JSONObject srcJson = json.getJSONObject("路径");
            src = (String) srcJson.get("原始路径");
            toSrc = (String) srcJson.get("目标路径");
    
            fenLei = json.getJSONObject("分类").entrySet();
        }
    
        /**
         * 入口
         * @Author chenpeng
         * @Description //TODO
         * @Date 16:24
         * @Param [args]
         * @return void
         **/
        public static void main(String[] args) throws IOException {
            init();
            File files = new File(src);
            getPath(files.listFiles());
    
            System.out.println("是否删除原文件!!!");
            System.out.println("1 为删除 否则按其他");
            Scanner scanner = new Scanner(System.in);
            String str = scanner.next();
            if ("1".equals(str)){
                System.out.println("正在删除...");
                removeFile(files.listFiles());
            }
    
        }
    
        /**
         * 删除文件
         * @Author chenpeng
         * @Description //TODO
         * @Date 22:20
         * @Param [files]
         * @return void
         **/
        public static void removeFile(File[] files) throws IOException{
            for (File file : files) {
                if (file.isFile()){
                    file.delete();
                }else{
                    if (!file.delete()){
                        removeFile(file.listFiles());
                        file.delete();
                    }
                }
            }
        }
    
        /**
         * 得到路径 分析是文件还是文件夹
         * @Author chenpeng
         * @Description //TODO
         * @Date 16:24
         * @Param [files]
         * @return void
         **/
        public static void getPath(File[] files) throws IOException {
            for (File file : files) {
                if (file.isFile()){
                    classification(file);
                }else{
                    copyDir(file.listFiles(),file.getName());
                }
            }
        }
    
    
        /**
         * 递归复制文件
         * @Author chenpeng
         * @Description //TODO
         * @Date 16:24
         * @Param [files]
         * @return void
         **/
        public static void copyDir(File[] files, String name) throws IOException {
            //如果不存在就先建立文件夹
            String gotoSrc = toSrc+"/文件夹/"+name;
            isHave(gotoSrc);
    
            //复制文件
            for (File file : files) {
                if (file.isFile()){
                    copy(file,gotoSrc);
                }else{
                    copyDir(file.listFiles(), name+"/"+file.getName());
                }
            }
        }
    
        /**
         * 复制文件
         * @Author chenpeng
         * @Description //TODO
         * @Date 16:25
         * @Param [file]
         * @return void
         **/
        public static void copy(File file,String src) throws IOException {
    
            System.out.println(file.getAbsolutePath());
            System.out.println("复制到");
            System.out.println(src);
            System.out.println("==============开始执行==============");
    
            BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));
            BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(src+file.getName()));
    
            byte[] bs = new byte[1024];
            int len = 0;
            while ((len = fis.read(bs))!=-1){
                fos.write(bs,0,len);
            }
    
            fos.close();
            fis.close();
    
            System.out.println("==============执行结束==============");
            System.out.println();
        }
    
        /**
         * 分发文件
         * @Author chenpeng
         * @Description //TODO
         * @Date 16:25
         * @Param [file]
         * @return void
         **/
        public static void classification(File file) throws IOException {
            String fileName = file.getName();
            String toUrl="";
    
            String[] fName = fileName.split("\\.");
            String endName = "."+fName[(fName.length-1)];
            System.out.println("=========================================================="+endName);
    
    
            for (Map.Entry<String, String> stringEntry : fenLei) {
                String strKye = stringEntry.getKey();
    
                JSONObject leiBie = json.getJSONObject("分类").getJSONObject(strKye);
                if (leiBie.containsValue(endName)){
                    toUrl = toSrc+"/"+strKye+"/";
                }
            }
    
    
            if ("".equals(toUrl)){
                toUrl = toSrc+"/其他文件/";
            }
            isHave(toUrl);
            copy(file,toUrl);
    
        }
    
        /**
         * 是否存在,不存在建立文件夹
         * @Author chenpeng
         * @Description //TODO
         * @Date 16:59
         * @Param [srcs]
         * @return void
         **/
        public static void isHave(String srcs){
            File gotoFile = new File(srcs);
            if (!gotoFile.exists()){
                gotoFile.mkdirs();
            }
        }
    
    
    }

配置文件

{
  "路径":{
    "原始路径":"C:\\Users\\81022\\Downloads",
    "目标路径":"F:\\普通文档\\归档"
  },
  "分类":{
    "文本": {
      "txt": ".txt",
      "docx": ".docx",
      "doc": ".doc",
      "xls": ".xls",
      "xlsx": ".xlsx",
      "ppt": ".ppt",
      "pptx": ".pptx"
    },
    "视频": {
      "mp4": ".mp4",
      "mov": ".mov"
    },
    "代码文件": {
      "sql": ".sql",
      "war": ".war",
      "class": ".class",
      "jar": ".jar"
    },
    "图片": {
      "psd": ".psd",
      "jpg": ".jpg",
      "png": ".png"
    },
    "压缩包": {
      "zip": ".zip",
      "rar": ".rar",
      "7z": ".7z",
      "tar":".tar",
      "gz": ".gz"
    },
    "可执行文件": {
      "exe": ".exe",
      "msi": ".msi"
    }
  }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容