字符流(含缓冲流)

字节流:

字节流:可以从或向一个特定的方向读写数据,数据是字节

封装流/处理流:针对字节流进行封装,即对一个已经存在的流

进行封装,通过所有的封装流能够对数据更有效

的读写,封装流的底层还是字节流

通常字节流被称之为低级流

处理流被称之为高级流或过滤流

 

 InputStream 是所有字节流的父类,其定义了基础的读取方法

-int read()

读取一个字节,以int的形式返回,该int的低8位有效否则返回-1,表示文件末尾EOF end of file

/**

 * int read();

 * 一次读取一个字节

 */

@Test

public void testMethod2()throws IOException{

//创建了一个输入流的对象,此对象跟硬盘的某个文件关联,对文件做输入操作

InputStream is=new FileInputStream("d:/aa/fos.txt");



int d=-1;

while((d=is.read())!=-1){

System.out.println((char)d);

}



is.close();

}

 

-int read(byte[] b)

尝试最多读取给定数组length个字节,并存入该数组返回值为实际读取的字节量的长度,否则返回-1,到文件末尾

/**

 * int read(byte[] buf);

 * 一次读取字节数据存储buf字节数组

 */

@Test

public void testMethod3()throws IOException{

//创建了一个输入流的对象,此对象跟硬盘的某个文件关联,对文件做输入操作

InputStream is=new FileInputStream("d:/aa/fos.txt");

byte[] buf=new byte[3];

int len=-1;

while((len=is.read(buf))!=-1){

System.out.println("len="+len+"     "+new String(buf).substring(0,len));

}



is.close();

}

 

-int read(byte[] b,int offset,int len)

将输入流中的最多len个数据写入byte数组,将从offset的位置开始写入数组,len不能超过数组的实际长度如果超过会报数组下标越界异常

/**

 * int read(byte[] buf,int offset,int len);

 * 一次读取字节数据存储buf字节数组

 */

@Test

public void testMethod4()throws IOException{

//创建了一个输入流的对象,此对象跟硬盘的某个文件关联,对文件做输入操作

InputStream is=new FileInputStream("d:/aa/fos.txt");

byte[] buf=new byte[3];

int len=-1;

while((len=is.read(buf,0,buf.length))!=-1){

System.out.println("len="+len+"     "+new String(buf).substring(0,len));

}



is.close();

}

 

-void close()

关闭此输入流并释放与该流关联的所有的系统资源

 

OutputStream 是所有的字节流的父类,其定义了基础的写出方法

-void write(int d)

写出整数数据的低8位

-void write(byte[] b)

将给定的字节数组的数据全部写出

/**

 * 用write(byte[] buf)

 * @throws IOException

 */

@Test

public void testMethod1() throws IOException{

//创建了一个输出流的对象,此对象跟硬盘的某个文件关联,对文件只能做输出操作

OutputStream os=new FileOutputStream(new File("d:/aa/fos.txt"));

//把字符串转换成字节数组并写到os流对象中

os.write("hello world!".getBytes());

//清除缓冲,数据回写硬盘

os.flush();

//关闭流,并释放资源

os.close();

}

 

-void write(byte[] b,int    offset,int len)

将给定的字节数组从偏移量offset开始的len个字节写入输出流

-void flush()

刷新此输出流并强制写出所有缓冲的输出字节

-void close()

关闭此输出流,并释放与此输出流有关的所有的系统资源

 

FileInputStream:文件输入流

-可以操作文件的内容

-操作的是字节流

-继承自InputStream抽象类

-低级流

-操作的是文件

FileOutputStream:文件输出流

-可以操作文件内容

-操作的是字节流

-继承的是OutputStream抽象类

-低级流

-操作的是文件

 

缓冲流:Buffer缓冲   高级流之一

缓冲流的原理:

向硬件存储设备操作数据,导致增大跟硬件的交互次数,

会降低读写的速度,做缓冲流的目的就是为了尽量减少

跟硬件的交互次数

 

缓冲输出流的原理:

BufferedOutputStream缓维冲输出流内部会护一个缓冲区,

每当我们向该流写出数据时,都会先将数据存储入缓冲区,

当缓冲区已满的时候,缓冲流会将数据一次性写出

 

注意:

Void flush(),清除缓冲区,将缓冲区中的数据强制写出

以保证数据的完整

/**

 * 缓冲输出流

 * 减少跟硬盘的交互次数

 */

@Test

public void testMethod1()throws IOException{

//低级流,文件的字节流

OutputStream os=new FileOutputStream("d:/aa/bos.txt");

//对低级流,要做二次封装,把低级流转换成高级流

BufferedOutputStream bos=new BufferedOutputStream(os);

//用高级流的对象打点调用api方法,读写效率会有提升

bos.write("hello world".getBytes());



//清空缓冲,强制回写硬盘

bos.flush();

//关闭流资源

bos.close();

os.close();

}

 

缓冲输入流的原理:

BufferedInputStream缓冲输入流内部维护一个缓冲区,

每当我们向该流读入数据时,都会先将数据存入缓冲区,

BufferedInputStream的read方法会从缓冲区读取数据

当缓冲区全都读取完毕,如果再次read的时候,会再一次

把缓冲区填满,read在逐一从缓冲区读取数据,以此往复

/**

 * 缓冲输入流

 * 减少跟硬盘的交互次数

 */

@Test

public void testMethod2()throws IOException{

//低级的输入流

InputStream is=new FileInputStream("d:/aa/bos.txt");

//高级缓冲输入流,对低级流的二次封装

BufferedInputStream bis=new BufferedInputStream(is);

int d=-1;

while((d=bis.read())!=-1){

System.out.println((char)d);

}

bis.close();

is.close();

}

 

缓冲是靠牺牲内存来提升io的读写效率

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值