IO流
一、引言
由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择。因为文件是一种常见的数据源,而且读写文件也是程序员进行IO编程的一个基本能力。本章IO类的使用就从读写文件开始。
文件(File)是最常见的数据源之一,在程序中经常需要将数据存储到文件中,例如图片文件、声音文件等数据文件,也经常需要根据需要从指定的文件中进行数据的读取。当然,在实际使用时,文件都包含一个的格式,这个格式需要程序员根据需要进行设计,读取已有的文件时也需要熟悉对应的文件格式,才能把数据从文件中正确的读取出来。
二、File类
路径
在不同的操作系统环境下,文件路径的表示形式是不一样的,在Windows操作系统中一般的表示形式为C:\windows\system,而Unix上的表示形式为/user/my。在java中’\’是Java语言中的特殊字符,所以写文件路径时,要写成“C:\\windows\\system”或者“C:/windows/system”,使用“/”可以兼容windows和linux系统。
路径中的“\”替换成“/”:
File file = new File("D:/java/java.java");
file.createNewFile();
String path = file.getCanonicalPath();
String path2 = path.replaceAll("\\\\", "/");
System.out.println(path2);
File类常用方法
1)mkdir、mkdirs、createNewFile方法,返回boolean类型表示是否创建成功
mkdir、createNewFile如果当前路径中包含的父目录不存在时,不会创建,并且抛出异常。
mkdirs如果当前路径中包含的父目录不存在时,会自动根据需要创建。
2)exists方法
判断当前文件或文件夹是否存在。
3)isFile、isDirectory方法
判断当前File对象是否是文件(目录)。
4)list、listFiles方法
list返回当前文件夹下所有的文件名和文件夹名称;listFiles返回所有文件名。注意:该名称不是绝对路径。
5)getPath()、getAbsolutePath()和getCanonicalPath()方法
getPath()返回的是File构造方法里的路径,是什么就是什么,不增不减。
getAbsolutePath()返回的其实是当前路径+getPath()的内容,如:F:\workspace\test\..\src\test.txt。
getCanonicalPath()返回的就是标准的将符号完全解析的路径。
6)getName方法
获得当前文件或文件夹的名称。
7)getParent方法
获得当前路径中的父路径。例如c:\test\1.t则返回c:\test。
8)length方法
返回文件存储时占用的字节数。
9)delete方法
删除当前文件或文件夹
如果删除的是文件夹,则该文件夹必须为空。如果需要删除一个非空的文件夹,则需要首先删除该文件夹内部的每个文件和文件夹,然后在可以删除,这个需要书写一定的逻辑代码实现。
/**
* 通过递归调用删除一个文件夹及下面的所有文件
*/
public static void deleteFile(File file) {
if (file.isFile()) {// 表示该文件不是文件夹
file.delete();
} else {
// 首先得到当前的路径
String[] childFilePaths = file.list();
for (String childFilePath : childFilePaths) {
File childFile = new File(file.getAbsolutePath() + "\\" + childFilePath);
deleteFile(childFile);
}
file.delete();
}
}
三、IO流

- 字节流:以字节为单位。
- 字符流:以字符为单位,一个字符=两个字节,注意编码格式要统一。
基本方法
InputStream:
1)int read() ; // 读取一个字节,返回值为所读的字节
2)int read( byte b[] ); // 读取多个字节,放置到字节数组b中,通常读取的字节数量为b的长度,返回值为实际读取的字节的数量
3)int read(byte b[], int off, int len) // 从第off位置开始读,读len个字符
4)int available( ); // 返回值为流中尚未读取的字节的数量
OutputStream:
1)void write( int b ); // 往流中写一个字节
2)void write( byte b[] ); // 往流中写一个字节数组
3)void write(byte b[], int off, int len) // 从第off位置开始写,写入len个字节
int len = 0;
byte[] buffer = new byte[512];
while ((len = in.read(buffer)) != -1) { // len的目的在于防止最后一次读取的字节小于buffer长度,
out.write(buffer, 0, len); // 否则会自动被填充0
}
4)flush();
// 刷空输出流,并输出所有被缓存的字节
// 输入流没有此方法,因为输入流的缓冲功能是先将内容一次读到缓冲区,再从缓冲区中读到程序中
// 只有BufferedOutputStream实现了缓冲功能,OutputStream和FileInputStream的flush()方法都是空方法
Reader:
1)int read() ;
2)int read(char cbuf[])
3)int read(char cbuf[], int off, int len)
writer:
1)void write(int c)
2)void write(char cbuf[])
3)void write(String str, int off, int len)
4)void flush();
5)void write(String str)

浙公网安备 33010602011771号