黑马程序员——java基础(IO流)
2015-05-02 20:13
267 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
第十一章:java基础(IO流)
本章概述:
第一部分:IO体系
第二部分:字符流
Reader、Writer
第三部分:字节流
InputStream、OutputStream
第四部分:IO流的操作思路及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 文件写入流
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 读一行
扩展:键盘录入的读取录入信息原理和字符缓冲流读一行的原理一样,可以用转换流使键盘录入可以使用字符缓冲流的读一行方法
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用了装饰设计模式
定义一个类,基于已有类的功能提供加强的功能,那么自定义的类称为装饰类
装饰类通常会通过构造方法接收被装饰的类,并基于该类的功能提供更强的功能
找到要装饰的类参数的共同类型,通过多态的形式,可以提高功能的扩展性
装饰类和被装饰类通常都属于同一个体系中的
装饰类比继承要灵活,避免了体系的臃肿,并且降低了类与类之间的关系
close() 关闭流资源
read() 读一个字节
read(byte[] b) 将字节读取到字节数组中
read(byte[] b, int off, int len) 将字节读取到字节数组的指定位置
FileInputStream
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();
}
}
}
}
练习;复制一张图片
1)源:
应用体系:
InputStream
Reader
源设备:
键盘 、硬盘(文件)、内存
2)目的:
应用体系:
OutputStream
Writer
目的设备:
控制台、硬盘(文件)、内存
(2)明确操作的数据类型;
纯文本数据:
应用体系:
Reader
Writer
非纯文本数据:
应用体系:
InputStream
OutputStream
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流)
本章概述:
第一部分: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培训、期待与您交流! -------
相关文章推荐
- 黑马程序员——Java基础---IO流(File类、Properties类、其他流)
- 黑马程序员--Java基础学习之IO流之字节流、字符流、读取写入文件、Copy文件、键盘输入输出、流操作的基本规律
- 黑马程序员__java基础__IO流(字节流、字符流)
- 黑马程序员_Java基础_IO流_字符流,带缓冲区的字符流,文本文件读写
- 黑马程序员-Java语言基础– IO流 第19天
- 黑马程序员--Java基础--IO流(三)
- 黑马程序员——java基础知识之IO流(二)
- 黑马程序员——Java基础——IO流笔记(SequenceInputStream使用示例)
- 黑马程序员——Java基础——IO流(一)
- 黑马程序员——java基础---IO流(第18天)
- 黑马程序员--Java基础之IO流(1)
- 黑马程序员——Java基础之IO流
- 黑马程序员——java基础--IO流(篇一)
- 黑马程序员——java基础之IO流
- 黑马程序员-java基础IO流(1)
- 黑马程序员---Java基础--IO流
- 黑马程序员---Java基础--20天(IO流之三)
- 黑马程序员-Java语言基础 – IO流 第20-21天
- 黑马程序员__java基础__IO流(File流、其它流)
- 黑马程序员----JAVA基础----IO流_2