java-IO流概述+字节流的详解

一、IO流

1.概念:

IO流用来处理设备之间的数据传输。

java对数据的操作是通过流的方式。

java用于操作流的对象都在IO包中。

流操作的数据分为两种:

(1)字节流:可以操作任何数据

(2)字符流:只能操作纯字符数据

流按照数据流向分为两种:

(1)输入流:是指向java程序中输入数据(读入数据)。

(2)输出流:是指从java程序中向外写出数据。

2.IO流常用父类

输入流:字节流---InputStream     字符流-----Reader

输出流:字节流---OutputStream  字符流-----Writer

由这四个类派生的子类名称都是以这四个类名称作为子类名的后缀

例如:InputStream 的子类 FileInputStream       Reader 的子类 FileReader

3.IO流的书写流程

1.使用前,导入IO包中的类

2.使用时,进行IO异常处理

3.使用后,释放资源

二、字节流

1.读入文件步骤:

(1)创建FileInputStream对象,指定一个文件,文件必须存在,不存在则会抛出fileoutfoundexception

(2)使用read()方法可以从文件中读取一个字节,如果读取到文件末尾则会读到-1

(3)读取结束后需要释放资源,调用close()方法关闭输入流

2.写入文件步骤

(1)创建FileOutputStream对象,置顶一个文件,文件不存在系统会自动创建该文件,存在则会清空原内容,如果需要追加,在构造函数中传入true

(2)使用Write()方法可以向文件写出一个字节

(3)写出结束后同样需要调用close()方法关闭资源

3.拷贝文件

有四种拷贝方式:

(1)从文件中逐个字节读取,逐个字节写出,但这样做效率非常低

  1. public static void main(String[] args) throws IOException {  
  2.         // TODO Auto-generated method stub  
  3.         FileInputStream fis = new FileInputStream("C:/Users/king/Desktop/Readme.txt");  
  4.         FileOutputStream fos = new FileOutputStream("abc.txt");  
  5.         int a;  
  6.         while ((a = fis.read()) != -1) {  
  7.             fos.write(a);  
  8.         }  
  9.         fis.close();  
  10.         fos.close();  
  11.     }  

(2)自定义字节数组,一次性从文件中读取多个字节装入数组,然后再一次性把数组中的字节写出

  1. FileInputStream fis = new FileInputStream("C:/Users/king/Desktop/Readme.txt");  
  2.         FileOutputStream fos = new FileOutputStream("bcd.txt");  
  3.         int len;  
  4.         byte[] arr= new byte[1024];  
  5.         while((len = fis.read(arr)) != -1){  
  6.             fos.write(arr, 0, len);  
  7.         }  
  8.         fis.close();  
  9.         fos.close();  

(3)将文件一次性拷贝,但是有弊端,如果文件过大,则会出现内存溢出。用availavle()方法获取文件的字节长度。

  1. FileInputStream fis = new FileInputStream("C:/Users/king/Desktop/Readme.txt");  
  2.         FileOutputStream fos = new FileOutputStream("edd.txt");  
  3.         byte[] arr = new byte[fis.available()];  
  4.         int len;  
  5.         while((len = fis.read(arr)) != -1){  
  6.                 fos.write(arr, 0, len);  
  7.         }  
  8.         fis.close();  
  9.         fos.close();  

(4)使用系统提供的缓冲区buffered,使用方法和自定义数组相同。

  1. FileInputStream fis = new FileInputStream("C:/Users/king/Desktop/Readme.txt");  
  2.         FileOutputStream fos = new FileOutputStream("daf.txt");  
  3.         BufferedInputStream bis = new BufferedInputStream(fis);  
  4.         BufferedOutputStream bos = new BufferedOutputStream(fos);  
  5.         int len;  
  6.         while((len = bis.read()) != -1){  
  7.              bos.write(len);  
  8.         }  
  9.         bis.close();  
  10.         bos.close();  
4.常用方法

InputStream:

read()获取一个字节   available() 获取可读的字节数
read(byte[])读取若干(数组长度)字节 close()关闭流 释放资源

OutputStream:

write()写出一个字节 write(byte[],start,len)写出一个字节,写出的长度从start开始,到len结束

write(byte[])写出数组内的所有字节 close()关闭流,释放资源

5.BufferedInputStream

BufferedInputStream内置了一个缓冲区(数组)

BufferedInputStream会一次性从文件中读取8192个字节,然后一个一个传给java程序

6.BufferedOutputStream

BufferedOutputStream内置了一个缓冲区(数组)

程序向流中写出字节时,不会直接写到文件,先写到缓冲区中。

直到缓冲区写满,BufferedOutputStream才会把缓冲区中的数据一次性写到文件中

7.flush和close的区别

flush():只刷新缓冲区,流依然存在,并可以继续使用,可以使用多次

close():也会刷新缓冲区,但是刷新后,立刻关闭流资源,流不可以继续使用,只能用一次。


Java IO 的一般使用原则 :  

一、按数据来源(去向)分类:

1 、是文件: FileInputStream, FileOutputStream, ( 字节流 )FileReader, FileWriter( 字符 )

2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字节流 )

3 、是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )

4 、是 String: StringBufferInputStream, StringBufferOuputStream ( 字节流 )StringReader, StringWriter( 字符流 )

5 、网络数据流: InputStream, OutputStream,( 字节流 ) Reader, Writer( 字符流 )

二、按是否格式化输出分:

1 、要格式化输出: PrintStream, PrintWriter

三、按是否要缓冲分:

1 、要缓冲: BufferedInputStream, BufferedOutputStream,( 字节流 ) BufferedReader, BufferedWriter( 字符流 )(Reader,Writer类由于是直接从文件读取字节流再转化成字符流,开销大,所以需要以Buffered包裹,提高效率)

四、按数据格式分:

1 、二进制格式(只要不能确定是纯文本的) : InputStream, OutputStream 及其所有带 Stream 结束的子类

2 、纯文本格式(含纯英文与汉字或其他编码方式); Reader, Writer 及其所有带 Reader, Writer 的子类

五、按输入输出分:

1 、输入: Reader, InputStream 类型的子类

2 、输出: Writer, OutputStream 类型的子类

六、特殊需要:

1 、从 Stream 到 Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter

2 、对象输入输出: ObjectInputStream, ObjectOutputStream

3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter

4 、合并输入: SequenceInputStream

5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):

第一,考虑最原始的数据格式是什么,(四)

第二,是输入还是输出,(五)

第三,是否需要转换流,(六)

第四,数据来源(去向)是什么,(一)

第五,是否要缓冲,((三 ),特别注明:一定要注意的是 readLine() 是否有定义,有什么比 read, write 更特殊的输入或输出方法)

第六,是否要格式化输出,(二)


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值