黑马程序员——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的四大基类:
3、常用基本IO类:Reader 字符读取流 Writer 字符写入流
InputStream 字节读取流 OutputStream 字节写入流
(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 写入一个换行符到流中
代码示例:
- /*
- 需求:IO流代码示例
- */
- import java.io.*; //导入IO中的类
- //定义类
- class IODemo
- {
- //主函数
- public static void main(String[] args) throws IOException//偷懒抛抛异常
- {
- //创建一个字符写入缓冲流,传入文件写入流对象,文件读取流的构造函数传入文件名,当文件不存在时会自动创建一个
- BufferedWriter bufw = new BufferedWriter(new FileWriter("IODemo.txt"));
- //写一个字符
- bufw.write('好');
- bufw.flush(); //但凡写都要刷新
- //写字符串
- bufw.write("字符流示例");
- bufw.newLine(); //写入一个换行符
- bufw.flush();
- //写字符数组
- bufw.write(" 将字符数组写入流中".toCharArray());
- bufw.flush();
- //创建一个字符读取缓冲流,传入要缓冲的读取流对象,文件读取流要关联被读取的文件,如果文件不存在则会报异常
- BufferedReader bufr = new BufferedReader(new FileReader("IODemo.txt"));
- //读一个字符,返回的是一个int数值,所以要强制转换成char
- System.out.print((char)bufr.read());
- //建立一个字符数组,用来缓冲读取流读到的字符
- char[] ch = new char[8];
- //将读取的字符存入字符数组
- bufr.read(ch,0,4);
- //循环读取数组里面的字符并打印
- for (int i = 0;i<4 ;i++ )
- {
- System.out.print(ch[i]);
- }
- //读一行
- System.out.println(bufr.readLine());
- //将读取的字符存入字符数组的指定位置的指定长度
- bufr.read(ch);
- //高级for打印数组里面的字符
- for(char c:ch)
- {
- System.out.print(c);
- }
- //关闭流资源
- bufw.close();
- bufr.close();
- }
- }
(4)扩展
IO流类命名特点:四个基类的子类名后缀都是父类名,前面的是子类的功能
BufferReader、BufferWriter用了装饰设计模式
定义一个类,基于已有类的功能提供加强的功能,那么自定义的类称为装饰类
装饰类通常会通过构造方法接收被装饰的类,并基于该类的功能提供更强的功能
找到要装饰的类参数的共同类型,通过多态的形式,可以提高功能的扩展性
装饰类和被装饰类通常都属于同一个体系中的
装饰类比继承要灵活,避免了体系的臃肿,并且降低了类与类之间的关系
第三部分:字节流
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对象.List(newPrintStream(流))
不可以用字符流来操作非文本文件
代码示例:
- /*
- 需求:IO字节流代码示例
- */
- import java.io.*; //导入IO中的类
- //定义类
- class IOStreamDemo
- {
- //主函数
- public static void main(String[] args)
- {
- //复制非文本文件,分别创建一个文件字节读取流和写入流,读取流要有指定文件,写入流中的文件不存在则会自动创建
- FileInputStream fis = null;
- FileOutputStream fos = null;
- try
- {
- //创建读取流和写入流对象
- fis = new FileInputStream("123.mp3");
- fos = new FileOutputStream("234.mp3");
- //定义一个字节数组缓冲区
- byte[] by = new byte[1024];
- int len =0; //定义一个int数值用于接收读取的字节长度
- //如果读取没返回-1,则继续读取和写入
- while((len = fis.read(by))!=-1)
- {
- //将读到的字节存入字节数组后,再写入字节输出流
- fos.write(by,0,len);
- fos.flush(); //将字节刷新到目的地
- }
- }
- catch (IOException e) //IO异常处理
- {
- e.printStackTrace();
- }
- finally //关闭流资源一定要执行
- {
- //两个流分别关,分别try
- try
- {
- //如果流对象存在才关
- if (fis!=null)
- {
- fis.close();
- }
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- try
- {
- if (fos!= null)
- {
- fos.close();
- }
- }
- catch (IOException ex)
- {
- ex.printStackTrace();
- }
- }
- }
- }
练习;复制一张图片
第四部分:IO的操作思路及IO异常
1、操作IO流的思路
(1)明确源和目的;
1)源:
应用体系:
InputStreamReader
源设备:
键盘 、硬盘(文件)、内存
2)目的:
应用体系:
OutputStreamWriter
目的设备:
控制台、硬盘(文件)、内存
(2)明确操作的数据类型;
纯文本数据:
应用体系:
ReaderWriter
非纯文本数据:
应用体系:
InputStreamOutputStream
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培训、期待与您交流! -------
- 黑马程序员——JAVA基础-IO流(一)
- 黑马程序员——Java基础->IO流(上)
- 黑马程序员——java基础(IO流)
- 黑马程序员——Java基础--IO流(一)
- 黑马程序员——Java基础--IO流(二)
- 黑马程序员——Java基础--IO流(1)
- 黑马程序员——Java基础--IO流(2)
- 黑马程序员——Java基础--------IO流(一)
- 黑马程序员——Java基础--------IO流(二)
- 黑马程序员——Java基础--------IO流(三)
- 黑马程序员——JAVA基础----IO流(一)
- 黑马程序员——JAVA基础----IO流(二)
- 黑马程序员——Java基础---IO
- 黑马程序员——java基础--IO
- 黑马程序员——Java基础---IO
- 黑马程序员 Java基础——IO
- 黑马程序员—Java基础—IO
- 黑马程序员——Java基础——IO流笔记(IO流概述)
- 6.12
- Linux中Memcached安装与配置(CentOS-6.5:memcached-1.4.5)
- IOS开发中的CGFloat、CGPoint、CGSize和CGRect
- 解决win7上不能打开genymotion
- 如何在按钮中把文字放左边,图片放右边
- 黑马程序员——java基础(IO流)
- 连续子数组的最大和
- 黑马程序员学习日记--面向对象(一)
- p123第三章作业38题
- 在Win7上搭建FTP服务器
- c++中的构造函数和析构函数
- java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
- 黑马程序员——java基础(IO流其它类)
- Jquery中attributes和properties之间的差异