什么是IO?
在Java API 中,可以从某个地方读入一个字节序列的对象叫做输入流,可以向某个地方写入一个字节序列的对象叫输出流。某个地方指的是來源地址或者目的地,一般都是文件,或者是网络连接,甚至是内存块。
IO流的图结构
IO流实例
1.在磁盘上创建一个文件,然后写入信息,之后保存退出
/* 1.IO的基本使用 2.代码目的:创建一个文件,并且写入数据然后保存 */ package me.io; import java.io.*; public class FileWriterDemo{ public static void main(String[] args) throws IOException { //1.先创建FileWriter这个类的文件对象,要画画线有纸 //这一步效果就是在当前路径下创建一个名为Demo.txt的文件 //可以指定存放目录 FileWriter fw = new FileWriter("Demo.txt"); //FileWriter dw = new FileWriter("/yg/home/Desktop/DWdemo.txt"); //这行代码因为输入路径不存在,错误即抛出可异常 FileWriter dw = new FileWriter("/home/yg/Desktop/DwDemo.txt"); //这样制定路径就可以找桌面 下新建了。 //把字符写入文件 //Writer是抽象类,其中几个方法 close,flush,write一部分是抽象方法, //往缓冲区写入字符串。 //写入字母,这个方法由父类Writer继承而来 fw.write("1.This is a Test."); fw.write("2.这是个文件写入测试."); //光写入缓冲区还是不行,应该还要刷新缓冲区,然后才能流入文件 //这个方法在Write类中是抽象方法,在子类中实现复写了这个方法。 fw.flush(); //然后查看是否有更新 /*当前目录下有个Demo.txt文件,打开文件,其中有: This is a Test这是个文件写入测试 *///说明写入成功,用write方法写每次都写在最后面 fw.write("3.这个close()方法的测试."); //close方法测试,这个方法关闭文件流之千做一次更新 fw.close(); //在使用close之后就不能在进行write()了 //fw.write("test"); /*fw.write在colse之后,编译可以通过,但是在JVM运行时候,出现了IOException :Exception in thread "main" java.io.IOException: Stream closed :说明关闭之后不能在写入文件了 */ } }
2.处理使用write时候可能出现的IOExcepiton
/* 代码目的:处理使用write时候可能出现的IOExcepiton 要点:1.try中定义的变脸在括号外无法使用,所以要在括号外定义。里面初始化 2.资源不管写入出现问题还是怎么样,一定要close资源。释放资源。所以把close放在finally后面。 */ package me.io; import java.io.*; public class FileWriterExceptionDemo{ public static void main(String[] args){ //三个步骤:创建文件,写入文件,关闭文件 //这个三个文件都需要try catch //在这里先定义引用变量 FileWriter fw=null; try{ //由于括号没定义变量为局部变量,之后就无法访问,要在外面定义,里面初始化 fw = new FileWriter("/ExceptionDemo.txt");//这个路径肯定出错,用于调试什么时候用close() fw.write("IOException Test"); //fw.close();//由于如果前面出错,那就无法执行到关闭这步,关闭又必须执行,所以要放在最后 }catch(IOException ea){ System.out.println("Write Exception\n"+ea.toString()); }finally{ //把close写在这里为了不管创建或者写入出现问题,一定要关闭资源 //close 也会抛出异常,也需要try catch... try{ if(fw != null) fw.close(); /*加入创建文件出错,那么这里关闭就会因为fw=null 所以出现了 NullPointerException 错误。所以要选择性的调用close */ }catch(IOException clo){ System.out.println("Close File Excepton\n"+clo.toString()); } } } }
3.对磁盘已有文件的续写
/* 代码目的:对已有文件续写,如果已经有一个文件就打开他而不是在末尾出续写 要点: */ package me.io; import java.io.*; public class FileWriterContinueDemo{ public static void main(String[] args){ //创建文件 FileWriter fw =null; try{ //表示要对文件进行续写 fw = new FileWriter("Demo.txt",true); for(int i=0;i<30;i++) fw.write("Test\n"); }catch(IOException ea){ }finally{ try{ if(fw!=null) fw.close(); }catch(IOException close){ System.out.println(close.toString()); } } } }
4.read()用法一:读取磁盘中已经存在的txt文件,并打印出txt内保存的内容
/* 代码目标:读取磁盘中已经存在的txt文件,并打印出txt内保存的内容 */ package me.io; import java.io.*; public class FileReaderDemo{ public static void main(String[] args) throws Exception{ //创建一个流,把txt文件联系到程序中。 FileReader fr= new FileReader("./lijiacheng.txt"); int ch=0; //从文件中读却一个字符,第一次调用读第一个,第二次第二个,依次列推 ch= fr.read(); //当读取到最后一个字符时候,read()就会返回-1,说明已经到文件末端了 //在循环里读 int sum=0; while((ch = fr.read() ) != -1){ //转换为字符打印输出 System.out.print( (char)ch ); } //最后把资源释放 fr.close(); } }
5.read()用法二:读取磁盘中存在的txt小说文件,并且放入数组再打印
/* 代码目的:通过字符数据进行读取文件 要点:1.read()可以将文件中数据放入数组中,读取结束时候返回-1 2.字符数组可以用静态方法valueOf()转换成字符串在输出 */ package me.io; import java.io.*; public class FileReaderDemo_2{ public static void main(String[] args) throws Exception { //创建文件对象 //读取当前目录下的Demo.txt文件 FileReader fr= new FileReader("./Demo.txt"); //创建字符数组 char[] book=new char[100]; /* txt文件中有 abcde */ //开始读取 int words=fr.read(book); //转换输出 System.out.println(words+" words : "+String.valueOf(book)); //输出: 2 words : ab //多read几次看看什么情况? words=fr.read(book); System.out.println(words+" words : "+String.valueOf(book)); //这次输出:2 words : cd words=fr.read(book); System.out.println(words+" words : "+String.valueOf(book)); //然后到这里输出:2 words : cd words=fr.read(book); System.out.println(words+" words : "+String.valueOf(book)); //然后到这里输出: -1 words : e fr.close(); /* 如上输出原因: 因为数组大小只有2个字节。所以每次最多只能存两个。就依次,ab,然后覆盖写了 ,变成cd,然后到了e,e和结束符号写入字符串中。 到了最后依次read(),前面几次已经到了文本末尾,再读就出错了。所以返回-1 */ //修改以上代码,将它放入循环中。 //在读取一次资源文件 fr= new FileReader("./lijiacheng.txt"); //读入李嘉诚传。字数非常多 //当读取到txt最后数据结束时候,返回-1,不构成循环条件 //重复对book这个数组进行写入。第二次写入覆盖第一次写入的内容。 while(( words=fr.read(book)) != -1 ){ //String.valueOf(数组名,开始偏移量,读取长度) System.out.println(words+" words :"+String.valueOf(book,0,words)); } } }
/* 代码目的:读取.java源文件,控制台输出 */ package me.io; import java.io.*; public class FileReaderDemo_3{ public static void main(String[] args) throws Exception{ //创建文件输入流对象 FileReader fr=new FileReader("./FileWriterDemo.java"); //放入的字符数组 char[] txt=new char[1024*2]; //记录字数 int words=0; //使用read方法 while( (words=fr.read(txt) ) != -1){ System.out.println(words+" words\n "+String.valueOf(txt,0,words)); } fr.close(); } }
6.将一个文件复制到另外一个文件
/* 代码目的:将一个文件复制到另外一个文件 */ package me.io; import java.io.*; public class FileCopyDemo{ public static void main(String[] args)throws Exception{ FileCopyDemo.FileCopy("./FileCopyDemo.java","text.txt",false); FileCopyDemo.FileCopy("./lijiacheng.txt","text2.tx",true); } //把两种cp方法写成静态方法 //三个参数,第一个为源文件路径,第二个为目标文件路径,第三个为是否使用数组复制的方法 public static boolean FileCopy(String source_path,String destination_path,boolean flags){ //创建两个引用 FileWriter writerfile = null; FileReader readfile = null; try{ //关联文件路径,形参就是文件路径 writerfile = new FileWriter(destination_path); readfile = new FileReader(source_path); //判断标志,如果为真就使用字符数据的复制方法 if(flags){ int len;//这个用于输入流放入字符数组时候,记录读取长度 char[] buf = new char[1024];//用于读取输入流中的字符 //循环读取到数组 while( (len = readfile.read(buf)) != -1 ){ writerfile.write(buf,0,len); } writerfile.flush(); } //不为真情况下则使用读取单个字节然后循环写入的方法(这个方法很慢每读一次写入一次) else{ int words = 0; //用作读和写的过渡值 while( (words = readfile.read() ) != -1){ //写入复制到的文件中 writerfile.write(words); } } }catch(IOException ea){ System.out.println(ea.toString()); } finally{ try{ if( (writerfile == null ) || (readfile == null) ) return false; //最后要关闭资源 else if(writerfile != null) writerfile.close(); else if(readfile != null) readfile.close(); }catch(IOException close){ System.out.println(close.toString()); } } return true; } }
![]()
作者:YangGan
出处: http://blog.youkuaiyun.com/incyanggan
本文基于 署名 2.5 中国大陆 许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名Yanggan (包含链接).