深入学习JAVA -IO流详解

(一)IO流基本概念

Java对数据的操作是通过流的方式,io是java中实现输入输出的基础,它可以很方便的完成数据的输入输出操作,Java把不同的输入输出抽象为流,通过流的方式允许Java程序使用相同的方式来访问不同的输入、输出。

image.png

image.png

(二)文件字节输入流

(2.1)使用输入流的4个基本步骤

1.设定输入流的源。
2.创建指向源的输入流。
3.让输入流读取源中的数据。
4.关闭输入流。

(2.2)构造方法

如果对文件读取需求比较简单,从文件系统中的某个文件中获得输入字节,可以使用文件字节输入流FileInputStream类。

 构造方法:
  // 通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定
    FileInputStream(File file)
 // 通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径name指定
 FileInputStream(String name)

(2.2)使用输入流读取文件

int read(byte b[])// 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b中,返回实际读取的字节数目。到达尾部返回-1.
int read(byte[] b, int off, int len)//将输入流中最多 len 个数据字节读入 byte 数组。返回实际读取的字节数目。到达尾部返回-1。off指定从某个位置开始存取。
long skip()//从源中读取单个字节的数据,该方法返回字节值(0-255),未读取出字节返回-1。
void close()//关闭流

(三)文件字节输出流

(3.1)使用输出流的4个基本步骤

1.设定输出流的目的地。
2.创建指定目的地的输出流。
3.让输出流把数据写入到目的地。
4.关闭输出流。

(3.2)构造方法

如果对文件读取需求比较简单,可以使用==文件字节输出流FileOutputStream类。==字节文件输出流是用于将数据写入到File,从程序中写入到其他位置。

 构造方法:
 FileOutputStream(File file)// 创建一个向指定File对象表示的文件中写入数据的文件输出流
 FileOutputStream(File file, boolean append)// 创建一个向指定File对象表示的文件中写入数据的文件输出流
 FileOutputStream(String name)// 创建一个向具有指定名称的文件中写入数据的输出文件流
FileOutputStream(String name, boolean append)// 创建一个向具有指定name的文件中写入数据的输出文件流

(3.3)使用输出流写字节

字节输出流的write方法以字节为单位向目的地写入单个数据。
void write(int n)输出流调用该方法向目的地写入单个字节。
void write(byte b[])输出流调用该方法向目的地写入一个字节数组。
void write(byte b[],int off,int len)给定字节数组中起始于偏移量off处取len个字节写到目的地。
void close()关闭输出流

(四)文件字符输入、输出流

java中字符流主要由两个基类Reader和Writer,分别对应字符输入流和字符输流。使用字符数组读取数据,即以字符为基本单位处理数据。
Reader的主要方法:
abstract viud close() 关闭流,并且释放该流占用的所有系统资源
**int read() **从流中读取单个字符
**int read(char[] cbuf) **从当前位置读取cbuf.length个字符到cbuf数组中,但实际读取的字符个数取决于流中剩余字符个数。返回值为实际读取的字符个数。
abstract int read(char[] cbuf, int off, int len)从当前位置读取len个字符到cbuf中,第一个字符存放在cbuf[off]中,第二个字符存放在cbuf[off+1]中,依次类推。实际读取的字符的个数取决于流中剩余的字符个数,返回值为实际读取的字符个数。
Writer的主要方法:
Writer append(char c) 追加字符c到此Writer流中,追加到尾部。返回值为追加后的此Writer
**Writer append(CharSequence csq) **追加字符序列csq到此Writer流中,追加到尾部,返回值为追加后的此Writer
**Writer append(CharSequence csq,int start,int end) **
追加字符序列csq的子序列到Writer流中,子序列为序列csq的start到end部分,追加到尾部,返回值为追加后的此序列。
abstract void close()关闭流,在关闭之前先调用flush()
**void write(String str) **将字符串写入到流中
**void Write(String str, int off, int len) **将字符串str指定位置的子串写入到流中,子串起始位置为off,子串长度为len。

(五)缓冲流

(5.1)缓冲流概述

缓冲流是对文件流处理的一种流,增强了读写文件的能力。够更高效的读写信息。因为缓冲流先将数据缓存起来,然后一起写入或读取出来。
flush() 和 close()
flush 是从缓冲区把文件写出,
close 是将文件从缓冲区内写出并且关闭相应的流。

(5.2)构造方法

BufferedReader 字符输入缓冲流
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。
BufferedWriter 字符输出缓冲流
BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz) 创建一个使用指定大小输出缓冲区的新缓冲字符输出流。

(六)随机流

(6.1)概述

RandomAccessFile类创建的流称作随机流,RandomAccessFile类既不是InputStream类的子类,也不是OutputStream类的子类。当准备对一个文件进行读写操作时,创建一个指向该文件的随机流即可,这样既可以从这个流中读取文件的数据,也可以通过这个流写入数据到文件。

(6.2)构造方法

==RandomAccessFile(File file, String mode) ==参数file是一个File对象,给出创建的流的源,也是流目的地。参数mode取r(只读)或rw(可读写),决定创建的流对文件的访问权力。
RandomAccessFile(String name, String mode): 参数name用来确定一个文件名,给出创建的流的源,也是流的目的地。参数mode取r(只读)或rw(可读写),决定创建的流对文件的访问权力。

(七)数组流

流的源和目的地除了可以是文件,还可以是计算机内存。不需要手动关闭流。只有字节流,没有字符流
字节数组输入流(ByteArrayInputStream)

byte[] src = "IO is easy".getBytes();
InputStream is = new ByteArrayInputStream(src);
byte[] flush = new byte[1024];
int len =-1;
while(len=is.read(flush)!=-1){
 String str = new String(flush,o,len);
 System.out.println(str);
}

字节数组输出流(ByteArrayOutputStream)

byte[] dest = null;//其实可以不用,为了风格统一
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String str = "IO is easy";
byte[] datas=str.getBytes();//字符串--->字节数组(编码)
baos.write(datas,0,datas.length);
baos.flush();
dest = baos.toByteArray();//获取数据
System.out.println(dest.length + new String(dest,0,dest.length));

(八)数据流

(8.1)概述

数据输入流DataInputStream允许应用程序以与机器无关方式从底层输入流中读取基本Java数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。数据输入流DataInputStream允许应用程序以与机器无关方式从底层输入流中读取基本Java数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。

(8.2)代码实现

import java.io.*;
public class text1 {
public static void main(String[] args) throws IOException {
 DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("aa.txt")));
 DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("aa.txt")));
 dos.writeUTF("行大旺");
 dos.writeInt(18);
 dos.writeBoolean(false);
 dos.writeChar('a');
 dos.flush();
 String msg = dis.readUTF();
 int age = dis.readInt();
 boolean flag = dis.readBoolean();
 char ch = dis.readChar();
 System.out.println(msg);
 System.out.println(age);
 System.out.println(flag);
 System.out.println(ch);
 dos.close();
 dis.close();
}
}

(九)对象流

对象流可以将一个对象写出,或者读取一个对象到程序中,也就是执行了序列化和反序列化的操作
序列化将一个对象存放到某种类型的永久存储器上称为保持。如果一个对象可以被存放到磁盘或磁带上,或者可以发送到另外一台机器并存放到存储器或磁盘上,那么这个对象就被称为可保持的。

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