黑马程序员——java基础(IO流)

来源:互联网 发布:html调用php 编辑:程序博客网 时间:2024/05/22 03:50

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


十一章:java基础(IO流)



本章概述:

第一部分:IO体系

第二部分:字符流

Reader、Writer

第三部分:字节流

InputStream、OutputStream

第四部分:IO流的操作思路及IO异常

 





第一部分:IO体系

1、IO流:

(1)描述:

用于处理设备之间的数据传输的体系,Java对数据的传输操作都是通过流的方式进行的,用于操作流的对象都在IO包中

(2)划分:

按流向分:输入流、输出流

按操作数据分:字节流和字符流(用编码表将字节处理成字符)

2、IO的四大基类

Reader    字符读取流                     Writer       字符写入流

InputStream      字节读取流           OutputStream   字节写入流

3、常用基本IO类
(1)Reader:

BufferedReader         字符读取缓冲流

InputStreamReader:   字符读取转换流

FileReader         文本文件读取流

(2)Writer:

BufferedWriter          字符写入缓冲流

OutputStreamWriter :字符写入转换流

FileWriter          文本文件写入流

(3)InputStream:

FileInputStream        文件读取流

(4)OutputStream:

FileOutputStream    文件写入流





第二部分:字符流

1、Reader

(1)共性方法:

close()   关闭流资源
read()    读取一个字符
read(char[] cbuf)   将读取的字符存放在指定字符数组中
read(char[] cbuf, int off, int len)    将读取的字符存放在指定字符数组的指定位置中

(2)InputStreamReader

描述:InputStream转换流,将字节流转换成字符流

通常在涉及到字符编码转换时用到转换流

FileReader

是InputStreamReader的子类,是封装了默认编码表的转换流

构造函数必须传入文件源,如果没有该资源,则报异常

(3)BufferReader

描述:字符读取缓冲流,要明确需要缓冲的读取流对象

可以提高读取流的读取效率,并增加了更丰富的操作方法

方法:

readLine()   读一行字符,返回的数据不包含换行符

close()        关闭流资源,这里要关闭的是其对应的读取流的底层资源,其本身并不涉及底层资源调用

练习:模拟读一行数据的方法

LineNumberReader

带行号的字符缓冲区

方法:

getLineNumber    获取行标号

setLineNumber    设置行标号

readLine       读一行

扩展:键盘录入的读取录入信息原理和字符缓冲流读一行的原理一样,可以用转换流使键盘录入可以使用字符缓冲流的读一行方法

2、Writer

(1)共性方法:

close()     关闭此流资源,关闭前将流中的数据刷新到目的地中
flush()      将流的缓冲区中的数据刷到目的地中,刷新后还可以继续写入数据
write(char[] cbuf)     将字符数组中的数据写入到流中
write(char[] cbuf, int off, int len)    将字符数组中指定位置的数据写入到流中
write(int c)         将一个字符写入到流中
write(String str)    将字符串写入到流中
write(String str, int off, int len)    将字符串中指定位置的子串写入到流中


(2)OutputStreamWriter

描述:输出转换流,将字符流转换成字节流

可以指定写入数据的编码表,只有转换流可以使用指定编码表

FileWriter

OutputStreamWriter的子类,其实是相当于封装好了默认的编码表的转换流

构造

构造函数必须定义文件源,如果无法创建,则报异常

如果指定的位置没有该文件,则新建,如果有,则覆盖原有数据

FileWriter(String fileName)    构造函数接收一个要将流中数据写入文件的对应文件名

FileWriter(String fileName,boolean append)    append值为true时,将数据写在已有文件末尾处


(3)BufferedWriter

描述:

构造函数传入一个流对象(为了给流对象提高效率,所以必须要先有流对象)

缓冲区的资源来自于流对象,所以关闭缓冲区就是在关闭流对象的资源

只要用到缓冲区就要记得刷新

方法:

close   关闭流资源

flush    将流中的数据刷新到指定目的地

newLine    写入一个换行符到流中

代码示例:

