IO小结

1. File

File类有一个欺骗性的名字 —— 通常会认为它对付的是一个文件,但实情并非如此。它既代表一个特定文件的名字,也代表目录内一系列文件的名字。

 

FilenameFilter接口:过滤不需要的内容

 

2. 输入和输出

“流”屏蔽了实际I/O 设备中处理数据的细节。

输入、输出流中read(),wirte() 方法,通常我们不会用到,因为有别的类能提供更有用的接口。

 

流的选择:

按照处理单位可以分为:字节流(UTF-8 )、字符流( UTF-16 )。

需要缓冲区:可以使用缓冲流。

需要将字节流转换成字符流进行处理:可以使用转换流。

需要读取基本数据类型或String :可以使用 DataInputStream/DataOutputStream 。( 首选

输出方便:Print 流( PrintStream/PrintWriter )。(此类捕获的所有的异常,即不会抛出异常,需要自行进行检测)

需要直接读写对象:Object 流。

需要直接读写文件:FileWriter/FileReader;FileInputStream/FileOutputStream

 

注意细节:

while  (inputStream.available() > 0) {         System. out .println(inputStream.read());

}

available() 方法 不受阻塞地从此输入流读取(或跳过)的估计字节数 。当任何字节都是合法时(即有可能 -1也是输入流中的数据,并非结束标识 )或者输入流并不准备关闭时,要用此方法进行检验。

 

int  value = -1;

while  ((value = inputStream.read()) != -1) {

System. out .println(value);

}

read() 在输入数据可用 、检测到流末尾 或者抛出异常前,此方法一直阻塞  

所以在客户端连接或者输出流不关闭的情况下,此种方式是一直阻塞的。

 

在复制文件时,通过 readLine()方法读取每一行后,再写入到另一个文件中去时,要注意写入每行时必须要添加换行符 "/n" ,因为 readLine() 已将读入的换行符删除。

 

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 进行重定向。

你可能感兴趣的:(IO小结)