1. File
File类有一个欺骗性的名字 —— 通常会认为它对付的是一个文件,但实情并非如此。它既代表一个特定文件的名字,也代表目录内一系列文件的名字。
FilenameFilter接口:过滤不需要的内容
2. 输入和输出
“流”屏蔽了实际I/O 设备中处理数据的细节。
输入、输出流中read(),wirte() 方法,通常我们不会用到,因为有别的类能提供更有用的接口。
流的选择:
按照处理单位可以分为:字节流(UTF-8 )、字符流( UTF-16 )。
需要缓冲区:可以使用缓冲流。
需要将字节流转换成字符流进行处理:可以使用转换流。
需要读取基本数据类型或String :可以使用 DataInputStream/DataOutputStream 。( 首选 )
输出方便:Print 流( PrintStream/PrintWriter )。(此类捕获的所有的异常,即不会抛出异常,需要自行进行检测)
需要直接读写对象:Object 流。
需要直接读写文件:FileWriter/FileReader;FileInputStream/FileOutputStream 。
注意细节:
l while (inputStream.available() > 0) { System. out .println(inputStream.read());
}
available() 方法 不受阻塞地从此输入流读取(或跳过)的估计字节数 。当任何字节都是合法时(即有可能 -1也是输入流中的数据,并非结束标识 )或者输入流并不准备关闭时,要用此方法进行检验。
int value = -1;
while ((value = inputStream.read()) != -1) {
System. out .println(value);
}
read() 在输入数据可用 、检测到流末尾 或者抛出异常前,此方法一直阻塞 。
所以在客户端连接或者输出流不关闭的情况下,此种方式是一直阻塞的。
l 在复制文件时,通过 readLine()方法读取每一行后,再写入到另一个文件中去时,要注意写入每行时必须要添加换行符 "/n" ,因为 readLine() 已将读入的换行符删除。
l DataInputStream/DataOutputStream读写字符串时,唯一可靠的做法就是使用 UTF-8 编码,使用 readUTF()/writeUTF(); 而不使用 ASCII (由于它是 7 位,会浪费空间和带宽)。但是如果我们使用一个非 java 程序读取此方法的流时,必须编写一些特殊的代码才能正确读取。
3. RandomAccessFile(随意访问文件)
Example:
//以只读方式打开文件
RandomAccessFile rf = new RandomAccessFile( file , "r" );
for ( int i = 0; i < 7; i++) {
//读Double
System. out .println( "Value " + i + ": " + rf.readDouble());
}
//读UTF
System. out .println(rf.readUTF());
rf.close();
此中文件访问方式需要知道文件内部的排版,以便于在操作时根据其内部排版决定读取的基本类型。
4. 标准IO
System.err/System.out:均是 PrintStream ,可以直接使用。
System.in:是未经包装的 InputStream ,需要进行包装,如 new BufferedReader(new InputStreamReader(System.in)) 。
可以使用setIn 、 setOut 、 setErr 进行重定向。