IO (Input Output)流
IO流用来处理设备之间的数据传输;
JAVA对数据的操作是通过流的方式;
JAVA对于操作流的对象都在IO包中;
流按操作数据分为两种:字节流和字符流;
流按流向分为输入流和输出流。
IO流常用基类
字节流的抽象基类:
InputStream ,OutputStream
字符流的抽象基类:
Reader , Writer
注:由这4个类派生出的子类名称都是以其父类名作为子类明的后缀。
如:InputStream 的子类 FileInputStream。
如:Reader 的子类 FileReader。
既然IO流是用于操作数据的,
那么数据最常见的体现形式是:文件。
需求:在硬盘上,创建一个文件并写入一些文字数据。
找到一个专门操作文件的Writer子类对象。FileWriter。后缀名是父类名,前缀名是该流对象的功能。
import java.io.*; class FileWriterDemo { public static void main(String[] args) throws IOException { //创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。 //该文件会被创建到指定的目录下。如果该目录下已有同名文件,将被覆盖。 //其实该步骤就是在明确数据要存放的目的地。 FileWriter fw = new FileWriter("D:\\test.txt"); //调用write方法,将字符串写入到流中。 fw.write("abcdfeg"); //刷新流对象中的缓冲区中的数据。 //将数据刷新到目的地中。 fw.flush(); //关闭流资源,但是在关闭之前会刷新一次内部的缓冲中的数据,将数据刷新到目的地。 //和flush的区别:flush刷新之后,流可以继续使用,close刷新后,将会关闭流。 fw.close(); } }
对流的异常操作
import java.io.*; class FileWriterDemo2 { public static void main(String[] args) { //把变量放在try代码块外面,这样在finally代码块环境中也能使用 FileWriter fw = null; try { fw = new FileWriter("k:\\text.txt"); fw.write("aaaaaaa"); } catch(IOException e) { System.out.println(e.toString()); } finally { try { //判断资源对象是否存在 if(fw != null) fw.close(); } catch(IOException e) { System.out.println(e.toString()); } } } }
读取文件内容
import java.io.*; class FileReaderDemo { public static void main(String[] args) { FileReader fr = null; try { fr = new FileReader("D:\\test.txt"); int ch = 0; while((ch=fr.read()) != -1) { System.out.print((char)ch); } } catch(IOException e) { System.out.println(e.toString()); } finally { try { if(fr != null) fr.close(); } catch(IOException e) { System.out.println(e.toString()); } } } }
用数组参数读取文件
import java.io.*; class FileReaderDemo2 { public static void main(String[] args) throws IOException { FileReader fr = null; try { fr = new FileReader("F:\\java\\FileReaderDemo.java"); char[] buf = new char[1024];//创建一个临时数组 int num = 0; while((num = fr.read(buf)) != -1)//把读取的数据存入字符数组中 { System.out.print(new String(buf,0,num));//把数组转成字符串并且打印出来 } } catch(IOException e) { System.out.println(e.toString()); } finally { try { if(fr != null) fr.close(); } catch(IOException e) { System.out.println(e.toString()); } } } }
文件的拷贝:
import java.io.*; class FileCopyDemo2 { public static void main(String[] args) { copy(); } public static void copy() { FileWriter fw = null; FileReader fr = null; try { fw = new FileWriter("F:\\java\\xin.txt",true); //创建输入流 fr = new FileReader("F:\\java\\new.txt"); //创建输出流 char[] buf = new char[1024]; //定义容器 int len = 0; //定义长度 while((len=fr.read(buf)) != -1) { fw.write(buf,0,len); //把字符数组中的内容存入指定区域 } } catch(IOException e) { System.out.println(e.toString()); } finally { try { if(fw != null) fw.close(); } catch(IOException e) { System.out.println(e.toString()); } finally { try { if(fr != null) fr.close(); } catch(IOException e) { System.out.println(e.toString()); } } } } }
字符流的缓冲区
缓冲区的出现提高了对数据的读写效率;
对应类
BufferedWriter , BufferedReader
缓冲区要结合流才能使用;
在流的基础上对流的功能进行了增强。
利用缓冲的文件拷贝
import java.io.*; class BufferedCopyDemo { public static void main(String[] args) throws IOException { BufferedWriter bufw = null; BufferedReader bufr = null; try { bufw = new BufferedWriter(new FileWriter("FileWriterDemo_copy.txt")); bufr = new BufferedReader(new FileReader("FileWriterDemo.java")); String line = null; while((line = bufr.readLine()) != null) { bufw.write(line); bufw.newLine(); } } catch(IOException e) { System.out.println(e.toString()); } finally { try { if(bufr != null) bufr.close(); } catch(IOException e) { System.out.println(e.toString()); } try { if(bufw != null) bufw.close(); } catch(IOException e) { System.out.println(e.toString()); } } } }