------<ahref="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
黑马程序员——20,IO流,FileWriter,FileReader
/*
IO流的介绍:
IO流式用来处理数据传输的,与IO流相关的类都定义在了java.io包里面
按照操作类型分:字节流和字符流,其中的字符流与文字编码表有关。
字节流的抽象基类:
IntputStream, OutputStream
字符流的抽象基类:
Reader, Writer
*/
import java.io.*; class Ioliou { public static void main(String[] args)throws IOException //IO流代码后容易抛出异常,所以一般都会在方法上抛出IOException { FileWriter f=new FileWriter("f:\\yyyyyyy.txt"); //FileWriter是用于操作文件的Writer类的子类对象 /* 这句话可以指定路径建立对应名字的文件, 如果指定路径中已经存在同名文件,那么原本文件会被新建文件覆盖掉。 */ f.write("jkl"); //将字符串写入流中 /* 但是此时如果打开yyyyyyy.txt文件看的话发现里面并没有写入jkl 这是为什么呢?因为其写入的仅仅是流中,不是写入文件中 */ f.flush();//刷新流,把流里面的数据刷新到目的地 /* 此时再打开yyyyyyy.txt文件就会看见写入的jkl */ f.close();//这句话作用是先刷新流,接着再关闭流 f.write("rty");//由于前面关闭了流,所以这句话是写不进流里面的 System.out.println("Hello World!"); } }
——————分割线——————
/* IO流异常处理的方式 */ import java.io.*; class Ioliou2 { public static void main(String[] args) { //涉及到IO流的语句一般都会抛出异常,所以try块里面才那么多语句 FileWriter fi=null; //为什么要在前面定义fi为空? /* 因为后面的finally块里面有fi, 如果只是定义在try块里面, fi的作用域只是在try块里面。 而后面还要调用fi.close(); 所以,这个变量必须是全局变量。 至于初始化就放在try块里面。 */ try { fi=new FileWriter("f:\\trtrtr.txt"); fi.write("123"); fi.flush(); } catch(IOException e) { soc(e.toString()); } finally { try { if(!(fi==null)) fi.close(); /* 关闭资源的动作硬要执行,所以放在finally块里面, 又因为fi.close();也会抛出IO异常, 所以也用try...catch块处理. 为什么前面还要加一句判断是否为空? 因为有可能开始建立文件就失败了, 既然文件建立都失败了,那么还怎么关闭流呢? 所以要加一个判断语句。 */ } catch(IOException e) { soc(e.toString()); } } } public static void soc(Object obj) { System.out.println(obj); } }
——————分割线————
/* 文件的续写: */ import java.io.*; class Ioliou3 { public static void main(String[] args) { FileWriter fi=null; try { fi=new FileWriter("f:\\trtrtr.txt",true); /* 因为新建文件会覆盖原有文件,所以,FiletWriter类提供一个构造函数 FileWriter(String s,boolean b) 表示可以在原有文件后面续写数据 */ fi.write("我是\r\n英雄"); /* 这句话表示输入数据“我是”然后换行接着输入数据“英雄”。 为什么要在\n前面加上\r呢? 因为\r\n写在一起在window系统里面才表示换行, 仅仅是\n只是在java里面才表示换行。 如果写的是fi.write("我是\n英雄"); 那么在java里面显示的确是会换行,但是用window系统里面的工具打开, “我是”与“英雄”之间会有一个黑块。这是window系统无法识别单独的\n的原因。 */ } catch(IOException e) { soc(e.toString()); } finally { try { fi.close(); } catch(IOException e) { soc(e.toString()); } } System.out.println("HelloWorld!"); } public static void soc(Object obj) { System.out.println(obj); } }
————————分割线——————
/* 数据的读取 */ import java.io.*; class Ioliou4 { public static void main(String[] args) { FileReader re=null; try { re=new FileReader("f:\\trtrtr.txt"); /* 建立一个文件读取流对象,并且指向已经存在的文件! 如果文件不存在,运行会发生FileNotFoundException */ while(true) { int i=re.read(); char ch=(char)i; soc(ch); if(i==-1) break; int i2=re.read(); /* read方法一次读取一个字符,返回的是int型数据,可以自动往下读取, 而且如果后面读到没有数据可读的时候就会返回-1,如果被强制转成字 符打印出来的是一个问号? */ char ch2=(char)i2; soc(ch2); if(i2==-1) break; } } catch(IOException e) { soc(e.toString()); } finally { try { re.close();//仅仅是关闭流 } catch(IOException e) { soc(e.toString()); } } } public static void soc(Object obj) { System.out.print(obj); } }
——————分割线——————
/*
第二种数据读取方式:调用read(char[] ch)
按照字符数组长度来读取,返回的是读取到的字符个数,
例如在本题中,长度为3的字符数组,读取的时候从第一位到第三位
填充字符,填充完了就返回填充的个数;再次调用read方法的时候,
会自动往下继续读取字符,又从第一位到第三位重新填充字符;
如果在某一次填充字符过程中,字符数组还没有填充完就没有字符继续填充的情况下,
这一次返回的是本次填充字符的个数,返回值也许不是字符数组长度,
如果在某一次填充字符过程中,字符数组还没有填充完就文件字符换行的情况下,
本次就只是填充到换行处,返回本次填充字符个数,下一次填充字符又从第一位开始填充下一行的字符。
再接下来,继续调用read方法读取,在上一次已经全部读取完字符了,那么这一次,返回值-1
读取一些比较大的文件的时候,一般定义字符数组长度1024
*/
import java.io.*; class Ioliou5 { public static void main(String[] args) { FileReader fr=null; try { fr=new FileReader("f:\\trtrtr.txt"); char[] ch=new char[5]; int i =0; while((i=fr.read(ch))!=-1) { soc(new String(ch,0,i)); /* new String(ch,0,i)表示新建一个字符串, 其内容为字符数组ch的从0位开始长度为i的字符组成。 */ } } catch(IOException e) { soc(e.toString()); } finally { try { fr.close(); } catch(IOException e) { soc(e.toString()); } } } public static void soc(Object obj) { System.out.println(obj); } }
——————分割线——————
/*
把文件从f盘复制到d盘
*/
import java.io.*; class Ioliou6 { public static void main(String[] args) { FileWriter fw=null; FileReader fr=null; try { fw=new FileWriter("d:\\trtrtr_copy.txt"); //建立一个写入流对象,指定存储的路径的文件 fr=new FileReader("f:\\trtrtr.txt"); //建立一个读取流对象,与目的地相关联 char[] ch=new char[1024]; int i= 0; while((i=fr.read(ch))!=-1) { fw.write(ch,0,i); /* 按照字符数组ch从0位开始长度为i把字符写进流中 */ } } catch(IOException e) { throw new RuntimeException("读写出问题了"); //抛出一个运行异常对象 } finally { try { if(fw!=null) fw.close(); } catch(IOException e) { } try { if(fr!=null) fr.close(); } catch (IOException e2) { } } } public static void soc(Object obj) { System.out.println(obj); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。