package cn2;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.InputStream;
import java.io.OutputStream;
/** 1. 得到某个目录下的所有的java文件集合
1.1 得到目录 File srcDir = new File("d:\\java");
1.2 得到目录下的所有java文件:File[] files = srcDir.listFiles(new MyFileFilter());
1.3 只想得到.java的文件: class MyFileFilter implememyts FileFilter{
public boolean accept(File pathname){
return pathname.getName().endsWith(".java")
}
}
2.将每个文件复制到另外一个目录,并改扩展名
2.1 得到目标目录,如果目标目录不存在,则创建之
2.2 根据源文件名得到目标文件名,注意要用正则表达式,注意.的转义。
2.3 根据表示目录的File和目标文件名的字符串,得到表示目标文件的File。
//要在硬盘中准确地创建出一个文件,需要知道文件名和文件的目录。
2.4 将源文件的流拷贝成目标文件流,拷贝方法独立成为一个方法,方法的参数采用抽象流的形式。
//方法接受的参数类型尽量面向父类,越抽象越好,这样适应面更宽广。
}
*/
/**
* listFiles
public File[] listFiles(FilenameFilter filter)返回抽象路径名数组,
这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
除了返回数组中的路径名必须满足过滤器外,此方法的行为与 listFiles() 方法相同。
如果给定 filter 为 null,则接受所有路径名。否则,
当且仅当在此抽象路径名及其表示的目录中的文件名或目录名上调用过滤器的
FilenameFilter.accept(java.io.File, java.lang.String)
方法返回 true 时,该路径名才满足过滤器。
参数:
filter - 文件名过滤器
返回:
抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。如果目录为空,
那么数组也将为空。如果此抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null。
*/
public class Jad2Java {
public static void main(String[] args) throws Exception {
File srcDir = new File("D:/Test");// 查找目录
if (!(srcDir.exists() && srcDir.isDirectory()))// 当且仅当此抽象路径名表示的文件存在//且是一个目录时,返回
// true;否则返回 false
throw new Exception("目录不存在");
File[] files = srcDir.listFiles(new FilenameFilter() {// FilenameFilter实现此接口的类实例可用于过滤器文件名
// 此过滤器是否接受给定的文件。
// dir - 被找到的文件所在的目录。 name - 文件的名称。
public boolean accept(File dir, String name) {// 测试指定文件是否应该包含在某一文件列表中。
return name.endsWith(".java");
}
});
System.out.println(files.length);
File destDir = new File("D:/Test/jad");
if (!destDir.exists())
destDir.mkdir();
for (File f : files) {
FileInputStream fis = new FileInputStream(f);
// getName返回由此抽象路径名表示的文件或目录的名称。
String destFileName = f.getName().replaceAll("\\.java$", ".jad");
FileOutputStream fos = new FileOutputStream(new File(destDir, destFileName));
copy(fis, fos);
fis.close();
fos.close();
}
}
/**
* public int read(byte[] b)
throws IOException从输入流中读取一定数量的字节,
并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。
在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。
如果 b 的长度为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。
如果因为流位于文件末尾而没有可用的字节,则返回值 -1;否则,
至少读取一个字节并将其存储在 b 中。
将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推。
读取的字节数最多等于 b 的长度。设 k 为实际读取的字节数;
这些字节将存储在 b[0] 到 b[k-1] 的元素中,不影响 b[k] 到 b[b.length-1] 的元素。
类 InputStream 的 read(b) 方法的效果等同于:
read(b, 0, b.length)
参数:
b - 存储读入数据的缓冲区。
返回:
读入缓冲区的总字节数;如果因为已经到达流末尾而不再有数据可用,则返回 -1。
请添加说明文字
* @param ips
* @param ops
* @throws Exception
*/
private static void copy(InputStream ips, OutputStream ops) throws Exception {
int len = 0;
byte[] buf = new byte[1024];
while ((len = ips.read(buf)) != -1) {
ops.write(buf, 0, len);
}
}
}