Java IO流

        惭愧,编程几年一直没有系统了解下IO流,做技术还是要踏踏实实的一步一个脚印慢慢积累,欺骗生活最终被欺骗的是你自己。

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

        IO流分类上张图

IO分类

注:

        1.此处的输入,输出是站在程序运行内存角度考虑的,输入指向输入到内存,输出指从内存输出

        2.字节流和字符流的区别在于操作单元不同,字节流以字节(8bit)为单位,字符流以字符(16bit)为单位,Java中字符是采用Unicode标准,一个字符是16位,为此,JAVA中引入了处理字符的流,其本质其实就是基于字节流读取时,查询指定码表。

        IO流常用类以及各类所负责媒介再上张图

常用流类表

1.输入字节流InputStream

1)    InputStream是所有的输入字节流的抽象父类

2)  ByteArrayInputStream、 FileInputStream是两种基本的介质流,它们分别从Byte数组、和本地文件中读取数据

3)   PipedInputStream是从与其它线程共用的管道中读取数据

4.) ObjectInputStream和所有FilterInputStream的子类都是装饰流(装饰器模式的主角)

InputStream包含3个基本读方法

• abstract int read():读取一字节数据并返回,返回-1表示读到了输入流的末尾

int read(byte[] b):将数据读入一个数组,同时返回实际读取的字节数,返回-1表示读到了输入流的末尾

 int read(byte[] b,int off,int len):将数据读入一个字节数组,同时返回实际读取的字节数。返回-1表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。

2.输入字符流Reader

1)Reader是所有的输入字符流的父类

2)CharArrayReader和StringReader是两种基本介质流,分别将Char数组和String中读取数据

3)PipedReader是从与其他线程共用的管道中读取数据

4)FilterReader是所有自定义具体装饰流的父类,其子类PushbackReader对Reader对象进行装饰会增加一个行号

5)InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象

Reader包含3个基本读方法

int read():读取一个字符,返回值为读取的字符

int read(char[] b) :读取一系列字符到数组char中,返回值为实际读取的字符数量

• int read(char[] b,int off,int len):读取len个字符,从数组char[]的下标off处开始存放,返回值为实际读取的字符数量

InputStream和Reader移动指针的方法:

void mark(int readlimit):在输入流当前位置放置一个标记,如果读取的字节数多于readlimit设置的值,则流忽略这个标记

boolean markSupported():测试当前流是否支持mark和reset方法。如果支持,返回true,否则返回false

• void reset():此流的记录指针重新定位到上一次记录标记(mark)的位置

 long skip(long n):在输入流中跳过n个字节,并返回实际跳过的字节数

3.输出字节流OutputStream

1) OutputStream是所有的输出字节流的抽象父类

2)ByteArrayOutputStream、FileOutputStream是两种基本介质流分别向Byte数组、和本地文件中写入数据

3)ObjectOutputStream和所有FilterOutputStream的子类都是装饰流

outputStream包含三个基本写方法

 abstract void write(int b):将指定的字节输出到输出流中

 void write(byte[] b) :将字节数组中的数据输出到指定输出流中

 void write(byte[] b, int off, int len) :将字节数组数组中从off位置开始,长度为len的字节输出到输出流中。

4.输出字符流Writer

1) Writer是所有的输出字符流的抽象父类

2)CharArrayWriter、StringWriter是两种基本的介质流,它们分别向Char数组、String中写入数据

3)PipedWriter是向与其它线程共用的管道中写入数据,

4)PrintWriter和PrintStream极其类似,功能和使用也非常相似

5)OutputStreamWriter是Writer的子类,将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流的输出对象

主要方法

void write(int c):将指定的字符输出到输出流中

• void write(byte[]/char[] buf):将字符数组中的数据输出到指定输出流中

• void write(byte[]/char[] buf, int off,int len ):将字符数组中从off位置开始,长度为len的字符输出到输出流中

因为字符流直接以字符作为操作单位,所以Writer可以直接用String作为参数

• void write(String str):将str字符串里包含的字符输出到指定输出流中

• void write (String str, int off, int len):将str字符串里面从off位置开始,长度为len的字符输出到指定输出流中

NIO

        使用InputStream从输入流中读取数据时,如果没有读取到有效数据,程序将在此处阻塞该线程。其实传统的输入流和输出流都是阻塞式的进行输入输出,不仅如此,传统的输入流、输出流都是通过字节的移动处理的,一次只能处理一个字节,效率不高

        从JDK1.4开始,Java提供流一系列改进的输入和输出处理的新功能,这些功能被统称为新IO(NIO)。新增了许多用于处理输入和输出的类,这些类都被放在java.nio包及其子包下,并且对原io的很多类都以NIO为基础进行了改写,新增了满足NIO的功能。

        NIO采用了内存映射对象的方式来处理输入和输出,NIo将文件或者文件的一块区域映射到内存中,这样就可以像访问对象一样来访问文件来。通过这种方式来进行输入、输出比传统的输入、输出要快的多。

JDk1.4使用NIO改写了传统Io后,传统Io的读写速度和NIO差不了太多。

RandomAccessFile类

        该对象并不是流体系中的一员,其封装了字节流,同时还封装了一个缓冲区(字符数组),通过内部的指针来操作字符数组中的数据。

特点:

1.该对象只能操作文件,所以构造函数接收两种类型的参数:a.字符串文件路径;b.File文件路径

2.该对象即可以对文件进行读操作,也能进行写操作,在进行对象实例化时可指定操作模式(r,rw)

注意:该对象在实例化时,如果要操作的文件不存在,会自动创建;如果文件存在,写数据未指定位置,会从头开始写,即覆盖原有的内容。 可以用于多线程下载或多个线程同时写数据到文件。

结尾

这篇文章集百家之长,混乱中大体说明白了JavaIO流,打完收工

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

推荐阅读更多精彩内容