java中的File与“流”

              java中的File与“流”

在大学学习java时,由于各种原因始终没能够对java中的一些概念理解透彻,其中就有File类与各种“流”,虽然会写这些常用的代码,但是写的时候压根也没理解为什么这么写,这个问题一直盘旋的脑子中,每遇到一次,痛苦就增重一分,谁让我是“明白狂”呢。于是决定花点时间“一探究竟”。

初识File

    File是个什么东东呢,直译过来就是文件(File),对于稍懂点计算机的同志们,都会想起另外一个概念数据(data)。文件不就是按照某个特定格式排列的数据吗?如果这样想的话,就会陷入到一个我呆了好多年的“误区”。之所以会犯这个错误是因为你漠视了File出现的具体环境(context)。File是java中的一个类,类就是现实中几样相似东东的抽象(abstract),现实中有什么样东东可以抽象成一个类呢。想想立马就可以拿出几样来。最简单的就是硬盘上的一个文件,程序要想找到文件,你需要给程序这个文件在计算机上的“地址”,那就是路径(path)了,提到路径,目录(directory)的概念就出来了。所以概括下来,一般的File对象要么磁盘上的一个文件,要么就是磁盘上的一个目录(directory)了。知道File是什么,那在看看它能做些什么:

1,  创建一个文件对象

File  f = new  File(“C:/document/hwh.txt”)

这样我就创建了一个文件对象,在执行这个条语句的时候,就会在电脑的C盘document文件下创建一个名为hwh的txt文档。Java中有一些类的构造函数接受字符串(文件路径)来,此时就可以一个File对象来代替,这是一种比较安全的方式。

    2,创建一个新的目录

File  dir = new  File(“C:/documents”)
dir.mkdir();

   3,列出目录的所有项      

if(dir.isDirectory()) {
    String[] dirContents = dir.list();
    for (int i = 0; i < dirContents.length; i++) {
        System.out.println(dirContents[i]);
    }
}


   4,得到一个文件或者目录的绝对路径

     

 System.out.println(dir.getAbsolutePath());

   5,删除一个文件或者目录

    

 if (dir.exists()) {
            dir.delete();
 }

最后在强调一点,File对象仅仅只代表一个文件或者目录,并不是代表其中的数据。

读写File

平时用的最多就是读写文件了,类似的代码何其多,其中的错误也何其多。或许“管用”,确实,很多时候“管用”,作者觉得“管用”不可靠,虽不追求伟大,但是起码要可靠、健壮,经得起考验。且看代码:

import java.io.*;
 
class WriteAFile {
    public static void main(String[] args) {
        try {
            FileWriter writer = newFileWriter("D://Foo.txt");
            writer.write("Hello Jeffery Wong");
            writer.close();
        }catch(IOException ex) {
            ex.printStackTrace();
        }
    }
}

首先,必须明确的是任何IO操作要放在try语句块内,因为IO操作都有可能会抛出异常,当然你可以在方法名后声明异常,但作者认为前者更为直接,直接把“风险语句”标出。

其次,FileWriter是OutStreamWriter的一个子类,可以方便的用来把文本(text)数据写到文件中,默认是写到文件末尾,当然你可以用FileWriter(String fileName, Boolean append)来指定丢文件进行重写。

最后,要注意的就是,用完“流”之后要关闭。

上面的方法适用于将少量数据写到文件中,如果大量数据的话,就会出现效率的问题。这个问题其实在生活有类似的比喻。上面的整个过程就好比,你到超时买了一件东西,并到收银台付完帐,但是如果你要买很多东西呢?你肯定不会选完一样东西就拿到收银台去,你会找推一个购物车,直到把购物车堆满,你才会考虑去收银台。所以要写大量的数据到文件里面,为了提高效率,你也需要“购物车”。这其实就是缓存的思想了。Java中对应的类就是BufferedWriter/BufferedReader, 分别用于读写的缓存。

import java.io.*;
 
class WriteAFileWithBuffer {
    public static void main(String[] args) {
        try {
             BufferedWriterwriter = BufferedWriter (new FileWriter("D://Foo.txt"));
            writer.write("Hello Jeffery Wong");
            writer.close();
        }catch(IOException ex) {
            ex.printStackTrace();
        }
}


写文件的有了,读文件就很简单了:

import java.io.*;
 
class ReadAFile {
    public static void main(String[] args) {
        try {
            FilemyFile = newFile("MyText.txt");
            FileReader fileReader = new FileReader(myFile);
            BufferedReader reader = new BufferedReader(fileReader);
            Stringline = null;
            while ((line =reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        }catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}

认识“流”

“流”是什么呢?这个概念比较抽象,似乎现实中没有与这个概念比较一致的,如果非要找一个的话,那就是各种管道了。Java核心技术中,“输入流”(input stream)就是一个能从中读到一序列比特的对象,而“输出流”(output stream)就是一个能够把一序列比特写到其中的对象。简单的说,“流”就是对象,如果能从这个对象中读取数据,就是输入流,如果能写入数据,就是输出流,这是两种最基本的流了,这是从数据流向的角度来看的。从编码的角度看,还有字节流和字符流(Unicode)。

为了降低复杂性,从使用的角度,可以把所有的流分为两类:源流(connection stream)和链接流(chain stream)。源流就是代表了一种中通向源头或者目的地(file,socket等)的连接;链接流,不能连接到源头和目的地,但是可以链接源流,链接流就可以对条用方法对源流进行不同的处理。就比如上面的写大量数据时,FileWriter就是源流,而BufferedWriter就是链接流,前者提供了计算机到文件之间的连接,而后者则提供了缓存的服务,两者结合在一起“完美”了向文件写入大量数据这样一种操作。

在深入一点,java为什么要这样做?为什么不直接提供一个方法来完成这样两件事情呢?

其实这就是面向对象的思想设计思想(oo)。每个类只做自己的事情。FileWriter负责连接文件,把字符写到文件中,BufferedWriter负责为FileWriter提供缓存,提高写字符的效率。这样的最大的优点就是,提供了非常的灵活性(flexibility).当不同的类组合在一起,将提供灵活多样而且强大的功能。

结语

    至此,本文该结束了,希望这篇文章能帮助同志们初步理解java io处理机制的一些重要概念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值