黑马程序员-java中IO流的操作总结1

来源:互联网 发布:南宁云宝宝大数据 编辑:程序博客网 时间:2024/05/19 16:05

-------------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------------

IO流:读进来,写出去

IO流用来处理设备之间的数据传输
java对数据的操作是通过流的方式
java对于操作流的对象都在IO包中
流按照操作数据分为:字节流和字符流
流按照流向分为:输入流和输出流
  
IO流常用基类:
  字节流:
  InputStream
  FileInputStream
  available方法:获得文件大小
  BufferedInputStream
  OutputStream
  FileOutputStream
  BufferedOutputStream
  字符流:
  Reader 
  FileReader 参照FileReaderDemo.java
  BufferedReader:带缓冲区。参照BufferedReaderDemo.java
  Writer
  FileWriter 参照FileWriterDemo.java
  BufferedWriter:带缓冲区。参照BufferedWriterDemo.java
 
 流操作的基本规律:
 1、明确源和目的
  源:输入流 InputStream 和 Reader
  目的:输出流 OutputStream 和 Writer
 2、操作的数据是不是纯文本
  是:字符流
  不是:字节流
 3、当体系明确后,再明确要使用哪个具体的对象。
  通过设备来区分:
  源设备:内存,硬盘,键盘
  目的设备:内存,硬盘,控制台
 
例子一:
将一个文本文件中的数据存储到另一个文件中,复制文件。
源:因为是读取文本文件,所以选择Reader体系,而要读取硬盘上的文件,Reader体系中可以操作文件的对象是FileReader。
如果需要提高效率,加入缓冲区BufferedReader
目的:因为是写入文本文件,所以选择Writer体系中的FileWriter。如果需要提高效率,加入缓冲区BufferedWriter
例子二:
将键盘录入的数据保存到一个文件当中。
源:因为是键盘输入的纯文本,所以选择Reader
设备:键盘-对应的对象是system.in,而system.in是字节流,但是源已经确定了使用Reader体系,则需要
将system.in的字节流转换成字符流,使用到了Reader体系的转换流InputStreamReader,如果需要提高效率加入BufferedReader
目的:存储文本文件,使用Writer,因在硬盘中存储使用FileWriter,提高效率时加入BufferedWriter
例子三:
把录入的数据按照指定的编码表存储到文件中。
FileWriter默认使用的是GBK编码,但是存储时,要用指定的编码表存储的话,只有转换流可以指定编码表,使用的对象是OutputStreamWriter
而该转换流对象需要接受一个字节输出流,而且还可以操作文件的字节输出流FileOutputStream
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("demo.txt"),"utf-8")
提高效率加入bufferedwriter。

装换流一般用于字符编码的转换。

FileReaderDemo.java

