java中的IO操作(一)【个人笔记】

来源:互联网 发布:软件服务外包合同范本 编辑:程序博客网 时间:2024/04/30 10:12

关于IO操作,先从输入流和输出流这两个概念讲起

输入流和输出流相对于内存而言


将外设中的数据读取到内存中:输入
将内存的数写道外设中:输出


字符流的由来:
其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的字符
再对这个字符进行操作。简单说:字节流+编码表


字节流的两个顶层父类
1.InputStream
2.OutputStream

字符流的两个顶层父类
1.Reader(输入)
2.Writer(输出)

需求一:将一些文字存储到硬盘一个文件中
注意:如果要操作文字数据,建议优先考虑字符流
而且要将数据从内存写到硬盘上,要使用字符流中的输出流。Writer
硬盘的数据基本体现是文件。须使用一个可以操作文件的Writer
——FileWriter


需求二:读取一个文本文件,将读取到的字符打印到控制台




需求三:将F盘的一个文本文件复制到D盘
原理:读写


--------------------------------------------------------
字符流缓冲区:
BufferedWriter
: newLine();


BufferedReader
: read(); 从缓冲区中取出的字符数据。覆盖了父类中的read方法
: readLine(); 使用了读取缓冲区的read方法,将读取到的字符进行缓冲
(存储到一个临时容器)并判断换行标记,将不包含换行标记的字符串返回


装饰设计模式:
对一组对象的功能进行增强时,就可以使用该模式进行问题的解决
对某一类进行了外观的改变,本质不变,增强其功能

装饰和继承都能实现一样的特点:进行功能的扩展增强
有什么区别呢?


首先有一个继承体系
Writer
TextWriter:用于操作文本
MediaWriter:用于操作媒体

想要对操作的动作进行效率的提高
按照面向对象,可以通过继承对具体的进行功能的扩展


Writer
TextWriter:用于操作文本
BufferTextWriter:加入了缓冲技术的操作文本的对象
MediaWriter:用于操作媒体
BufferMediaWriter:

到这里。发现,不太理想
如果这个体系进行功能扩展,又多了流对象
那么这个流要提高效率,是不是也要产生子类呢?
若是,此时发现只为提高功能进行的继承将导致
继承体系越来越臃肿,丧失灵活度


那么,重新考虑这个这个问题
既然加入的额都是同一种技术——缓冲
前一种是让缓冲和具体的对象相结合
在此,可否将缓冲进行单独的封装,哪个对象需要缓冲就将哪个对象和缓冲关联


class Buffer {
Buffer(TextWriter w) {}
Buffer(MediaWriter w) {}
}
class BufferedWriter extends Writer {
Buffer (Writer w) {}
}


此时,原本体系现变成。。。
Writer
TextWriter:用于操作文本
MediaWriter:用于操作媒体
BufferWriter:用于提高效率

结论:装饰比继承更灵活


特点:装饰类和被装饰类都必须所属同一个接口或者父类


--------------------------------------------------------


转换流:
InputStreammReader:字节到字符的桥梁。解码
OutputStreamWriter:字符到字节的桥梁。编码


流的操作规律:
之所以要弄清楚这个规律,是因为流对象太多,开发时不知道用哪个对象合适


开发时使用哪些对象,需要通过四个明确:
1.明确源和目的
源:InputStream Reader
目的:OutputStream Writer

2.明确数据是否是纯文本数据
源:是纯文本:Reader
否:InputStream
目的:是纯文本:Writer
否:OutputStream
至此,可以明确需求中具体要使用哪个体系

3.明确具体设备
源设备:
硬盘:File
键盘:System.in
内存:数组
网络:Socket

目的设备:
硬盘:File
控制台:System.out
内存:数组
网络:Socket流

4.是否需要哦其他额外功能
1.是否需要高效(缓冲区)
是-》加上Buffered
2.是否需要转换
是-》InputStreamReader(...)
OutputStreamWriter(...)


****【示例】****:
需求1:复制一个文本文件
1.明确源和目的
源:InputStream Reader
目的:OutputStream Writer
2.是否是纯文本?
是-》源:Reader 目的:Writer
3.明确具体设备
  源:硬盘 File->FileReader fr = new FileReader("");
目的:硬盘 File->FileWriter fw = new FileWriter("");
4.需要额外功能吗?
需要高效。
BufferedReader bufr = new BufferedReader(new FileReader(""));
BufferedWriter bufw = new BufferedWriter(new FileWriter(""));

需求2:读取键盘输入信息,并写入到一个文件中
1.明确源和目的
源:InputStream FileReader
目的:OutputStreamFileWriter
2.明确是否纯文本?
源:不是-》InputStream
目的:是-》FileWriter
3.明确具体设备
源:键盘 System.in->InputStream input = System.in;
目的:硬盘 File->FileWriter fw = new FileWriter("");
4.明确是否需要额外功能
需要转换和高效。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new FileWriter(""));


需求3:将一个文本文件数据显示到控制台
1.
2.
3.明确具体设备
源:硬盘 File-》FileReader fr = new FileReader("");
目的:控制台 System.out-》OutpurStream out = System.out;
4.明确额外功能
需要转换
OutputStreamWriter osw = new OutputStreamWriter(System.out);
需要高效
BufferedReader bufr = new BufferReader(new FileReader(""));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));


需求4:读取键盘输入信息显示到控制台
1.明确源和目的
源:InputStream FileReader
目的:OutputStream FileWriter
2.明确是否文本文件
源:不是 InputStream
目的:不是 OutputStream
3.明确设备
源:键盘 InputStream in = System.in;
目的:控制台 OutputStream out = System.out;
4.明确额外功能
需要转换
InputStreamReader isr = new InputStreamReader(System.in);
OutputStreamWriter osw = new OutputStreamWriter(System.out);
需要高效
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));


===============================================


需求5:将一个中文字符串数据按照指定的编码表写入到一个文本文件中
1.目的:OutputStream Writer
2.是纯文本
3.硬盘 File-》FileWriter fw = new FileWriter("");


注意:既然需求中已经明确了指定编码表的动作
那就不可以使用FileWriter,因为FileWriter内部是使用默认的本地码表
只能使用父类-》OutputStreamWriter
OutputStreamWriter接收一个字节输出流对象,既然是操作文件,那么该
对象应该是FileOutputStream
-》OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(""), [编码格式]);

什么时候使用转换流?
1.源或者目的对应的设备是字节流,但操作的却是文本数据,可以使用转换流作为桥梁,
提高堆文本操作的便捷
2.一旦操作文本涉及到具体的指定编码表时,必须使用转换流

--------------------------------------------------------


File类
将文件封装成File对象的一个实例,体现了java中面向对象得到思想

常见方法有:
exists();
createNewFile();\mkdir();\makdis();
delete();
isFile();\isDirectory();
list();
getName();
getLenth();
getPath();\getAbsolutePath();

这里补充以下过滤器接口的使用——FileNameFilter
通过实现FileNAmeFilter接口中的accept(File dir, String name)方法来过滤掉非目标文件
1 0