[java] view plaincopyprint?
  1. /* 
  2. 需求:IO流代码示例 
  3. */  
  4.   
  5. import java.io.*;   //导入IO中的类  
  6.   
  7. //定义类  
  8. class  IODemo  
  9. {  
  10.     //主函数  
  11.     public static void main(String[] args) throws IOException//偷懒抛抛异常  
  12.     {  
  13.         //创建一个字符写入缓冲流,传入文件写入流对象,文件读取流的构造函数传入文件名,当文件不存在时会自动创建一个  
  14.         BufferedWriter bufw = new BufferedWriter(new FileWriter("IODemo.txt"));  
  15.   
  16.         //写一个字符  
  17.         bufw.write('好');  
  18.         bufw.flush();    //但凡写都要刷新  
  19.   
  20.         //写字符串  
  21.         bufw.write("字符流示例");  
  22.         bufw.newLine();  //写入一个换行符  
  23.         bufw.flush();  
  24.   
  25.         //写字符数组  
  26.         bufw.write(" 将字符数组写入流中".toCharArray());  
  27.         bufw.flush();  
  28.   
  29.         //创建一个字符读取缓冲流,传入要缓冲的读取流对象,文件读取流要关联被读取的文件,如果文件不存在则会报异常  
  30.         BufferedReader bufr = new BufferedReader(new FileReader("IODemo.txt"));  
  31.   
  32.         //读一个字符,返回的是一个int数值,所以要强制转换成char  
  33.         System.out.print((char)bufr.read());  
  34.   
  35.         //建立一个字符数组,用来缓冲读取流读到的字符  
  36.         char[] ch = new char[8];  
  37.   
  38.         //将读取的字符存入字符数组  
  39.         bufr.read(ch,0,4);  
  40.   
  41.         //循环读取数组里面的字符并打印  
  42.         for (int i = 0;i<4 ;i++ )  
  43.         {  
  44.             System.out.print(ch[i]);  
  45.         }  
  46.   
  47.         //读一行  
  48.         System.out.println(bufr.readLine());  
  49.   
  50.         //将读取的字符存入字符数组的指定位置的指定长度  
  51.         bufr.read(ch);  
  52.         //高级for打印数组里面的字符  
  53.         for(char c:ch)  
  54.         {  
  55.             System.out.print(c);  
  56.         }  
  57.   
  58.         //关闭流资源  
  59.         bufw.close();  
  60.         bufr.close();  
  61.     }  
  62. }  



(4)扩展

IO流类命名特点:四个基类的子类名后缀都是父类名,前面的是子类的功能

BufferReaderBufferWriter用了装饰设计模式

定义一个类,基于已有类的功能提供加强的功能,那么自定义的类称为装饰类

装饰类通常会通过构造方法接收被装饰的类,并基于该类的功能提供更强的功能

找到要装饰的类参数的共同类型,通过多态的形式,可以提高功能的扩展性

装饰类和被装饰类通常都属于同一个体系中的

装饰类比继承要灵活,避免了体系的臃肿,并且降低了类与类之间的关系

 





第三部分:字节流

1、InputStream

共性方法:

close()   关闭流资源

read()     读一个字节

read(byte[] b)    将字节读取到字节数组中

read(byte[] b, int off, int len)     将字节读取到字节数组的指定位置

FileInputStream


2、OutputStream

方法:

close()    关闭资源

flush()      强制刷新

write(byte[] b)     写字节数组

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

write(int b)     写一个字节

FileOutputStream

文件输出流

PrintStream

打印流

可用于:打印异常信息、打印系统属性信息

PrintStackTrace(···)

properties对象.ListnewPrintStream(流))

不可以用字符流来操作非文本文件

代码示例:

