大话 Java File I/O(与c++对比)

来源:互联网 发布:ipadmini2淘宝卖家 编辑:程序博客网 时间:2024/05/18 06:19

一起因:

(0)C里面就一个File文件指针,剩下的全部通过fopen(filepaht) ,和 fread() fclose()搞定;c++提供了fstream类(fistream fostream子类)其构造方法接收string型的filepath,就可以用fstream的成员函数操作该文件的读或者写,这比c方便了许多。Java里面的就更加复杂了,据说I/O读写类就有几十个,连我们一贯熟悉的File类仅仅提供一些文件硬盘级别的基本操作(是不是文件夹,文件?创建文件,得到所有的文件夹下的文件集合等等),如何代开和读取 需要FileInputStream类来实现字节流。详见 c++ fstream + string 处理大数据(与c 的fread)

(1)以字节为导向的 stream------InputStream/OutputStream;以字符为导向的 stream Reader/Writer;

          InputStreamReader 和 OutputStreamReader :把一个以字节为导向的 stream 转换成一个以字符为导向的 stream 

(2) --.InputStream、OutputStream   处理字节流的抽象类
     InputStream 是字节输入流的所有类的超类,一般我们使用它的子类,如FileInputStream等.
     OutputStream是字节输出流的所有类的超类,一般我们使用它的子类,如FileOutputStream等.
 
        --.InputStreamReader  OutputStreamWriter    处理字符流的抽象类
        InputStreamReader 是字节流通向字符流的桥梁,它将字节流转换为字符流.(转化工具,字节到字符)
        OutputStreamWriter是字符流通向字节流的桥梁,它将字符流转换为字节流.
 
        --.BufferedReader BufferedWriter
       BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,readLine读取一个文本行,从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。(默认为大小为8092个char型字符(8KB)字符,即4k中文字符,大概4页左右的A4纸的文字量)
         BufferedWriter  由Writer 类扩展而来,提供通用的缓冲方式文本写入, newLine使用平台自己的行分隔符,将文本写入字符输出流,缓冲各个字符,从            而提供单个字符、数组和字符串的高效写入。


二实战对比:

三种写法:

(1)File file = new File ("hello.txt");FileInputStream in=new FileInputStream(file);InputStreamReader inReader=new InputStreamReader(in);BufferedReader bufReader=new BufferedReader(inReader); (2)FileInputStream in=null;File file = new File ("hello.txt");in=new FileInputStream(file);// 这里会抛出异常的BufferedReader bufReader=new BufferedReader(new InputStreamReader(in)); /// 这种方法最常见了,而且规范一些,异常也可以处理(3)File file = new File ("hello.txt");BufferedReader bufReader=new BufferedReader(new InputStreamReader(new FileInputStream(file)));

上述写法的微小区别:
a)第二种方式中把“FileInputStream in=null;”定义单独放在开始处,说明下面应该还有要用到in对象变量的地方;(BufferedReader处用了)
b)第二种方式没有定义InputStreamReader的对象变量,直接在BufferedReader的构造函数中new一个,这种方式与第一种方式的主要区别:InputStreamReader对象只使用一次!这对于在这里,只需要使用一次,这个InputStreamReader对象的应用来说更好;无需定义InputStreamReader的对象变量,接收由new返回的该对象的引用,因为下面的程序中不需要这个InputStreamReader的对象变量,所以无需定义;所以这种情况下,第二种方式比第一种更好一些。

c)第三种方式中,典型的三层嵌套委派关系,清晰看出Reader的委派模式(《corejava》12章有图描述该委派关系),FileInputStream和InputStreamReader都没有定义变量,new生成的对象都只是使用一次。

d)三种方式的区别也就在于FileInputStream和InputStreamReader对象是否都只使用一次,是否需要定义它们的对象变量,以及个人的编码习惯。

e)但是要注意异常处理,FileInputStream(file)会抛出NotFileFoundException,如果采用surround方式(try&catch)处理,应该用第二种方式,这样可以用System.out.println提示文件未找到;当然在函数名后使用throws Exception,然后用第三种方式也行,但似乎这适合有用户界面的情况,把异常抛出在客户端在处理。

总之,建议使用第二种方法。

三:java中length,length(),size()区别

(1) java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性.例如List ArrayList等的成员变量。

(2) java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法.String 类的成员函数。

(3)java中的size()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!  ---- 以上三个在C++STL也通用

(4)实例验证:

public static void main(String[] args) {        String []list={"mky","zyp","xl","ly"};        String a="mkyzypxlly";        System.out.println(list.length);        System.out.println(a.length());        List<Object> array=new ArrayList();        array.add(a);        System.out.println(array.size());    }


3 0
原创粉丝点击