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 合并流