金子邦彦研究室プログラミングJava のプログラム例ファイル操作

ファイル操作

ファイル名,サイズ,ディレクトリか一般ファイルかの取得など

関連する外部ページ http://www.atmarkit.co.jp/fjava/rensai2/jspservlet09/jspsevlet09_1.html

ファイルの情報を取り出す

ファイルの情報(名前・サイズ・ディレクトリか一般ファイルか)を取り出す。

ackage hoge.hoge.com;

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

public class FileList {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        File FileDir = new File("C:\\workspace\\test_prog");
        File[] FileList=FileDir.listFiles();
        System.out.println("ファイル構成:" + FileDir.getParent() + "\\" + FileDir.getName());
        System.out.println("");
        System.out.println("name\ttype\tsize");
        for(int i=0;i

ファイル操作プログラム

プログラム内容

指定されたパスがディレクトリかそうでないかを判定し、 ディレクトリであればそのディレクトリ下にあるファイルの名前とサイズを出力する

package hoge.hoge.com;

import java.io.*;

public class GetFileTest {

    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ

        String path = "C:\\workspace\\GetFileTest";
        
        //パス名のオブジェクト化
        File dir = new File(path);
        //ディレクトリかどうか判定
        if (!dir.isDirectory()) {
            System.out.println("ディレクトリではないか、"
                                + "または存在しません。");
            return;
        }
        //再帰的リスト
        recursive(dir, 0);
    }
    
    static void recursive(File dir, int indent) {
        //ディレクトリの内容の取得
        String[] contents = dir.list();

        //その出力
        for (int i=0; i < contents.length; i++) {
            //インデント
            for (int j=0; j < indent; j++) {
                System.out.print("    ");
            }

            //サブパスのオブジェクト化
            File sdir = new File(dir, contents[i]);
            System.out.println(contents[i] + "("+ sdir.length() + ")");
            //ディレクトリならば再帰的にリスト
            if (sdir.isDirectory()) {
                recursive(sdir, indent+1);
            }
        }
    }

}

ディレクトリ中の全てのファイルとディレクトリを表示

DirTest.java

package hoge.hoge.com;

import java.io.File;
import java.io.IOException;

public class DirTest {
      public static void main(String[] args) {
            File file = new File("C:\\Tomcat55\\common");
            pln(file.toString());
            searchDir(file, 1);
          }
         
          private static void searchDir(File dir, int depth) {
              int i,j;
             
            File[] files = dir.listFiles();
            if(files == null) return;
            for (i = 0; i < files.length; i++) {
              File file = files[i];
              if (file.isDirectory()) {
                  for(j=0;j < depth;j++) p("  ");
                  if(i==files.length-1)p("┗ ");
                  else p("┣ ");
                  pln(file.getName());
                  searchDir(file, depth+1);
              } else {
                  for(j=0;j < depth;j++) p("  ");
                  if(i==files.length-1)p("┗ ");
                  else p("┣ ");
                  p(file.getName());
                  pln("\t"+file.length()+" byte");
              }
            }
          }
          private static void p(Object s) {
                System.out.print(s);
              }
          private static void pln(Object s) {
                System.out.println(s);
              }
        }

ディレクトリ内のファイルとディレクトリの一覧の表示

DirListを実行すると、標準入力にディレクトリ名を入力するように求められる。 入力すると、そのディレクトリを検索し、存在する場合は、ディレクトリ内のファイルとディレクトリの一覧を表示する。 さらに、そのディレクトリが存在するのと同じ階層に、"ディレクトリ名_Log.logと"いうテキストファイルを出力する。 DirListのmainでは、保存した後に、ファイル名を入力してもらい、上記のテキストファイルを読み出す処理を行う。 LogIOは、このテキストファイルの読み書きを行うメソッドを含んでいる。

プログラムの内容

パッケージ名

DirList.java

package test.com;

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

public class DirList {
    
