---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
IO流概述
IO流用来处理设备之间的数据传输;
Java对数据的操作是通过流的方式;
Java用于操作流的对象都在IO包中;
流按操作数据分为两种:
字节流和字符流;
流按流向分为:
输入流,输出流。
字节流的抽象基类:
InputStream,OutputStream
字符流的抽象基类:
Reader,Writer;
流操作的基本规律:
1、明确源和目的;
2、操作的数据是否为纯为本;
3、当体系明确后,在明确要使用哪个具体的对象。
FileWriter,FileReader类:
操作流程:
1、创建相应的流对象,该对象被初始化时必须要明确被操作的文件。而且该文件会被创建到指定
目录下。如果该目录下已有同名文件,将被覆盖(调用第一个构造函数)。
2、进行相应的读写操作;
3、是否需要进行刷新操作,如果需要,则需要进行刷新;
4、关闭流,释放资源。
示例代码:
FileWriter:
- class FileWriterDemo {
- public static void main(String[] args) throws IOException {
- /*创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
- 而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
- 其实该步就是在明确数据要存放的目的地。*/
- FileWriter fw = new FileWriter("demo.txt");
- //调用write方法,将字符串写入到流中。
- fw.write("abcde");
- /*刷新流对象中的缓冲中的数据。
- 将数据刷到目的地中。*/
- //fw.flush();
- /*关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。
- 将数据刷到目的地中。
- 和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
- */ fw.close();
- }
- }
FileReader:
- public static void main(String[] args) throws IOException {
- FileReader fr = new FileReader("DateDemo.java");//创建FileReader流对象
- char[] buf = new char[1024]; //创建一个缓冲区
- int num = 0;
- while((num=fr.read(buf))!=-1) { //循环读取文件,读到文件末尾则返回-1
- System.out.print(new String(buf,0,num)); //打印读取的内容
- }
- fr.close(); //关闭资源
- }
文件的续写:
通过构造方法创建可续写文件的流对象。
- public static void main(String[] args) throws Exception {
- FileWriter fw = new FileWriter("demo.text",true);//续写,不覆盖已有的文件
- fw.write("abc");
- fw.close();
- }
文件拷贝代码片段:
通过FileReader读取指定文件中的内容,创建一个1M大小字符数组缓冲区,再由FileWriter流对象
写入指定的目标文件。
- public static void copy_2() throws Exception {
- FileReader fr = new FileReader("D:\\testsrc.txt");//创建FileReader对象指向要读取的文件
- FileWriter fw = new FileWriter("D:\\dest.txt");//创建FileWriter对象指向要写入的目的文件
- int len = 0;
- char[] buf = new char[1024];//创建一个缓冲区
- while((len=fr.read(buf)) != -1) { //读取文件内容
- fw.write(buf,0,len);//写入文件内容
- }
- //释放资源
- fr.close();
- fw.close();
- }
字符流的缓冲区:
缓冲区的出现提高了对数据的读写的效率;
对应类:
BufferedWrite, BufferedReader;
缓冲区要结合流才可以使用。
在流的基础上对流的功能进行了增强。
BufferedWrite提供了一个跨平台的换行方法,newLine();
BufferedReader提供了一个读一行的方法,readLine()不包含行终止符。当返回null是,表示
已经读到了文件的末尾。
因为在BufferedReader和BufferedWrite中调用了相应的流对象,所以只需要关闭BufferedReader
和BufferedWrite,释放资源。
代码片段:
- public static void copy_2() throws Exception {
- FileWriter fw = new FileWriter("buf.txt");
- BufferedWriter bufw = new BufferedWriter(fw);
- bufw.write("abcde");
- //关闭缓冲区,就是在关闭缓冲区中的流对象
- bufw.close();
- //fw.close();可以不用再写
- }
- FileReader fr = new FileReader("buf.txt");
- BufferedReader bufr = new BufferedReader(fr);
- String line = null;
- while((line=bufr.readLine()) != null) { //一次读取一行数据
- System.out.println(line);
- }
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有的功能,并提供加
强功能。那么自定义的该类称为装饰类。
继承和装饰的区别:
装饰模式比继承更灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有对象是相同的,只不过提供了更强的功能,所以装饰
类和被装饰类通常属于同一个体系中。
- class Person {
- public void chifan() {
- System.out.println("吃饭");
- }
- }
- class SuperPerson {
- private Person p ;
- SuperPerson(Person p) {
- this.p = p;
- }
- public void superChifan() {
- System.out.println("开胃酒");
- p.chifan();
- System.out.println("甜点");
- System.out.println("来一根");
- }
- }
- class PersonDemo
- {
- public static void main(String[] args)
- {
- Person p = new Person();
- SuperPerson sp = new SuperPerson(p);
- sp.superChifan();
- }
- }
read 方法返回的为什么是int类型,而不是byte类型:
为了防止凑巧读取到8个1(十进制的-1),这样正好符合了判断条件,而此时文件并没有读取结
束,所以将byte类型提升为int类型,由4个字节来存放数据,前3个字节补0(方法是将提升后的数据与
255进行与运算),避免了出现-1的情况,也保证了原数据没有变化。而write方法在执行时,又将4个
字节的int类型转换为了1个字节的byte类型。
字节流 FileInputStream、FileOutputStream:
FileOutputStream因为是对字节的最小单位操作,所以不需要刷新操作。
- public static void writeFile() throws Exception {
- FileOutputStream fos = new FileOutputStream("fos.txt");
- //没有使用缓冲区,不需要刷新,因为是对字节的最小单位操作
- fos.write("abcde".getBytes());
- fos.close();
- }
键盘录入方法:
读取转换流:
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
输出转换流:
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
示例代码:
- public static void main(String[] args) throws IOException {
- BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//创建键盘输入流对象
- BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));//创建流对象,输出到控制台
- String line = null;
- while((line=bufr.readLine())!=null) {//读取一整行数据
- if("over".equals(line))
- break;
- bufw.write(line.toUpperCase());//变为大写字母
- bufw.newLine();
- bufw.flush();//刷新
- }
- bufr.close();//释放资源
- }
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------