java流是从起源到接收_I学霸官方免费教程四十二 :Java流之字节流 输入流和输出流 InputStream和OutputStream...

流:从输入/输出源到目标之间的有序数据

a)比如水流、电流、气流;计算机中流的本质是脉冲电流。

b)为进行数据的输入/输出操作,Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream)

c)Stream是从起源(source)到接收(sink)的有序数据

d)java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能

流的分类

根据处理的单位不同分为:字节流和字符流

根据流向不同分为:输入流和输出流

根据作用不同分为:转换流和包装流(初学者了解即可)

cb1e1bfe35f9f50cf9faa7983aad9130.png

节点流:是可以从一个特定的数据源(节点)读写数据的流(例如文件,内存)。就像是一条单一的管子接到水龙头(节点)上开始放水。

处理流:是“连接”在已经存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。就像在已经接了一条管子(节点流)的基础上,又接了一个过滤器一样

字节输入流

03da18f5bc19553ca64b5bdb65d73931.png

常用类和方法

说   明

FileInputStream

将文本文件读取到输入流中

ByteArrayInputStream

将内存缓冲区中的数组读取到输入流进行操作

StringBufferInputStream

将一个String对象读取到输入流进行操作

PipedInputStream

实现了管道(pipe)的概念通常用于线程间的数据传递

SequenceInputStream

将多个输入流串联在一起

方法名称

说   明

abstract int read( )

读取一个字节并返回,返回值=-1表示没有读取到任何字节,读取结束

int read(byte b[ ])

从流中读取数据,直至流读完或存满数组b,返回值是读取的字节数

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

将数据读入数组b,从数组的偏移量offset位置开始存,用len指定读取的最大字节数

int available( )

获取输入流中可以读取的字节数

long skip(long n)

跳过N个字节,从N+1处读取

boolean markSupported()

判断流是否支持标记功能

void mark(int readlimit)

标记当前位置

void reset()

回到上一个使用mark方法标记的位置

int close( )

关闭流

注意:若输入流阻塞,available( )可能只会返回0,只有继承了InputStream的子类对象调用才有用

mark(int readlimit)标记会在后续读取字节数达到readlimit和输入流的缓冲区大小两者中的最大值时失效

实例

package io;

import java.io.*;

/**

* 演示InputStream类常用方法

* @author 学霸联盟 - 赵灿

*/

public class InputStreamDemo {

public static void main(String[] args) {

byte[] b = {23,34,56,6,7,8,95,88,98};

//创建输入流的对象

InputStream is = new ByteArrayInputStream(b);

int i=0 ;

try{

//每次循环从输入流is中读取一个字节,将其自动转换成int类型值,并赋值给变量i;

//如果i==-1就代表流中的数据已经读取完毕,结束循环

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

System.out.println(i);

}

System.out.println("第一次读完后,缓冲区中输入流对象is中剩余的字节数为:"+is.available());

System.out.println("判断输入流的对象is是否支持mark/reset:"+is.markSupported());

//重置流到开始位置(下标为0处)

is.reset();

System.out.println("重置后,缓冲区中输入流对象is中剩余的字节数为:"+is.available());

//从流is中跳过n个字节

is.skip(3);

is.mark(10);

System.out.println("跳过3个字节后,缓冲区中输入流对象is中剩余的字节数为:"+is.available());

System.out.println("----------------------------");

byte[] b1 = new byte[20];

//根据传入的第二个参数(偏移量)决定从第一个参数b1的哪个下标开始存入值

//第三个参数:读取的长度,超出流中的长度不会出现异常

//如果读取长度小于流中值的长度,就按传入的长度读取

is.read(b1,2,5);

System.out.println("----------------------------");

//应该reset至mark方法标记处

is.reset();

System.out.println(is.read());

System.out.println("----------------------------");

for(int k =0;k

System.out.println(b1[k]);

}

}catch(IOException ex){

ex.printStackTrace();

}finally{

try{

//关闭流

is.close();

}catch(IOException e){

e.printStackTrace();

}

}

}

}