    // ディレクトリ名を受け取り、ファイルデータの配列を返す
    public static StringBuffer[] dirList(){
            
        String dirpath = new String(); //ディレクトリのパス
        String itemName = new String("名前,タイプ,最終更新,サイズ[Byte]");
        
        try{
            BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("ディレクトリ名:");
            dirpath = input.readLine();
        }
        catch(IOException e){
            e.printStackTrace();
        }
        
        File dir = new File(dirpath);
        
        if(dir.exists()==false){
            System.err.println(dir.getAbsolutePath()+"は存在しません");
            return null;
        }
        else if(dir.isDirectory()==false){
            System.err.println(dir.getAbsolutePath()+"はディレクトリではありません");
            return null;
        }
        else{
            Date lastModif = new Date(dir.lastModified());    //最終更新日時
            
            System.out.println(dir.getAbsolutePath()+"の情報 (最終更新:"+lastModif+")");
            System.out.println();
            System.out.println(itemName);
            
            File[] fnames = dir.listFiles();    //Fileクラスでリストを取得
            StringBuffer[] fstats = new StringBuffer[fnames.length];    //StringBufferクラスのリスト定義
            
            for(int i=0;i < fnames.length;i++){
                fstats[i] = new StringBuffer(fnames[i].getName());    //Fileクラスから、ファイル名を取得
                lastModif = new Date(fnames[i].lastModified());
            
                // オブジェクトがファイルの場合
                if(fnames[i].isFile()){
                    fstats[i].append(",file,").append(lastModif).append(",").append(fnames[i].length());    //データサイズを取得
                }
                // オブジェクトがディレクトリの場合
                else if(fnames[i].isDirectory()){
                    fstats[i].append(",directory,").append(lastModif);
                }
                // オブジェクトがどちらでもない場合
                else{
                    fstats[i].append(",unknown,").append(lastModif);
                }
            }
            

            //内容の一覧表示
            for(int i=0;i < fstats.length;i++){
                System.out.println(fstats[i]);
            }
            
                        
            // ログファイルへの書きこみ
            LogOutput log = new LogOutput();
            System.out.println("取得したデータを"+log.writeLog(dir, fstats, itemName)+"として保存しました");
        
            return fstats;

        }
                
    }
    
    public static void main(String args[]){
        
        LogOutput log = new LogOutput();

        System.out.println();

        //ログファイルの取得
        if(dirList()!=null){
            try{
                BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
                System.out.print("ログファイル名:");
                log.readLog(input.readLine());
            }
            catch(IOException e){
                e.printStackTrace();
            }
        }
                
    }
    
}

LogIO.java

package test.com;

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

public class LogIO {

    private static String outFileCoding = "Shift_JIS";
    
    // ログファイルから読み出すメソッド
    public void readLog(String FileName){
        try{
            
            String line;
            
            // ログファイルをオープン
            BufferedReader inFile = new BufferedReader(
                    new InputStreamReader( new FileInputStream( FileName ), "JISAutoDetect" ) );
            
            // 一行目(データのインデックス)を読み込む
            StringTokenizer index = new StringTokenizer((inFile.readLine()),",");
            String[] items = new String[index.countTokens()];

            for(int i = 0;index.hasMoreTokens()==true;i++){
                items[i] = index.nextToken();    //インデックスを取得
            }
            
            // 各項目を表示する
            while( (line=inFile.readLine()) != null ){
                
                StringTokenizer filestat = new StringTokenizer(line,",");
                int TokenNum = filestat.countTokens();
                StringBuffer attr[] = new StringBuffer[TokenNum];
                
                // 項目表示のループ
                for(int i=0; filestat.hasMoreTokens()==true; i++){
                    attr[i]= new StringBuffer(items[i]).append(":").append(filestat.nextToken());
                }
                
                for(int i=0; i < attr.length; i++){
                    System.out.println(attr[i].toString());
                }
                System.out.println();
                
            }
            
            inFile.close();

        }
        catch(IOException e){
            e.printStackTrace();
        }
        

    }

    // ログファイルに書き出すメソッド(ログファイル名を返す)
    public String writeLog(File dir, StringBuffer[] line, String Item){
        
        String FileName = new String();
        
        try{
            
            /* ファイルが存在しない場合には新たに作成.存在する場合には上書き */
            BufferedWriter outFile = new BufferedWriter(
                    new OutputStreamWriter( new FileOutputStream( FileName = dir.getAbsolutePath()+"_Log.log" ), outFileCoding ) );

            outFile.write(Item);
            outFile.newLine();
                        
            for(int i=0;i < line.length;i++){
                outFile.write(line[i].toString());
                outFile.newLine();
            }
            
            outFile.close();
        }
        catch(IOException e){
            e.printStackTrace();
        }

        
        return FileName;
    }
}