[java] view plaincopyprint?
  1. /* 
  2. 需求:IO字节流代码示例 
  3. */  
  4.   
  5. import java.io.*;   //导入IO中的类  
  6.   
  7. //定义类  
  8. class  IOStreamDemo  
  9. {  
  10.     //主函数  
  11.     public static void main(String[] args)  
  12.     {  
  13.         //复制非文本文件,分别创建一个文件字节读取流和写入流,读取流要有指定文件,写入流中的文件不存在则会自动创建  
  14.         FileInputStream fis = null;  
  15.         FileOutputStream fos = null;  
  16.   
  17.         try  
  18.         {  
  19.             //创建读取流和写入流对象  
  20.             fis = new FileInputStream("123.mp3");  
  21.             fos = new FileOutputStream("234.mp3");  
  22.               
  23.             //定义一个字节数组缓冲区  
  24.             byte[] by = new byte[1024];  
  25.             int len =0;    //定义一个int数值用于接收读取的字节长度  
  26.   
  27.             //如果读取没返回-1,则继续读取和写入  
  28.             while((len = fis.read(by))!=-1)  
  29.             {  
  30.                 //将读到的字节存入字节数组后,再写入字节输出流  
  31.                 fos.write(by,0,len);  
  32.                 fos.flush();    //将字节刷新到目的地  
  33.               
  34.             }  
  35.         }  
  36.         catch (IOException e)  //IO异常处理  
  37.         {  
  38.             e.printStackTrace();  
  39.         }  
  40.         finally  //关闭流资源一定要执行  
  41.         {  
  42.             //两个流分别关,分别try  
  43.             try  
  44.             {  
  45.                 //如果流对象存在才关  
  46.                 if (fis!=null)  
  47.                 {  
  48.                     fis.close();  
  49.                 }  
  50.             }  
  51.             catch (IOException e)  
  52.             {  
  53.                 e.printStackTrace();  
  54.             }  
  55.             try  
  56.             {  
  57.                 if (fos!= null)  
  58.                 {  
  59.                     fos.close();  
  60.                 }  
  61.             }  
  62.             catch (IOException ex)  
  63.             {  
  64.                 ex.printStackTrace();  
  65.             }  
  66.         }  
  67.     }  
  68. }  

练习;复制一张图片

 





第四部分:IO的操作思路及IO异常

1、操作IO流的思路

(1)明确源和目的;

1)源:

应用体系:

InputStream

Reader

源设备:

键盘 、硬盘(文件)、内存

2)目的:

应用体系:

OutputStream

Writer

目的设备:

控制台、硬盘(文件)、内存

(2)明确操作的数据类型;

纯文本数据:

应用体系:

Reader

Writer

非纯文本数据:

应用体系:

InputStream

OutputStream

2、IO异常处理

处理流程

1、如果创建流不成功,即没有获取到资源,后面的都不用再执行了,所以一起将创建流到对流的操作部分一起写入到一个try语句中

2、不管操作资源发生什么异常,到最后流的资源一定要回收,所以close方法一定要执行,所以close方法写在finally里面,并且要单独定义一个try语句处理close方法可能发生的异常

3、流有可能创建不成功,所以关闭流之前要判断流对象是否为空,如果为空则不用关

log4j:

是处理异常信息的网络资源包

 

 

本章总结:

1、IO流是Java用来处理设备间信息交换的机制,Java对数据的传输操作都是通过流完成的

2、IO流主要分字节流和字符流,字节流可以处理任意文件数据,字符流是专门用于处理文本文件的流,拥有处理文本文件的特有功能,用字符流处理非文本文件可能会发生错误,所以不要这样使用

3、不管是字节流还是字符流都具有输入流和输出流,通常情况下相应的输入流都有其对应的输出流,Java中流的命名特点是后缀都是父类名称,明朗的表现了它们的体系关系,而名称的前部分则是该流的功能属性

4、IO流使用了缓冲区,在原有功能基础上增强了流的功能,提高了流的效率,这种设计方式叫做装饰设计模式

5、在处理IO异常的时候要注意流的创建和操作中发生的异常,流创建后是有使用到系统的底层资源的,所以要记得关闭流资源以释放系统的底层资源,所以关闭资源的动作必须执行,关闭方法放在finally中执行,关闭流也可能发生异常,所以要在finally语句中在单独处理关闭流的异常

 


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

 




0 0
原创粉丝点击