java BIO详解

概念

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作

IO类概述表

IO类概述表.png

常见流

  • RandomAccessFile 跳跃读文件,原理是调用一个native方法移动指向当前操作字节数组指针的位置,所以一般对于流的操作我们就要按照顺序读写,就可以获得完整的文件
package com.rockjh.jdk.io;

import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * @author rockjh 【rockjh@aliyun.com】
 * @Description: 随机读写文件操作demo
 * @Date 2017/12/14 15:52
 **/
public class RandomAccessFileDemo {

    /**
     *从这个类我们可以知道,在底层一直有一个pos指向当前正在读或者写的位置,所以一般对于流的操作我们就要按照顺序执行
     * @param args
     * @throws IOException
     */
    public static void main(String[] args){
        byte[] value= new byte[4];
        try {
            //获取resource路径
            String path=RandomAccessFileDemo.class.getResource("/").getPath();
            RandomAccessFile randomAccessFile = new RandomAccessFile(path+"RandomAccessFileDemo.txt","r");
            //移动阅读的指针,注意汉字在不同编码里面占的字节数不一样,一般是2-4字节
            randomAccessFile.skipBytes(3);
            randomAccessFile.read(value);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(new String(value));
    }

}

  • 管道流主要是为多个线程提供通信,一个输入管道,一个输出管道,一边输入一边输出
package com.rockjh.jdk.io;


import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

/**
 * @author rockjh 【rockjh@aliyun.com】
 * @Description:
 * @Date 2017/12/14 16:42
 **/
public class PipeStreamDemo {
    public static void main(String[] args) throws IOException {
        PipedOutputStream pipedOutputStream=new PipedOutputStream();
        PipedInputStream pipedInputStream=new PipedInputStream(pipedOutputStream);
        Thread thread1=new Thread(() -> {
            try {
                pipedOutputStream.write("hello world".getBytes("utf-8"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        },"thread1");
        Thread thread2=new Thread(()->{

            try {
                byte[] value=new byte[100];
                //一直等待读取状态为wait,直到有值
                pipedInputStream.read(value);
                System.out.println(new String(value));
            } catch (IOException e) {
                e.printStackTrace();
            }
        },"thread2");
        thread1.start();
        thread2.start();
    }
}
  • FileInputStream文件流
package com.rockjh.jdk.io;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;

/**
 * @author rockjh 【rockjh@aliyun.com】
 * @Description: 文件类demo
 * @Date 2017/12/14 21:16
 **/
public class FileDemo {

    public static void main(String[] args){
        try {
            File file=new File(FileDemo.class.getResource("/").getPath()+"fileDemo.txt");
            if(!file.exists()){
                file.createNewFile();
            }
            OutputStreamWriter output=new FileWriter(file);
            char[] value=new char[]{'世','界','你','好'};
            output.write(value);
            output.flush();
            System.out.println(file.isDirectory());
            System.out.println(file.list());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  • ByteArrayOutputStream允许我们以字节的形式获取值toByteArray()方法

  • ObjectOutputStream主要是对象序列化存储的一个东西,他需要一个将值输出在构造参数中的流中,相当于是一个包装流吧

package com.rockjh.jdk.io;

import com.rockjh.jdk.bean.People;

import java.io.*;

/**
 * @author rockjh 【rockjh@aliyun.com】
 * @Description: 对象流,序列化对象
 * @Date 2017/12/14 21:30
 **/
public class ObjectStreamDemo {

    public static void main(String[] args){
        //对象序列化和反序列化
        try {
            People people=new People("rockjh",23,"18280193473");
            ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(ObjectStreamDemo.class.getResource("").getPath()+"object.data"));
            output.writeObject(people);
            output.flush();
            ObjectInputStream input = new ObjectInputStream(new FileInputStream(ObjectStreamDemo.class.getResource("").getPath()+"object.data"));
            people = (People) input.readObject();
            System.out.println(people);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


        try {
            //对象转byte,byte转对象
            People people=new People("rockjh",23,"18280193473");
            System.out.println((People)byteToObj(objToByte(people)));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 字节转对象
     * @param bytes
     * @param <T>
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    private static <T> T byteToObj(byte[] bytes) throws IOException, ClassNotFoundException {
        ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(bytes);
        ObjectInputStream inputStream=new ObjectInputStream(byteArrayInputStream);
        T t= (T) inputStream.readObject();
        return t;
    }

    /**
     * 字节转对象
     * @param obj
     * @param <T>
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    private static <T> byte[] objToByte(T obj) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
        ObjectOutputStream outputStream=new ObjectOutputStream(byteArrayOutputStream);
        outputStream.writeObject(obj);
        return byteArrayOutputStream.toByteArray();
    }
}
  • BufferedOutputStream为输出流提供缓存,能提供很多IO性能,不用每次都去磁盘或者网络一次读取一个或者几个字节

  • DataInputStream包装输入流,可以使得输入流直接输入几种基本数据类型,而不是只能输入字节数据

  • System.in, System.out, System.error(注:Java标准输入、输出、错误输出)

  • PushBackInputStream可以回退一个已读的流

  • java7新增在try块中自动关闭流,包括jdbc等

不管输入流还是输出流都要有一个数据源,最常见的一个列子就是实例化一个输入流,向其中写东西,然后输出流,输出到文件或者打印,输入流是read,输出流是write

路径

  • Object.class.getResource("/").getPath();获取classpath路径

  • Object.class.getResource("").getPath();获取当前类路径,即包括包

实例源代码 前往下载

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

推荐阅读更多精彩内容

  • 一、流的概念和作用。 流是一种有顺序的,有起点和终点的字节集合,是对数据传输的总成或抽象。即数据在两设备之间的传输...
    布鲁斯不吐丝阅读 10,015评论 2 95
  • 在经过一次没有准备的面试后,发现自己虽然写了两年的android代码,基础知识却忘的差不多了。这是程序员的大忌,没...
    猿来如痴阅读 2,827评论 3 10
  • tags:io categories:总结 date: 2017-03-28 22:49:50 不仅仅在JAVA领...
    行径行阅读 2,168评论 0 3
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,169评论 11 349
  • 赵道新批评武林门派之弊 前年,机缘巧合看过一篇赵道新的访谈录,言之有理,稍加整理,传至豆瓣,题为《赵道新批评中国武...
    素履阅读 1,808评论 1 2