黑马程序员_IO_字符流

来源:互联网 发布:快乐十分装机软件 编辑:程序博客网 时间:2024/05/01 13:13

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

一、IO流
close()和flush()的区别?
1, 调用flush,可以将数据刷到目的地中,流依然存在,可以继续使用。
调用close,可以将数据刷到目的地中,流已被关闭。不能继续使用。最后使用。
2, close不仅刷新缓冲区,还关闭底层资源。


FileReader(file)如果文件不存在,则会抛文件找不到异常。

调用Reader中的read方法,一次读取一个字符。作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1 

调用读取流的read(char[]),将读到的字符存储到字符数组中。返回读取的字符数量,如果已到达流的末尾,则返回 -1 

FileWriter(file)创建对象,运行时就会创建指定的文件,因为写入数据必须先有数据存储的目的。 如果要创建的文件已经存在,则会覆盖。


如果在构造时,传入第二个参数为true,将在原有文件末尾处进行续写。
FileWriter fw = new FileWriter("demo.txt",true);

每一段数据都有一个开始标识和结束标识

FileWriter的内部的缓冲区是字节缓冲区

数据存储单元一次4k

缓冲区是为了提高流的效率而存在的,实际是流在调用系统的的底层资源,缓冲区仅仅是将数据进行了缓冲而已,最终写到硬盘上的还是流。
所以缓冲区的close()方法里面调用的实际是流的关闭动作。

二、字符流
1、字符流的理解,由来和作用
用于操作字符数据的编辑类。
同一类型的数据被不同的编码所解析。将字节流和编码表封装成对象,用于操作字符数据,这就有了字符流对象。

2、通过缓冲区对文本文件进行复制。

public static void copyText() {/* * 复制使用数组缓冲区完成。 *  *///1,创建读取流和写入流。FileReader fr = null;FileWriter fw = null;try {fr = new FileReader("temp\\CopytTextTest.java");fw = new FileWriter("temp\\demo_copy2.txt");//定义一个缓冲区数组。char[] buf = new char[1024];int len = 0;while((len=fr.read(buf))!=-1){fw.write(buf,0,len);//读取几个就写几个。}} catch (Exception e) {e.printStackTrace();}finally{if(fw!=null)try {fw.close();} catch (Exception e2) {throw new RuntimeException("写入关闭失败");}if(fr!=null)try {fr.close();} catch (Exception e2) {throw new RuntimeException("读取关闭失败");}}}

public static void copyTextByBuffer() throws IOException {//1,创建流对象和缓冲区对象。FileReader fr = new FileReader("temp\\buf.txt");BufferedReader bufr = new BufferedReader(fr);FileWriter fw = new FileWriter("temp\\buf_copy.txt");BufferedWriter bufw = new BufferedWriter(fw);//2,读取到的一行文本String line = null;while((line=bufr.readLine())!=null){bufw.write(line);bufw.newLine();bufw.flush();}bufw.close();bufr.close();}



4、装饰设计模式
装饰模式:为了解决给类的功能进行增强而出现的。
 
Writer
|--TextWriter
|--MediaWriter
 
想要对流对象的功能进行增强,比如提高写入的效率。
使用缓冲技术。
Writer
|--TextWriter
|--BufferedTextWriter
|--MediaWriter
|--BufferedMediaWriter
 
每一个子类这样实现是可以的,但是导致继承体系较为臃肿。
发现其实无论哪个子类需要高效,使用的都是缓冲技术。
干脆将缓冲技术进行单独的描述和封装。
要缓冲区谁,就将谁传给缓冲区。
BufferdWriter
 
class BufferedWriter extends Writer
{
BufferedWriter(Writer w)
{}
}
 
装饰设计模式。
Writer
|--TextWriter
|--MediaWriter
|--BufferedWriter
 
装饰类和被装饰的特点:
1,装饰类中的构造函数需要接受被装饰类。
2,装饰类和被装饰类应该所属于同一个体系。

0 0