package io;

import java.io.*;

/**

* 演示FileInputStream类

* @author 学霸联盟 - 赵灿

*/

public class FileInDemo {

public static void main(String[] args) {

File file = new File("C:/file.txt");

//创建一个文件输入流

FileInputStream fis = null;

try{

//第一种构造方式创建对象

//fis = new FileInputStream("c:/file.txt");

//第二种构造方式创建对象

fis = new FileInputStream(file);

int i;

while((i=fis.read())!=-1){

System.out.println(i);

}

System.out.println(fis.markSupported());

//FileInputStream类型的输入流,不支持mark/reset,所以调用reset()方法会出现IOException

//fis.reset();

//byte[] b = new byte[1024];

//fis.read(b);

//System.out.println(Arrays.toString(b)+"abc");

}catch (IOException e){

e.printStackTrace();

}finally{

try{

if(fis != null){

fis.close();

//FileInputStream类型的输入流,被关闭后将不能在使用了

//fis.read();

}

}catch(Exception ex){

ex.printStackTrace();

}

}

}

}

实例

package io;

import java.io.*;

/**

* 演示mark方法

* @author 学霸联盟 - 赵灿

*/

public class MarkDemo {

public static void main(String[] args) {

byte[] b = {23,34,56,6,7,8,95,88,98};

//创建输入流的对象

InputStream is = new ByteArrayInputStream(b);

try{

is.read();

//在流中标记当前位置(类似书签);使用该方法之前要注意判断该流是否支持mark/reset

is.mark(1);

is.read();

is.read();

//重置到使用mark标记的位置

is.reset();

System.out.println(is.read());

}catch(Exception e){

}

}

}

字节输出流

dc56e1be24906c7533855006b0cc4e87.png

常用类和方法

说   明

ByteArrayOutputStream

将输出流中的数据写入到数组

FileOutputStream

将输出流中的数据写入文本文件

PipedOutputStream

将输出流中的数据写入管道

SequenceOutputStream

将多个输出流串联在一起

方法名称

说   明

void write(byte b[ ])

将参数b中的所有字节写到此输出流

void write(byte b[ ], int off, int len)

将数组b中,从偏移量off开始的len个字节写到此输出流

abstract void write(int b)

先将int转换为byte类型,写入到输出流中

void flush( )

将缓冲区中数据全部输出到流中,并清空缓冲区

void close( )

关闭流

package io;

import java.io.*;

/**

* 演示OutputStream类常用方法

* @author 学霸联盟 - 赵灿

*/

public class OutputStreamDemo {

public static void main(String[] args) {

ByteArrayOutputStream os = new ByteArrayOutputStream();

try{

//向输出流中写入一个值

os.write(10);

byte[] src = {11,12,13,14,15};

os.write(src);

os.write(src,2,src.length - 2);

//获取输出流中的值,并转换成字节数组

byte[] bs = os.toByteArray();

//循环输入

for(byte b:bs){

System.out.println(b);

}

}catch(IOException e){

}finally{

try{

os.flush();

//ByteArrayOutputStream类的close()方法无效

os.close();

//所以此处继续向输出流中写入值不会出现异常

os.write(18);

}catch(IOException ex){

}

}

}

}

package io;

import java.io.*;

/**

* 演示FileOutputStream类

* @author 学霸联盟 - 赵灿

*/

public class FileOutDemo{

public static void main(String[] args) {

//声明一个文件输出流对象

FileOutputStream fos = null;

try{

fos = new FileOutputStream("C:/file.txt",true);

byte[] b = {105,106,107,108,109,120};

fos.write(b);

}catch(IOException e){

e.printStackTrace();

}finally{

try{

fos.flush();

fos.close();

}catch(IOException e){

e.printStackTrace();

}

}

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值