Java学习笔记之IO流

来源:互联网 发布:最出名的网络作家 编辑:程序博客网 时间:2024/05/22 10:49

1.FileReader工作原理

2.Read方法通过字符数组读取文件原理

3.复制文件

c盘下的文件复制到d盘步骤:

1.D盘创建一个文件,用于存储c盘文件中的数据

2.定义读取流和盘文件关联

3.通过不断的读写完成数据存储

 

4.装饰设计模式以及其和继承的区别

/*

装饰设计模式:

当想要对已有的对象进行功能增强时,

可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。

那么自定义的该类称为装饰类。

 

装饰类通常会通过构造方法接收被装饰的对象。

并基于被装饰的对象的功能,提供更强的功能。

 

装饰和继承

 

MyReader//专门用于读取数据的类。

    |--MyTextReader

        |--MyBufferTextReader

    |--MyMediaReader

        |--MyBufferMediaReader

    |--MyDataReader

        |--MyBufferDataReader

 

class MyBufferReader

{

    MyBufferReader(MyTextReader text)

    {}

    MyBufferReader(MyMediaReader media)

    {}

}

上面这个类扩展性很差。

找到其参数的共同类型。通过多态的形式。可以提高扩展性。

 

class MyBufferReader extends MyReader

{

    private MyReader r;

    MyBufferReader(MyReader r)

    {}

}  

 

 

MyReader//专门用于读取数据的类。

    |--MyTextReader

    |--MyMediaReader

    |--MyDataReader

    |--MyBufferReader//装饰类

 

 

以前是通过继承将每一个子类都具备缓冲功能。

那么继承体系会复杂,并不利于扩展。

 

现在优化思想。单独描述一下缓冲内容。

将需要被缓冲的对象。传递进来。也就是,谁需要被缓冲,谁就作为参数传递给缓冲区。

这样继承体系就变得很简单。优化了体系结构。

 

装饰模式比继承要灵活。避免了继承体系臃肿。

而且降低了类于类之间的关系。

 

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。

所以装饰类和被装饰类通常是都属于一个体系中的。

 

*/

注意:read方法返回的是int类型而不是byte类型  这是为了避免-1的发生

Byte类型用一个字节   而int类型用4个字节   

byte类型为8个连续的1时表示-1,此时read方法无法进行    

而当用int类型时需要用32个二进制位表示   此时可以避免-1的产生

Read方法在向上做提升  而write方法在做强转,只写最低的一个字节

7.键盘录入----转换流InputStreamReader的使用

总结:字符流:FileReader  FileWriter   

              BufferedReader   BufferedWriter

      字节流:FileInputStream    FileOutputStream

              BufferedInputStream   BufferedOutputStream

readLine方法是字符流BufferedReader的方法

Read方法是字节流InputStream的方法

InputStreamReader是字节流通向字符流的桥梁

键盘录入最常见写法:

BufferedReader  br=new BufferedReadernew InputStreamReaderSystem.in));

8.流操作的基本规律

通过三个明确:

1.明确源和目的

 源:输入流  InputStream     Reader

 目的:输出流   OutputStream     Writer

2.操作的数据是否为纯文本

  ----字符流-----Reader    Writer

  不是-----字节流------InputStream   OutputStream

3.当体系明确后 ,还要明确使用哪个具体的对象

  通过设备来区分:

  源设备:硬盘  内存  键盘

  目的设备:硬盘 内存  控制台

 

(1)将一个文本文件中数据存储到另一个文件中,复制文件

源:读取流----InputStream    Reader

是不是纯文本文件   -----字符流-----Reader

明确设备    硬盘----FileReader

是否高效读取   -----BufferedReader

FileReader  fr=new FileReader|(“E:\\1.txt”);

BufferedReader br=new BufferedReaderfr);

 

目的:输出流----OutputStream   Writer

是不是纯文本   -----字符流-----Writer

明确设备    硬盘------FileWriter

是否高效存取   ----BufferedWriter

FileWriter  fw=new FileWriter(“E:\\2.txt”);

BufferedWriter bw=new BufferedWriter(fw);

 

(2)将一个图片文件复制到另一个文件中 ,复制图片

源:  读取流-----ImportStream    Reader

  是否是纯文本---不是------字节流------ImportStream

明确设备   硬盘---FileImportStream

是否需要提高效率--------BufferedImportStream

FileImportStream fis=new FileImportStream(“E\\1.jpg”)

BufferedImportStream bufis=new BufferedImportStream(fis);

 

目的:输出流---OutputStream   Writer

是否是纯文本------不是------字节流--------OutputStream

明确设备   硬盘---FileOutputStream

是否需要提高效率-------------BufferedOutputStream

 

FileOutputStream  fos=new FileOutputStream(“E\\2.jpg”);

BufferedOutputStream bufos=new BufferedOutputStreamfos);

 

(3)将键盘录入的数据保存到一个文件中

源:InputStream   Reader

是否是纯文本------------字符流----Reader

明确设备----键盘------System.in-----System.in对应的是字节流

所以为了操作键盘的文件数据方便,转成字符流按照字符串的操作是最方便的

那么就将System.in转换成Reader,用Reader体系中的转换流InputStreamReader

InputStreamReader isr=new InputStreamReaderSystem.in

需要提高效率吗--------需要----------BufferedReader

BufferedReader bufr=new BufferedReaderisr);

 

目的:OutputStream   Writer

是否是纯文本----------字符流-----Writer

明确设备-------硬盘-------FileWriter

FileWriter  fw=new FileWriter(“1.txt”);

是否需要提高效率------------BufferedWriter

BufferedWriter bw=new BufferedWriterfw);

 

*****拓展:把录入的数据按照指定的编码表(utf-8),将数据保存到文件中

目的:OutputStream  Writer

是否是纯文本--------Writer

明确设备-----硬盘----FileWriter---------FileWriter使用的是默认的编码表GBK

但是存储时,需要加入指定的编码表utf-8,而指定的编码表只有转换流可以指定,所以要使用的对象是OutputStreamWriter

FileOutputStream(File file) 
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

而该转换流对象需要接收一个字节输出流,而且还可以操作文件的字节输出流-------FileOutputStream

OutputStreamWriter(OutputStream out,String charsetName) 
创建使用指定字符集的 OutputStreamWriter。

 

OutputStreamWriter  osw=new OutputStreamWriternew FileOutputStream(“1.txt”),“utf-8”);

 

是否需要提高效率---------BUfferedWriter

BufferedWriter  bw=new BufferedWriterosw);

通常涉及到字符编码转换时需要用到转换流

 

 

 

 

 

原创粉丝点击