IO流基础与字节流,字符流

IO流基础

一、概念
数据的交换
程序与文件,数组,网络资源,数据库资源的数据传输与交换。
<br />
二、IO流的分类

  1. 流向:输出流与输入流(以程序为中心判断)
  2. 数据:字节流:二进制,可以传输任何文件。
    字符流:文本文件,只能处理纯文本
  3. 功能:节点:包裹源头
    处理:增强功能,提高性能
    <br />

三、字符流与字节流(重点区分)

  1. 字节流
    输入流:InputStream
    输出流:OutputStream
  2. 字符流
    输入流:Writer
    输出流:Reader
    <br />

四、操作
1)、建立联系
2)、选择流
3)、操作 数组大小+read、write
4)、释放资源

字节流基本操作之文件读取,写出,追加,拷贝

<br />
一、文件读取

  1. 建立联系:File对象
  2. 选择流 文件输入流:InputStream接口的实现类FileOutputStream
  3. 操作:byte[] car=new byte[数组大小]+read+读取大小,输出
  4. 关闭资源

示例程序

    public static void fileIn() {
        // 1.关联文件
        File f = new File("F:/javaIotest/poetry.txt");
        // 2.选择流
        InputStream is = null;// 提升作用域
        try {
            is = new FileInputStream(f);
            // 3.操作
            byte[] car = new byte[20];// 缓冲数组
            // 这里定义每次读取的文件的长度,
            // 如果不定义的话,如果到最后长度不够填满数组,那么只会改变前面的部分,后面的还是上次读取的内容
            // 输出也没办法确定输出到哪里结束
            int len = 0;
            while (-1 != (len = is.read(car))) {// is.read()方法会返回整形,表示本次读取的长度
                // 每次只输出本次读取的字节,到最后就不会多输出了
                String str = new String(car, 0, len);
                // 打印
                System.out.print(str);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("文件未找到");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("读取文件失败");
        } finally {
            // 4.关闭资源
            if (null != is)
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("关闭流失败");
                }
        }
    }

<br />
二、文件写出
<br />
操作同上
选择流的FileInputStream 多一个参数,是表示追加还是覆盖。false为覆盖,true为追加。如果不写该参数的话,默认为覆盖的。
还有个要注意的,文件输出需要使用flush()方法强制刷新一下。如果不刷新视频里说是等输出总线满了,才会往外推。虽然在finally里关闭流的时候也会自动刷新,但是推荐养成使用这个方法的习惯。

public static void outFile() {
        File f = new File("F:/javaIotest/test01.txt");
        OutputStream os = null;
        try {
            // 选择文件输出流,构造器里,最后一个参数为追加或者覆盖,false为覆盖
            os = new FileOutputStream(f);
            String str = "Viking is very handsome ! Do you agry ?";
            // 字符串转为字符数组
            byte[] b = str.getBytes();
            os.write(b, 0, b.length);

            os.flush();// 强制刷新,虽然在流关闭时也会,但推荐加一个这个
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("文件无法创建或者为目录");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("文件写入失败");
        } finally {
            if (null != os)
                // 关闭资源
                try {
                os.close();
                } catch (IOException e) {
                e.printStackTrace();
                System.out.println("流关闭失败");
                }
        }
    }

<br />
三、文件拷贝
<br />
建立联系阶段,源必须存在,且必须为文件。目的文件可以不存在,但也必须是文件。
示例程序

public static void fileCopy(File src, File dest) {

        InputStream is = null;
        OutputStream os = null;

        try {
            is = new FileInputStream(src);
            os = new FileOutputStream(dest);
            byte[] b = new byte[20];
            int len = 0;
            while (-1 != (len = is.read(b))) {
                os.write(b, 0, len);
            }
            os.flush();
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("文件读取或写出失败");
            e.printStackTrace();
        } finally {
            try {
                os.close();
                is.close();
            } catch (IOException e) {
                System.out.println("流关闭失败!");
                e.printStackTrace();
            }
        }
    }

<br />
四、文件夹的拷贝。
即利用listFiles方法获取目录下文件,如果是文件则拷贝,是目录则递归调用。因为都是完全的拷贝。所以要注意新文件的关联的建立。目录则需要手动创建。文件可以自己建立。

示例程序

    public static void dirCopy(File src, File dest) {
        // 先判断源是否是文件,如果再判断目的,如果是目录,就新建个同名的文件
        // 如果是文件直接拷贝。如果源是目录则调用私有方法拷贝目录。
        if (src.isDirectory()) {
            // 这里是在目的地下面新建个同名文件夹,即整个源一起拷贝进去
            File f = new File(dest, src.getName());
            dirCopyDetils(src, f);
        } else if (dest.isDirectory()) {
            File copyFile = new File(dest, src.getName());
            fileCopy(src, copyFile);
        } else {
            fileCopy(src, dest);
        }
    }

    private static void dirCopyDetils(File src, File dest) {
        // 建立文件夹
        if (!dest.exists())
            dest.mkdirs();
        File[] files = src.listFiles();
        // 遍历源目录下文件
        for (File temp : files) {
            // 如果是目录,调用自身,拷贝到上层目录下的同名文件夹
            if (temp.isDirectory()) {
                dirCopyDetils(temp, new File(dest, temp.getName()));
            } else {
                // 如果是文件,建立新的文件关联,复制时自动创建文件
                File copyFile = new File(dest, temp.getName());
                fileCopy(temp, copyFile);
            }
        }
    }

<br />

字符流

<br />
字符流只能用于处理纯文本。
操作与字节流类似
字符流的节点流:

  1. Reader 文件读取(FileReader)
  2. Writer 文件写出(FileWriter)

区别在于,用char数组来接收而不是用byte数组
写出操作,write方法形参可以是字符数组也可以是字符串,还多个append方法表示追加。

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

推荐阅读更多精彩内容