黑马程序员-----IO流


------- android培训java培训、期待与您交流! ----------




1  IO流概述

在Java中,将这种通过不同输入输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象表述为“流”,程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”位于java.io包中,称为IO(输入输出)流。

IO流有很多种,按照操作数据的不同,可以分为字节流和字符流,按照数据传输方向的不同又可分为输入流和输出流,程序从输入流中读取数据,向输出流中写入数据。在IO包中,字节流的输入输出流分别用 InputStream和OutputStream表示,字符流的输入输出流用Reader和Writer表示。



 

 

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

如:InputStream的子类FileInputStream。

如:Reader的子类FileReader

 

2  字符流

在程序中操作字符用到的是字符流,字符流有Reader和Writer,其中Reader是字符输入流,用于从某个源设备读取字符,Writer是字符输出流,用于向某个目标设备写入字符,下面对这两个流进行详细解说。


2.1  文件的写入方式(FileWriter)

 


2.1.1  文件的续写

如果不想让文件被覆盖,而是在原来的基础上续写,则只需用到FileWriter的构造函数

new  FileWriter(String address,boolean true)

 


 

2.2  IO异常处理方式


 

2.3  文件的读取方式(FileReader)

2.3.1  int read()方法

 


2.3.2  int read(char[])方法

 


2.4  拷贝文件(综合运用)


2.5  BufferedWriter 和 BufferedReader(缓冲技术)

缓冲区的出现提高了对数据的读写效率,缓冲区要结合流才可以使用,且必须要先有流对象,缓冲区在流的基础上对流的功能进行了增强。

BufferedWriter:BufferedWriter特有的换行功能newLine()

BufferedReader:BufferedReader特有的读取整行功能readLine()

 



2.6  装饰设计模式

当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能那么自定义的该类称为装饰类。装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能提供更强的功能。

 

装饰和继承的区别:

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

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。

 

 

运行结果:车型是Benz具有基本功能

  具有新型功能

 

3  字节流

3.1  字节流的读取写入操作

 


3.2  复制一个图片

 

3.3  通过字节流缓冲区复制图片

 

字节流缓冲区内部都定义了一个大小为8192的字节数组,当调用read()或者write()方法读写数据时,首先将读写的数据存入定义好的字节数组,然后将字节数组的数据一次性读写到文件中,从而有效的提高了数据的读写效率。

 

4  IO规律

4.1  转换流

字节输入流转换为字符输入流: InputStreamReader()

字节输出流转换为字符输出流: OutputStreamWriter()

 

需要特别注意的是,转换流不能操作图片,此时把字节流转换为字符流就会造成数据丢失。

 

4.2  流对象的基本规律

通过三个明确来完成。

1  明确源和目的。

源:输入流。 InputStream Reader

目的:输出流。OutputStream Writer

2  明确操作的数据是否是纯文本。

是:字符流。

不是:字节流。

3  当体系明确后,再明确要使用哪个具体的对象。通过设备来进行区分。

源设备:内存,硬盘,键盘

目的设备:内存,硬盘,控制台。

 

4.2.1  各种情况对应的流对象

1  文件夹----控制台(文本)

BufferedReader br = new BufferedReader(new FileReader(“Demo.txt”))

System.out.println

 

2  文件夹----文件夹(文本)

BufferedReader br = new BufferedReader(new FileReader(“Demo.txt”))

BufferedWriter bw = new BufferedWriter(new FileWriter(“DemoCopy.txt”))

 

3  文件夹----文件夹(图片)

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(“Demo.jpg”))

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(“Demo2.jpg”))

 

4  控制台----控制台

BufferedReader br = new BufferedReader(new InputStreamReader(System.in))

System.out.println()

 

5  控制台----文件夹

BufferedReader br = new BufferedReader(new InputStreamReader(System.in))

BufferedWriter bw = new BufferedWriter(new FileWriter())

 

4.3  改变标准输入输出流

在System类中定义了三个常量:in、out和err,它们被习惯性地称为标准输入输出流。其中,in为InputStream类型,它是标准输入流,默认情况下用于读取键盘输入的数据;out为PrintStream类型,它是标准输出流,默认将数据输出到命令行窗口;err也是PrintStream类型,它是准备错误流,它和out一样也是将数据输出到控制台,不同的是err通常输出的是应用程序运行时的错误信息。

通过改变标准输入输出流来复制一个文本

 



5  File类

File类用于封装一个路径,这个路径可以是从系统盘开始的绝对路径,如:D:\file\a.txt也可以是相对于当前目录而言的相对路径,如src\Hello.java。File类内部封装的路径可以指向一个文件,也可以指向一个目录,在File类中提供了这些文件或目录的常规操作。


方法声明

功能描述

Boolean exists()

判断File对象对应的文件或目录是否存在

Boolean delete()

删除File对象对应的文件或目录

Boolean createNewFile()

当File对象对应的文件不存在时,该方法会创建一个此File对象指定的新文件

String getName()

返回File对象表示的文件或文件夹名称

String getPath()

返回File对象对应的路径

String getAbsolutePath()

返回File对象对应的绝对路径

String getParent()

返回File对象对应目录的父目录

Boolean isFile()

判断File对象对应的是否是文件

Boolean isDirectory()

判断File对象对应的是否是目录

Boolean isAbsolute()

判断是否是绝对路径

String[] list()

列出指定目录的全部名称

File[] listFiles()

返回所有子文件和子目录的File数组

 

5.1  文件的遍历

 

 

5.2  文件的删除

 

 

5.3  把所有子文件的绝对路径存储到记事本中

 

5.4  Properties集合

Properties集合主要用来存储字符串类型的键和值,在实际开发中,经常使用Properties集合来存储字符串类型的键和值。Properties集合是Hashtable的子类,也是Map接口的子类


方法声明

功能描述

void setProperty(String key,String value)

添加键值

String getProperty(String key)

根据键获取相应的值

Enumeration propertyNames()

获取Enumeration对象所有键的枚举

void load(InputStream read)

用输入流把键值对存入集合

void store(OutputStream writer)

用输出流把集合信息存入输出位置

 

应用:写一个限制用户使用次序的程序,当达到某个次数时会弹出信息


 


6  其他流对象

6.1  PrintWriter打印流

最好用的输出流:

PrintWriter pw = new PrintWriter(new FileWriter("leo.java"),true)  只有流才可以使用true,不需要刷新且可以使用println

pw.println("...");

 


 

6.2  合并流

 

 


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值