import java.io.FileReader;import java.io.IOException;public class FileReaderDemo {public static void main(String[] args) throws IOException{Method1(); Method2(); }public static void Method1() throws IOException{//创建一个文件读取流对象,和制定文件名称关联。//如果文件不存在发生FileNotFoundException异常FileReader fr = new FileReader("demo.txt");//调用文件读取流方法,当读到文件的末尾时返回值为-1。因为返回的是int,需要类型转换。int ch = 0;while((ch = fr.read())!= -1){System.out.println((char)ch);}fr.close();}public static void Method2() throws IOException{FileReader fr = new FileReader("demo.txt");//定义一个字符数组,用于存储读取的字符。大小一般定义为1024的整数倍。//read(char[])返回读取到的字符个数char[] buf = new char[1024];int num = 0;while((num = fr.read(buf))!=-1){System.out.println(new String(buf,0,num));}fr.close();}}

BufferedReaderDemo.java

import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.io.Reader;/* 装饰设计模式: 想要对已有的对象进行功能增强时,可以定义类,将已有对象传入(构造函数传入),基于传入对象已有的功能,提供加强功能, 那么自定义的类成为装饰类。例如MyBufferedReader就是装饰类(基于FileReader对象的功能进行增强)。  装饰与继承的区别: 装饰模式比继承灵活,避免了继承体系的臃肿,并且降低了类与类之间的关系。 */public class BufferedReaderDemo {public static void main(String[] args) throws IOException{FileReader fr = new FileReader("demo.txt");MyLineNum myln = new MyLineNum(fr);String str = null;while((str = myln.myReadLine())!=null){System.out.println(myln.getLineNum()+":"+str);}myln.myClose();}public static void MyBufferedReaderDemo() throws IOException{method();FileReader fr = new FileReader("demo.txt");MyBufferedReader mybuf = new MyBufferedReader(fr);String str = null;while((str = mybuf.myReadLine())!=null){System.out.println(str);}mybuf.myClose();}public static void method() throws IOException{FileReader fr = new FileReader("demo.txt");BufferedReader bufr = new BufferedReader(fr);String str = null;int num=1;//readLine方法一次读取一行,方便对文本的获取,但是不返回回车符。读取到末尾时返回null。while((str = bufr.readLine())!=null){System.out.println(num +":"+str);num++;}bufr.close();}}class MyBufferedReader{private FileReader r;MyBufferedReader(FileReader r){this.r=r;}//可以一次读取一行的方法public String myReadLine() throws IOException{//定义一个临时容器,原BufferReader封装的是字符数组。StringBuilder sb = new StringBuilder();int ch=0;while((ch=r.read()) != -1){if(ch =='\r')continue;if(ch == '\n')return sb.toString();else {sb.append((char)ch);}}if(sb.length()!=0)return sb.toString();return null;}public void myClose() throws IOException{r.close();}}class MyLineNum {private Reader r;private int num;MyLineNum(Reader r){this.r=r;}public void setLineNum (int num) throws IOException{this.num=num;}public int getLineNum(){return num;}public String myReadLine() throws IOException{num++;//定义一个临时容器,原BufferReader封装的是字符数组。StringBuilder sb = new StringBuilder();int ch=0;while((ch=r.read()) != -1){if(ch =='\r')continue;if(ch == '\n')return sb.toString();else {sb.append((char)ch);}}if(sb.length()!=0)return sb.toString();return null;}public void myClose() throws IOException{r.close();}}
FileWriterDemo.java

import java.io.FileWriter;import java.io.IOException;/*IO流是用于操作数据的,数据最常见的提现形式就是文件。Writer的子类FileWriter专门用来操作文件。 *///演示FileWriter功能,不处理异常public class FileWriterDemo {public static void main(String[] args) throws IOException{Method1();Method2();}public static void Method1() throws IOException{//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。//而且该文件会被创建到指定的目录下。如果该目录下已有同名文件将被覆盖。FileWriter fw = new FileWriter("demo.txt");//调用write方法,将字符串写入到流中。fw.write("asdfasdf");//flush方法刷新该流的缓冲。将缓冲刷新到目的地中。fw.flush();//关闭流资源,但是关闭之前会刷新一次缓冲区中的数据,将数据写入到目的地中。//和flush的区别在于,flush刷新后流可以继续使用,close刷新后,流会关闭。fw.close();}public static void Method2() throws IOException{//传递一个true参数,代表不覆盖已有文件,在已有文件的文件末尾处进行数据的续写。FileWriter fw = new FileWriter("demo.txt",true);fw.write("\r\nhahah");//在新的一行添加数据fw.close();}}

BufferedWriterDemo.java

import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;public class BufferedWriterDemo {public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("demo.txt");//为了提高字符写入效率,加入缓冲区,只要将流对象作为参数传递给缓冲区的够早函数即可。BufferedWriter bufw = new BufferedWriter(fw);bufw.write("abcdef");bufw.newLine();//换行bufw.write("abcdef");//只要用到缓冲区,就要刷新缓冲区bufw.flush();//关闭缓冲区就是关闭缓冲区中的流对象,不用再关闭流对象。bufw.close();}}

-------------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------------

0 0
原创粉丝点击