您的位置:首页 > 职场人生

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

2015-05-02 20:13 267 查看
------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?

/*

需求: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(流))

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

代码示例:

[java] view
plaincopyprint?

/*

需求: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)源:

应用体系:

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培训、期待与您交流! -------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: