I学霸官方免费教程四十二 :Java流之字节流 输入流和输出流 InputStream和OutputStream
流
流:从输入/输出源到目标之间的有序数据
a)比如水流、电流、气流;计算机中流的本质是脉冲电流。
b)为进行数据的输入/输出操作,Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream)
c)Stream是从起源(source)到接收(sink)的有序数据
d)java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能
流的分类
根据处理的单位不同分为:字节流和字符流
根据流向不同分为:输入流和输出流
根据作用不同分为:转换流和包装流(初学者了解即可)
节点流:是可以从一个特定的数据源(节点)读写数据的流(例如文件,内存)。就像是一条单一的管子接到水龙头(节点)上开始放水。
处理流:是“连接”在已经存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。就像在已经接了一条管子(节点流)的基础上,又接了一个过滤器一样
字节输入流
常用类和方法
类 |
说 明 |
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<b1.length;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){ } } }
字节输出流
常用类和方法
类 |
说 明 |
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(); } } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。