黑马程序员---Java之IO
来源:互联网 发布:网络连接图标显示红叉 编辑:程序博客网 时间:2024/04/29 07:45
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
IO流:用于处理设备上数据。流可以理解数据的流动,就是一个数据流。IO流最终要以对象来体现,对象都存在IO包中。
流分为两种:输入流(读)和输出流(写)。因为处理的数据不同,分为字节流和字符流。
①字符流:Reader Write,因为字符每个国家都不一样,所以涉及到了字符编码问题,那么GBK编码的中文用unicode编码解析是有问题的,所以需要获取中文字节数据的同时+ 指定的编码表才可以解析正确数据。为了方便于文字的解析,所以将字节流和编码表封装成对象,这个对象就是字符流。只要操作字符数据,优先考虑使用字符流体系。
Reader:用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。详细方法请查阅API。
Writer:写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。详细方法请查阅API。
②字节流:InputStream OutputStream,处理字节数据的流对象。设备上的数据无论是图片或者dvd,文字,它们都以二进制存储的。二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小数据单元就是字节。意味着,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据。
InputStream:是表示字节输入流的所有类的超类。详细方法请查阅API。
OutputStream:此抽象类是表示输出字节流的所有类的超类。详细方法请查阅API。
流的操作只有两种:读和写
流的体系因为功能不同,但是有共性内容,不断抽取,形成继承体系。该体系一共有四个基类,而且都是抽象类。在这四个系统中,它们的子类,都有一个共性特点:子类名后缀都是父类名,前缀名都是这个子类的功能名称。
public static void main(String[] args)throws IOException { //读、写都会发生IO异常
/*
1:创建一个字符输出流对象,用于操作文件。该对象一建立,就必须明确数据存储位置,是一个文件。
2:对象产生后,会在堆内存中有一个实体,同时也调用了系统底层资源,在指定的位置创建了一个存储数据的文件。
3:如果指定位置,出现了同名文件,文件会被覆盖。
*/
FileWriterfw = new FileWriter("demo.txt"); // FileNotFoundException
/*
调用Writer类中的write方法写入字符串。字符串并未直接写入到目的地中,而是写入到了流中,(其实是写入到内存缓冲区中)。怎么把数据弄到文件中?
*/
fw.write("abcde");
fw.flush(); // 刷新缓冲区,将缓冲区中的数据刷到目的地文件中。
fw.close(); // 关闭流,其实关闭的就是java调用的系统底层资源。在关闭前,会先刷新该流。
}
close()和flush()的区别:
flush():将缓冲区的数据刷到目的地中后,流可以使用。
close():将缓冲区的数据刷到目的地中后,流就关闭了,该方法主要用于结束调用的底层资源。这个动作一定做,一般在处理异常后在finally执行。
FileWriter写入数据的细节:
1:window中的换行符:\r\n两个符号组成。 linux:\n。
2:续写数据,只要在构造函数中传入新的参数true。
3:目录分割符:window \\ /
FileReader读入数据:使用Reader体系,读取一个文本文件中的数据。返回-1 ,标志读到结尾。
import java.io.*;
class FileReaderDemo {
publicstatic void main(String[] args) throws IOException {
/*
创建可以读取文本文件的流对象,FileReader让创建好的流对象和指定的文件相关联。
*/
FileReader fr = newFileReader("demo.txt");
int ch = 0;
while((ch = fr.read())!= -1) {//条件是没有读到结尾
System.out.println((char)ch); //调用读取流的read方法,读取一个字符。
}
fr.close();
}
}
--------------------------------------------------------------------------------------------------------------------
读取数据的第二种方式:第二种方式较为高效,自定义缓冲区。
import java.io.*;
class FileReaderDemo2 {
publicstatic void main(String[] args) throws IOException {
FileReaderfr = new FileReader("demo.txt"); //创建读取流对象和指定文件关联。
//因为要使用read(char[])方法,将读取到字符存入数组。所以要创建一个字符数组,一般数组的长度都是1024的整数倍。
char[]buf = new char[1024];
intlen = 0;
while((len=fr.read(buf)) != -1) {
System.out.println(newString(buf,0,len));
}
fr.close();
}
}
--------------------------------------------------------------------------------------------------------------------
IO中的使用到了一个设计模式:装饰设计模式。
装饰设计模式解决:对一组类进行功能的增强。
包装:写一个类(包装类)对被包装对象进行包装;
1、包装类和被包装对象要实现同样的接口;
2、包装类要持有一个被包装对象;
3、包装类在实现接口时,大部分方法是靠调用被包装对象来实现的,对于需要修改的方法我们自己实现;
--------------------------------------------------------------------------------------------------------------------
缓冲区是提高效率用的:
BufferedWriter:是给字符输出流提高效率用的,那就意味着,缓冲区对象建立时,必须要先有流对象。明确要提高具体的流对象的效率。
BufferedReader:同上,只是它是用于读入。
读取键盘录入:
BufferedReaderbufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriterbufw = new BufferedWriter(new OutputStreamWriter(System.out));//输出到控制台
Stringline = null;
while((line=bufr.readLine())!=null){
bufw.write(line.toUpperCase());//将输入的字符转成大写字符输出
bufw.newLine();
bufw.flush();
}
bufw.close();
bufr.close();
------------------------------
总结:流对象其实很简单,就是读取和写入。但是因为功能的不同,流的体系中提供N多的对象。那么开始时,到底该用哪个对象更为合适呢?这就需要明确流的操作规律。
流的操作规律:
1,明确源和目的。
数据源:就是需要读取,可以使用两个体系:InputStream、Reader;
数据汇:就是需要写入,可以使用两个体系:OutputStream、Writer;
2,操作的数据是否是纯文本数据?
如果是:数据源:Reader
数据汇:Writer
如果不是:数据源:InputStream
数据汇:OutputStream
3,虽然确定了一个体系,但是该体系中有太多的对象,到底用哪个呢?
明确操作的数据设备。
数据源对应的设备:硬盘(File),内存(数组),键盘(System.in)
数据汇对应的设备:硬盘(File),内存(数组),控制台(System.out)。
4,需要在基本操作上附加其他功能吗?比如缓冲。
如果需要就进行装饰。
- 黑马程序员---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流一
- Grails,移动互联网时代服务器端开发的利器
- 互联网合并史:一路相杀,直到相爱
- 【BZOJ 3571】 [Hnoi2014]画框
- HDU-1286-找新朋友
- 二叉树的基本应用
- 黑马程序员---Java之IO
- UVA 10785 解题报告
- 练习场ACM 第1036题(非洲小孩)
- Python字符串的encode与decode研究心得乱码问题解决方法
- Error Code: 1054. Unknown column 'age' in 'user'
- 锁与CompareAndSwap
- 黑马程序员——Eclipse的常用快捷键备忘
- Hadoop2.2.0集群搭建(HA,联邦,yarn)
- 彻底解决 error: Unable to find vcvarsall.bat