黑马程序员—IO流部分基础知识总结

来源:互联网 发布:聚合数据 左磊 编辑:程序博客网 时间:2024/05/21 20:24
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

        Java    IO部分基础总结

1.IO涉及的类

字符流:Reader(读取/输入)  Writer(写入/输出)

字节流:InputStream(读取/输入)  OutputStream(写入/输出)

文件操作类:File(文件)

类名方法名一部分规律:后缀名一般为其父类,前缀为功用如:FileWriter、FileReader

2、创建新文件

教程上讲了两种方法,一种是用File类中的方法:
public boolean createNewFile()
                      throws IOException
   方法部分说明:当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。检查文件是否存在,若不存在则创建该文件,这是单个操作,对于其他所有可能影响该文件的文件系统活动来说,该操作是不可分的。
或者用Writer类下的子类FileWriter中的方法:
public FileWriter(String fileName)

           throws IOException

        方法说明:根据给定的文件名构造一个 FileWriter对象。

        根据上面方法说明我们可以看到一个简单的区别:这两种方法创建的文件FileWriter(“d\\text.txt”)无论D盘中假如有了同名文件则会将它覆盖掉建立一个空记事本,而后者createNewFile()则不会。

        以在D盘建立空记事本text.txt为例,我们看一下两种具体的实现代码:

import java.io.File;import java.io.IOException;public class IODemo1 {public static void main(String[] args) {File f=new File("d:\\test.txt");//将文件或者文件夹封装成一个类根据给出的完整路径+完整的文件名try{f.createNewFile();//根据File的属性新建文件}catch(IOException e){e.printStackTrace();}}}

        PS:以上代码中如果我们将d:\\test.txt修改成test.txt那么此文件将在编译目录下创建,Eclipse运行下则在其工作空间workspace文件夹内的JAVA项目名称文件夹内。另外如果考虑程序尽管在windows下编写,但是可能会在Linux系统上发布的原因,所以要采用兼容性的分隔符,因为这两个操作系统表示文件路径的分隔符就不同:

Windows:\

Linux:/

         所以源代码中的分隔符最好用pathSeparator字符串来代替,它代表了符合本地系统的分隔符,具体实现后面有例子。

import java.io.FileWriter;import java.io.IOException;public class IODemo2 {public static void main(String[] args) {FileWriter f= null;try {f=new FileWriter("d:\\test.txt");} catch (IOException e) {e.printStackTrace();}}}


        之所以要单独把f=newFileWriter("d:\\test.txt");这句放进try中,是为了延长实例对象的f的生命周期,为finally关键字中关闭资源做准备,在此例中,关闭流的操作是需要实例对象f的。

3、删除一个指定文件

   这个貌似只能用Flie类了,可以采用delete()方法删除
public boolean delete()

方法说明:删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除

    实现代码:

import java.io.File;public class IODemo3 {public static void main(String[] args) {File f=new File("d: "+File.separator+"test.txt");//用兼容性的分隔符替代if(f.exists()){//判断文件是否存在f.delete();//删除文件}else{System.out.println("该文件不存在,无需删除");}}}


4、创建文件夹

       File类中存在两个方法可以创建文件夹分别是

public boolean mkdir()
public boolean mkdirs()
//其中mkdirs()可以将本来不存在的父类文件目录创建代码如下::

import java.io.*;public classIDDemo4 {    public static void main(String[] args) {        Filef=newFile("d:"+File.separator+"好好学习"+File.separator+"haha");        f.mkdirs();    }}

        我们可以发现这个方法是没有问题异常抛出的,也就是说编译通过后运行时不必担心异常,但是我们知道实际上文件名是不能包含这些字符的:\/:*?”<>|如果我们在文件名那里输入是否会报错呢?我改了下发现不会报错的,不过文件夹并没有被创建出来
5、写入文件及IO流中的异常处理流程
我们建立一个文件以后也可以向里面写入内容,这里通过字符流和字节流都有方法的支持。
字节流,调用输出类OutputStream及其下的方法write(),大家可以通过API发现它是一个抽象类,所以实例化还是要通过其子类FileOutputStream来实现
代码如下:

import java.io.File;import java.io.FileOutputStream;import java.io.IOException; public classIODemo5 {    public static void main(String[] args) {        Filef=newFile("d:"+File.separator+"text.txt");        FileOutputStreamout=null;        try{            out=new FileOutputStream(f);            Stringstr="haha";            byte b[]=str.getBytes();            out.write(b);        }catch(IOException e){            e.toString();        }finally{            try {                out.close();            }catch(IOException e) {                e.printStackTrace();            }        }    }}

       这次我们并没有通过f.createNewFile();来新建txt文件,是因为当程序在执行FileOutputStream实例化对象时,就自动创建了。而且跟FileWriter(String fileName)一样,为覆盖性的创建。而且我们还发现我们需要将输入的字符串进行字节数组byte b[]的转换,这也就是字节流的限制所在了。

以上包含了IO流中标准的处理流程,就是在try catch块组合中的基础上,加入了finally去关闭流,这是我们在创建了对象的基础上,是否发生读写错误,都需要最后将流关闭,而关闭流的方法之所以try catch块包围,主要就是因为其需要防止实例对象未能成功建立的创建等异常。
字符流:字符流我们依然在之前用FileWriter类创建文件后调用其方法writer即可

import java.io.File;import java.io.FileWriter;import java.io.IOException; public classIODemo6 {    public static void main(String[] args){        Filef=newFile("D:"+File.separator+"text.txt");        FileWriterout=null;        try{            out=new FileWriter(f,true);            out.write("hehe");        }catch(IOException e){            e.toString();        }finally{            try {
if(out!=null)                out.close();            }catch(IOException e) {                e.printStackTrace();            }        }    }}


        作为专业处理文字信息的字符流,我们可以看到其优势所在了,我们可以直接用一句out.write("hehe");来替代字节流的多句文字处理,并且我们通过另一种FileWriter类的构造方法FileWriter(File file, boolean append)来完成了对已有文件的追加续写。
在out=new FileWriter(f,true);句中首先我们通过File实例对象f来锁定文件,再通过true确认来完成续写,假如咱们改成false或不写boolean值的话,则新建文件并覆盖,由此可见FileOutputStream(f,true)也是可以追加续写的。
6、字符流字节流部分区别
        只所以说是部分区别云因,主要是因为本人水平有限导致,为说不到的地方留后路:)
   字节流在写入文件内容时是直接操作文件的,而字符流则先将内容放入缓冲区,咱们可以步进之前的代码(或者修改将一些步骤临时备注)就会发现字节流的写入例子中在执行write时文件中就出现内容了,而字符流直到close后才会出现(close方法在关闭流之前会刷新缓冲区,单纯的刷新缓冲区方法为fulsh)。
7、读取文件内容
       读取文件内容我们同样有字节流和字符流两种方式,为了减少篇幅,我们在此就只介绍专门处理文字信息的字符流,而省去了从体现原理上及其相似但表现形式相对原始的字节流。
字符流实现读取信息采用了reader类的子类Filereader类中的方法read()从这一串英文中我们可以很直观的认识到它们的作用,下面我们来看下代码实现:

import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;public classIODemo7 {     public staticvoidmain(String[] args){        FileReader f =null; try {    f=new FileReader("D:"+File.separator+"text.txt");//txt内容:abcdef} catch (FileNotFoundException e) {    e.printStackTrace();}//创建一个字符数组,用于存储读到字符数据。 char[] buffer = newchar[1];  //一般定义的都是1024的整数倍。 int len = 0; try {    while((len=f.read(buffer))!=-1){//用输入流实例对象实现读取方法,将读取的字符存入buffer数组        System.out.print(new String(buffer,0,len));//从最左端读到read返回读取字符数     }} catch (IOException e) {    e.printStackTrace();}finally{    try {        f.close();    }catch(IOException e) {        e.printStackTrace();            }        }     }}

         可以发现我们这次可以直接用具体的名称来替代之前的File对象,当然像之前那样设定再引用也是可以的,两者区别不大。这次我们用了char字符数组来盛放读取的内容,然后读取了文件并存放在字符数组中,并且在read()方法没返回-1(代表着读至结尾了)之前循环将从字符数组中的第0位(可以理解为最左端)开始到read方法返回的读到的可以保存一次的字符长度对应的位置的字符转成字符串并打印输出,比如说返回的字符数是5,那么我们就将之前从文件中从左至右到第5个位置的字符作为字符串输出。而在数组长度我设为1也是为了印证循环效果的,这样多读几次咱们也可以看到他每次读的起点都有跟进,而不是一口气读完,read返回值也会受到数组长度的影响。当然这样设定尽做学习练习推荐。

        后面IO流中还存在着巨量的内容,篇幅原因,在这里就不再多讲了,这部分内容在学习练习中比较的依赖API的查阅和每个类的构造,自身特性(是否抽象),每个方法接收的参数类型和返回类型,访问权限等等。毕竟类之间的继承关系错综复杂,而很多同名方法被重载了多次兼容了很多功能,希望大家不要忽视。最后祝大家天天向上。

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
0 0
原创粉丝点击