I学霸官方免费教程四十二 :Java流之字节流 输入流和输出流 InputStream和OutputStream
来源:互联网 发布:nginx只允许访问index 编辑:程序博客网 时间:2024/06/06 00:20
流
流:从输入/输出源到目标之间的有序数据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/resetis.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();}}}}
- I学霸官方免费教程四十二 :Java流之字节流 输入流和输出流 InputStream和OutputStream
- InputStream和OutputStream输入和输出流
- JAVA 的IO操作(二) 字节输出流和输入流:OutputStream和InputStream
- Java IO 字节流 InputStream和OutputStream
- Java的InputStream和OutPutStream流输入与输出体会
- Java--IO流之字节流介绍--InputStream和OutputStream
- java学习之字节流--InputStream和OutputStream
- I学霸官方免费教程四十三 :Java流之字符流 Reader和Writer
- InputStream和OutPutStream类定义的字节输入/输出流常用的方法
- 字节流InputStream和OutputStream简单使用
- IO字节流,OutputStream和InputStream
- IO流之----字节流(InputStream和OutputStream)
- java中输入流和输出流的转换,inputstream 转换 outputstream
- JAVA中inputStream/OutputStream字节输入流、输出流读写文件
- Java知识(IO流、.InputStream和OutputStream)
- Java IO流-InputStream和OutputStream
- Java 字节流InputStream、OutputStream、FileInputStream、FileOutputStream
- JAVA——字节流: InputStream /OutputStream
- 归并排序--c语言实现
- Java 8十个lambda表达式案例
- JS学习十四天----服务器端执行JS代码
- Android 定制EditText 改变 底线颜色
- MYGUI和HGE
- I学霸官方免费教程四十二 :Java流之字节流 输入流和输出流 InputStream和OutputStream
- CLLocation的属性以及使用的解释
- 一个整形十进制数值存放在数组中的形式
- 《数据结构与算法分析》排序算法总结
- XtraGrid 加全选列
- oci runc
- spring MVC Controller 实现接口后,不能解析@Controller注解问题
- python之路-------字符串与正则表达式
- 关于SMS短信滞后阅读的实现方案