一起因:
(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());
}