IO概述:
IO(Input output)流
作用:IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中流按操作数据分为两种:字节流和字符流
流按流向分为:输入流,输出流。
IO流常用基类
字节流的抽象基类:
InputStream,OutputStream.
字符流的抽象基类:
Reader,Writer
注:由这四个类派生出来的子类名称都是以其父类名作为子类的后缀。
如:InputStream的子类FileInputStream.
如:Reader的子类FileReader。
字符流和字节流:
字节流两个基类:
InputStream的子类FileInputStream.
字符流两个基类:
Reader Writer
先学习一下字符流的特点。
既然IO流式用于操作数据的,那么数据的最常见的体现形式是:文件。
那么先以操作文件为主来演示。
功能:在硬盘上创建一个文件并写入一些文字数据。
import java.io.FileWriter; import java.io.IOException; class Filewrite_study { public static void main(String[] args) throws IOException { /* * 创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。 * 而且该文件会被创建到指定的目录下,如果该目录下已经有同名文件将被覆盖. 其实该步就是在明确数据要存放的目的地. */ FileWriter fw = new FileWriter("代码建立文件.txt"); /*调用writer方法,将字符串写入到流中。*/ fw.write("星云学习java文件读写!"); /* 刷新流对象中的缓冲中的数据。 * 将数据刷到目的地中*/ fw.flush(); fw.write("星云加油!"); /* * 关闭流资源,但是关闭前会刷新一次内部的缓冲区中的数据 将数据刷到目的地中 * 和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭 */ fw.close(); } }
运行截图:
完整的IO异常 处理方式:
import java.io.*; class Filewrite_study { public static void main(String args[]) { FileWriter fw=null; try { fw=new FileWriter("d:\demo.txt"); fw.write("IO完整处理异常!"); } //处理文件建立失败、写入文件失败异常 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 Filewrite_study { public static void main(String[] args) throws IOException { /*传递一个true参数,代表不覆盖已有的文件。 *并在已有的文件末尾处进行数据读写。 *java文件读写在windows环境下要换行,需要" "一起用*/ FileWriter fw = new FileWriter("代码建立文件.txt",true); fw.write("星云学习 java文件读写!"); fw.close(); } }
文件一个字符一个字符读取:
代码如下:
import java.io.FileReader; import java.io.IOException; class Filereader_study { public static void main(String args[])throws IOException { //创建一个文件读取对象,和指定名称的文件相关联。 //要保证该文件是已经存在的,如果不存在,会发生 FileNotFoundException异常。 FileReader fr=new FileReader("代码建立文件.txt"); //调用读取流对象的Read方法. while(true){ int ch=fr.read();//读取单个字符,一个字符一个字符读。 if(ch==-1) break; else System.out.print((char)ch); }
fr.close(); } }
上面代码优化后可以这样写:
import java.io.FileReader; import java.io.IOException; class Filereader_study { public static void main(String args[])throws IOException { //创建一个文件读取对象,和指定名称的文件相关联。 //要保证该文件是已经存在的,如果不存在,会发生 FileNotFoundException异常。 FileReader fr=new FileReader("代码建立文件.txt"); //调用读取流对象的Read方法. int ch=fr.read(); while((ch=fr.read())!=-1){ System.out.print((char)ch); }
fr.close(); } }
运行截图:
通过字符数组进行读文件:
/*通过字符数组进行读取*/ import java.io.FileReader; import java.io.IOException; class Filereader_study { public static void main(String args[])throws IOException { FileReader fr=new FileReader("代码建立文件.txt"); /* 定义一个字符数组,用于存储读到的字符。 * 该read(char[])返回的是读到的字符个数.*/ char[] buf=new char[1024]; int num=0; while((num=fr.read(buf))!=-1) { /*String(char[] value, int offset, int count) * 分配一个新的 String,它包含取自字符数组参数一个子数组的字符。 * String(buf,0,num):数组buf中从数组开始位置,偏移num位。 */ System.out.print(new String(buf,0,num)); }
fr.close(); } }