javaseday23补充(遍历指定目录保存到文件 序列流 多个序列流 合并 枚举和迭代 )

/*

 * 获取指定目录下 指定扩展名的文件(包含子目录中)
 * 这些文件的据对路径写入到一个文本文件中
 *
 * 简单说 就是建立一个指定扩展名的文件的列表
 * 思路
 * 1、必须进行深度遍历
 * 2、要在遍历的过程中进行过滤 将符合条件的内容都存储到容器中
 * 3、对容器中的内容进行遍历并将绝对路径写入到文件中
 */
public class Test02 {
public static void main(String[] args) throws IOException {
File dir = new File("F:\\毕向东");
FilenameFilter filter = new FilenameFilter(){//匿名内部类


@Override
public boolean accept(File dir, String name) {


return name.endsWith(".java");
}


};
List<File> list = new ArrayList<File>();
getFiles(dir,filter,list);
File destFile = new File(dir,"javalist.txt");
write2File(list,destFile);


}
/**
* 对指定目录中的内容进行深度遍历 并按照指定过滤器  进行过滤
* 将过滤后的内容存储到指定容器List中
* @param dir
* @param filter
* @param list
*/
public static void getFiles(File dir, FilenameFilter filter,List<File> list){
File[] files = dir.listFiles();
for(File file :files){
if(file.isDirectory()){//如果多了个!会导致文件无法添加 因为 文件 再次递归始终无法加入
//递归
getFiles(file,filter,list);
}else{
//对遍历到的文件进行过滤器的过滤 将复合条件的File对象存储到List集合中
if(filter.accept(dir, file.getName())){
list.add(file);
}
}
}
}
//将集合中的文件写入到目的地
public static void write2File(List<File> list,File destFile) throws IOException {
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(destFile));
for(File file :list){
bw.write(file.getAbsolutePath());
bw.newLine();
bw.flush();
}


} //没抓就抛出来处理
/*catch (FileNotFoundException e) {
throw new RuntimeException("写入失败");
}*/finally{
if(bw!=null)
try {
bw.close();
} catch (IOException e) {
throw new RuntimeException("关闭失败");
}
}


}
}


IO包中的其他类

打印流 

printWriter 和 PrintStream 

可以直接操作输入流 和文件

序列流

SequenceINputStream

对多个流进行合并

操作对象

ObjectInputStream ObjectOutputStream

被操作的对象需要实现Serializable 标记接口



/*
* PrintStream
* 1、提供了打印方法 可以对多种数据类型值进行打印并保持数据的表示形式
* 2、它不抛IO异常
* 构造函数 接受3种类型的值
*  1、字符串路径
*  2、File对象
*  3、字节输出流
*/
PrintStream out = new PrintStream("info.txt");


out.write(619);//只写最低八位 最低的那个字节
// out.print(97);//将97先变成字符串保持原样 将数据打印到目的地 保持数据原样
// out.print();
out.close();



/Web用PrintWriter输出数据
public class PrintWriterDemo01 {
public static void main(String[] args) throws IOException {
/*
* PrintWriter 字符打印流
* 构造函数参数
* 1、字符串路径
* 2、File对象
* 3、字节输出流
* 4、字符输出流
*/
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// PrintWriter pw = new PrintWriter(System.out);//用回回来的数据
PrintWriter pw = new PrintWriter(new FileWriter("out.txt"),true);//用回回来的数据 保持数据原样性


String line = null;
while((line=br.readLine())!=null){
if("over".equals(line))
break;
pw.println(line.toUpperCase());//print加ln 也能达到加 系统分隔符的作用
pw.println(line);
}
pw.close();//eclipse中的红色终止直接干掉程序
br.close();//DOS 命令中的CTRL+C 向下运行
}
}

/*
* 将1.txt 2.txt 3.txt 文件中的数据合并到一个文件中
*/
// 有没有对象?没有
// 找方法 就去Collections 工具类找
// Vector<FileInputStream> v = new Vector<FileInputStream>();//用的少 效率低
// v.add(new FileInputStream("1.txt"));
// v.add(new FileInputStream("2.txt"));
// v.add(new FileInputStream("3.txt"));
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
for (int i = 1; i <=3; i++) {
al.add(new FileInputStream(i+".txt"));
}
//想要容器的时候就去工具类找方法
Enumeration<FileInputStream> en = Collections.enumeration(al);//封装了下面这一堆
// final Iterator<FileInputStream> it = al.iterator();
// Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {
//
// @Override
// public FileInputStream nextElement() {
//
// return it.next();//内部类访问局部变量要加final
// }
//
// @Override
// public boolean hasMoreElements() {
//
// return it.hasNext();
// }
// };
// Enumeration<FileInputStream> en = v.elements();
SequenceInputStream sis = new SequenceInputStream(en);


FileOutputStream fos = new FileOutputStream("4.txt");
byte[] buf = new byte[1024];
int len =0;
while((len=sis.read(buf))!=-1){
fos.write(buf,0,len);
}
fos.close();
sis.close();


javaseday23补充(遍历指定目录保存到文件 序列流 多个序列流 合并 枚举和迭代 )