io包中有很多输入输出流的实现类,常用的就有:Buffered输入输出、ReaderWriter、File输入输出、InputStreamReader与OutputStreamWriter、对象序列反序列用的ObjectInputStream与ObjectOutputStream……。
不过用法也大同小异,远没有看上去那么困难,不过是装饰者模式的又一具体应用。只要明白节点流、处理流的概念,加上装饰者模式,基本就没什么问题。
输入流常用方法:
void | close() 关闭此输入流并释放与该流关联的所有系统资源。 |
abstract int | read() 从输入流中读取数据的下一个字节。 |
int | read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。 |
int | read(byte[] b, int off, int len) |
输出流方法
方法摘要 | |
---|---|
void | close() 关闭此输出流并释放与此流有关的所有系统资源。 |
void | flush() 刷新此输出流并强制写出所有缓冲的输出字节。 |
void | write(byte[] b) 将b.length个字节从指定的 byte 数组写入此输出流。 |
void | write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量off开始的len个字节写入此输出流。 |
abstract void | write(int b) 将指定的字节写入此输出流。 |
这是一个Demo:
/**
* 拷贝文件夹(目前仅能从文件夹拷贝到文件夹,否则出错。)
* 删除文件夹
*
*
* @author garview
*
* @Date 2013-11-3上午10:59:52
*/
public class IOUtil {
public static void main(String[] args) throws IOException {
// testCopyFile() ;
// testCopyDir();
testDeleteDir();
}
public static void testCopyDir() throws IOException{
String srcPath = "C:/KuGou/test/FeiqCfg.xml";
String destPath = "C:/KuGou/test/test";
copyDir(srcPath,destPath);
}
public static void testDeleteDir(){
File file = new File("C:/复件 复件 test");
deleteDir(file);
}
//拷贝文件夹及里面所有文件
//1.确定要拷贝的源文件夹路径及目标文件夹路径
//2.遍历源文件夹——>1)文件——>拷贝2)文件夹——>递归调用自己
public static void copyDir(String srcPath, String destPath) throws IOException{
File src = new File(srcPath);
File dest = new File(destPath);
copyDir(src, dest);
}
public static void copyDir(File src, File dest) throws IOException {
//确保文件夹src,dest存在
if(!src.exists()){
throw new FileNotFoundException(src.getAbsolutePath()+"找不到文件路径");
}
//确保文件夹src,dest不在同一路径下,防止死递归。
if(dest.getAbsolutePath().contains(src.getAbsolutePath())){
System.out.println("文件夹src,dest不能在同一路径下");
return;
}
//目前仅能从文件夹拷贝到文件夹,否则出错。
/* if(src.isFile()) {
copyFile(src, dest);
return;
}*/
if(!dest.exists()) {
dest.mkdirs();
}
/**
* 遍历src文件夹
* 1)文件——>拷贝
* 2)文件夹——>递归调用自己
*/
File[] files = src.listFiles();
for(File temp : files) {
File tempDest = new File(dest.getAbsolutePath(),temp.getName());
System.out.println(tempDest.getAbsolutePath());
if(temp.isFile()){
//新的源及新的目标文件
copyFile(temp, tempDest);
}else if(temp.isDirectory()){
//File tempSrc = new File(src.getAbsolutePath(),temp.getPath());
// File tempDest = new File(dest.getAbsolutePath(),temp.getName());
//System.out.println(tempDest.getAbsolutePath());
copyDir(temp,tempDest);
}
}
}
public static void copyFile(File src, File dest) throws FileNotFoundException,IOException {
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dest);
byte[] buffer = new byte[1024];
int length = 0;
while(-1!=(length = fis.read(buffer))){
fos.write(buffer, 0, length);
}
fos.flush();
fis.close();
fos.close();
}
public static void testCopyFile() throws FileNotFoundException, IOException{
File src = new File("C:/HelloWorld2.java");
File dest = new File("C:/HelloWorld3.java");
copyFile(src, dest);
}
public static void deleteFile(File file){
boolean flag = file.delete();
String msg = file.getAbsolutePath();
if(flag){
msg += " delete success!";
}else {
msg += " delete failed!";
}
System.out.println(msg);
}
public static void deleteDir(File file){
if(file.isFile()) {
deleteFile(file);
return;
}
if(file.isDirectory()){
File[] files = file.listFiles();
/*File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
boolean flag = pathname.getAbsolutePath().contains("HelloWorld");
return flag;
}
});*/
for(File temp : files) {
File tempDest = new File(file.getAbsolutePath(),temp.getName());
if(temp.isFile()) {
deleteFile(tempDest);
} else if(temp.isDirectory()) {
deleteDir(tempDest);
}
}
}
if(file.exists()) {
deleteFile(file);
}
}
}