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 BufferedReader(new InputStreamReader(System.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 BufferedReader(fr);
目的:输出流----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 BufferedOutputStream(fos);
(3)将键盘录入的数据保存到一个文件中
源:InputStream Reader
是否是纯文本--------是----字符流----Reader
明确设备----键盘------System.in-----System.in对应的是字节流
所以为了操作键盘的文件数据方便,转成字符流按照字符串的操作是最方便的
那么就将System.in转换成Reader,用Reader体系中的转换流InputStreamReader
InputStreamReader isr=new InputStreamReader(System.in);
需要提高效率吗--------需要----------BufferedReader
BufferedReader bufr=new BufferedReader(isr);
目的:OutputStream Writer
是否是纯文本-----是-----字符流-----Writer
明确设备-------硬盘-------FileWriter
FileWriter fw=new FileWriter(“1.txt”);
是否需要提高效率----是--------BufferedWriter
BufferedWriter bw=new BufferedWriter(fw);
*****拓展:把录入的数据按照指定的编码表(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 OutputStreamWriter(new FileOutputStream(“1.txt”),“utf-8”);
是否需要提高效率----是-----BUfferedWriter
BufferedWriter bw=new BufferedWriter(osw);
通常涉及到字符编码转换时需要用到转换流
- java学习笔记之IO流
- java学习笔记之IO流
- [学习笔记]Java IO之字节流
- [学习笔记]Java IO之字符流
- java学习笔记之IO流
- [学习笔记]Java IO之字节流
- [学习笔记]Java IO之字符流
- 学习笔记之--JAVA IO流
- Java学习笔记之IO流
- Java学习笔记之IO
- java学习笔记--IO流
- Java IO流学习笔记
- java IO流学习笔记
- Java IO流 学习笔记
- java学习笔记-IO流
- Java学习笔记:IO流
- Java学习笔记-IO流
- Java IO流学习笔记
- 2017 多校3 1008 RXD and math
- 高通平台读写nv总结
- 前端 后端的基本 交互(后端 scala)(一)
- Joomla如何发送一封 简单的&&复杂的 邮件
- 逻辑运算符,位运算符以及三目运算符总结
- Java学习笔记之IO流
- 我 对 数论的学习
- Oculus VR SDK实现-Oculus针对大量显示数据的buffer设计
- Linux 下的 FFmpeg 安装编译环境配置总结
- 微信小程序之你不可不知的调试技巧
- ARKit & OpenGL ES
- 怎样从0开始搭建一个测试框架_3——参数化
- swift3
- js new 发生了什么