题目:

java实验7(图1)


运行代码:

import java.io.*;
import java.util.*;

class Write{  //写入文件类,因为涉及到目录和文件都需要写入,所有我封装成一个类
	void Writef(String[] con,File file){//可参考书上283页15.5
		try{
			FileWriter fw=new FileWriter(file);   
			BufferedWriter bufw=new BufferedWriter(fw);
			for(int i=0;i<con.length;i++){//循环数组,逐行输入
				bufw.write(con[i]);
				bufw.newLine();
			}
			bufw.close();
			fw.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
public class lixiao7 {
	
	public static void main(String[] args) {
		    //列出指定目录中所有的子文件名与所有的目录名。
			File f = new File("d:");
			File dir = new File("d:\\dir.txt");
			
			//判断dir文件是否已经存在,如果存在删掉重写,如果不存在,那么创建
			if(dir.exists()){
				dir.delete();
			}else{
				try{
					dir.createNewFile();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
			
			
			String[] str1 = f.list();//返回f下所有文件和目录名 返回值是String
			
			
			Write fa=new Write();//创建写入类
			
			
		     //列出指定目录中所有的子文件名与所有的子目录名
			
			String Direc[]=new String[str1.length];
			int k=0;//用于递增Direc数组
			
			//循环目录下list目录
			File[] str3 = f.listFiles();
			for(int i=0;i<str3.length;i++){
				File ff = str3[i];
				if(!str3[i].isDirectory()){
					Direc[k]=ff.getName();
				    k++;
				}
			}
			
			
			//循环目录下list目录
			File[] str2 = f.listFiles();//返回当前文件目录下所有文件和目录的绝对路径集合,返回值是File对象,主要用于判断是文件还是目录
			for(int i=0;i<str2.length;i++){
				File ff = str2[i];
				if(str2[i].isDirectory()){
					Direc[k]=ff.getName()+"<dir>";
				    k++;
				}
				   
			}
			
			
			//输出文件内容
			fa.Writef(Direc,dir);
			try{
				FileReader fr=new FileReader(dir);
				BufferedReader bufr=new BufferedReader(fr);
				String s=null;
				int i=0;
				while((s=bufr.readLine())!=null){
					i++;
					System.out.println(s);
				}
				bufr.close();
				fr.close();
			}catch(Exception e){
				e.printStackTrace();
			}
			
	
	}
 
}



这次实验呢,比上次难一点点,涉及到很多知识,程序健壮性还是比较好的,原因是用了和多异常抛出,从而不会导致整个程序崩掉!注释在我看来还是比较全的;至于其中有个小知识点;



File.list()  返回的是当前文件夹目录下所有文件和目录的文件名,返回值是String数组;

File.listFiles()  返回的是当前文件目录下所有文件和目录的绝对路径的集合,返回值是File对象数组


思考:

       在文件中,文件夹和文件是分开排序的,而在我的代码中,一大部分工作是为了将文件和文件夹分开写入dir.txt文件而做的工作,可以考虑是否修改掉这部分代码,直接使用File.list()返回的String数组作为Direc的参数传入写入dir.txt。特别注意的是,题目中要求在目录后面加上<dir>;

补充代码:

import java.io.*;
public class lixiao7 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//读取文件数组并存入Name
		File dir=new File("D:\\dir.txt");
		dir.delete();
        File fD=new File("D:\\");
        File[] f1=fD.listFiles();
        String[] Name=new String[f1.length];
        int n=0,m=f1.length-1;
        for(int i=0;i<f1.length;i++){
        	if(f1[i].isDirectory()){
        		Name[m]=f1[i].getName()+"<dir>";
        		m--;
        	}else{
        		Name[n]=f1[i].getName();
        		n++;
        	}
        }
        
        
        
        //写入和读出文件
        try{
          //创建dir.txt
         try{
        	dir.createNewFile();
          }catch(Exception e){
           	System.out.println("dir.txt创建失败!");
          }
          
          //写入文件
          FileWriter fw=new FileWriter(dir);
          BufferedWriter bufw=new BufferedWriter(fw);
          for(int i=0;i<f1.length;i++){
        	  bufw.write(Name[i]);
        	  bufw.newLine();
          }
          bufw.flush();
          bufw.close();
          fw.close();
        }catch(Exception e){
        	System.out.println("写入文件失败!");
        }
        
        //读出
        try{
			FileReader fr=new FileReader(dir);
        	BufferedReader bufr=new BufferedReader(fr);
        	String s=null;
        	int i=0;
        	while((s=bufr.readLine())!=null){
        		i++;
        		System.out.println(s);
        	}
        	bufr.close();
        	fr.close();
        }catch(Exception e){
        	System.out.println("读出文件失败!");
        }
        
	}

}