Fileクラスはプログラミングの中でも特に重要性が高く、アプリやシステム開発には必須と言えるクラスです。
もちろんWebサイト構築にも必ず使われていると言っても良いほど使用頻度の高いクラスでもあります。
Fileクラスを使用することでファイルの読み込み/書き込みや削除/複製などファイル関連の操作が可能になります。
今回の記事ではそんなFileクラスの使い方について解説していきます。
Fileクラスとは
名前の通りファイルやディレクトリに関する全ての操作を行うクラスです。
Fileクラスには作成や複製・削除はもちろん、属性の操作や確認などファイルおよびディレクトリにまつわるメソッドが沢山ありますが、これらのメソッドを使用する為にはまずFileクラスをインポートする必要が有ります。宣言は以下の通りです。
import java.io.File;
また、Fileクラスの記述ルールは次のようになります。
File file = new File(引数);
引数にはファイル名及びディレクトリ名やパスなどが入ります。
新規作成
ファイルの新規作成にはcreateNewFileメソッドは使用します。
createNewFileメソッドでファイルを作成する場合には以下のように記述します。
File file = new File("ファイル名"); // インスタンスの引数にはファイル名を指定 file.createNewFile();
また同じようにディレクトリの新規作成にはmkdirメソッドを使用します。
mkdirメソッドでの記述は以下の通りです。
File dir = new File("ディレクトリ名"); // インスタンスの引数にはディレクトリ名を指定 dir.mkdir();
では実際にファイルを新規作成するまでの流れをコードで見てみましょう。
import java.io.File; import java.io.IOException; public class testClass { public static void main(String[] args) throws IOException { File file = new File("test.txt"); try { if (file.createNewFile()) { System.out.println("ファイル作成に成功しました。"); } else { System.out.println("ファイル作成に失敗しました。"); } } catch(IOException e) { System.out.println(e); } } }
このコードではFileクラスのオブジェクトを作成しCreateNewFileメソッドでファイルを新規作成しています。インスタンスの引数には”test.txt”を指定している為、実行ファイルと同階層に「test.txt」というファイルが作成されます。
削除
不要なファイルを削除するには、Fileクラスのdeleteメソッドを使用します。
deleteメソッドも記述ルールはcreateNewFileメソッドと同じです。
File file = new File("ファイル名"); // インスタンスの引数にはファイル名を指定 file.delete();
ディレクトリを削除する場合には、引数にディレクトリ名を指定するだけです。
ファイルに書き込む
ファイルに文字列を書き込む際には二つのクラスを使用します。一つ目はFileWriterクラス、もう一つはPrintWriterクラスです。これらのクラスを使用するにはクラスをインポートする必要があります。
import java.io.FileWriter; import java.io.PrintWriter;
二つのクラスは次のように記述します。
FileWriter file = new FileWriter("ファイル名"); // インスタンスの引数にはファイル名を指定 PrintWriter pw = new PrintWriter(new BufferedWriter(file));
実際にファイルに書き込む際にはprintlnメソッドを使用します。
PrintWriter println(“書き込む文字列”);
ファイルへ書き込む方法としては「上書き」と「追記」の二つがありますが、追記の場合にはFileWriterクラスの引数に「true」を指定するだけです。まずは次のコードを見てください。
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class testClass { public static void main(String[] args) throws IOException { try { File file = new File("test.txt"); // Fileオブジェクトの作成 // 1 PrintWriterオブジェクトを作成 // 2 FileWriterオブジェクトをBufferedWriterでラッピング // 3 バッファリングしてからPrintWriterでファイルへ出力 PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file, true))); //文字列を出力 pw.println("a"); pw.println("b"); pw.println("c"); pw.close(); // ファイルを閉じる } catch (IOException e) { System.out.println(e); } } }
このコードでは、インスタンスを生成し、次にPrintWriterクラスの宣言をしています。
そしてそのPrintWriterクラスの引数にBufferedWriterクラスでラッピングしたFileWriterクラスを指定することで、最終的にBufferedWriterクラスでバッファリングしたものをPrintWriterクラスで出力するという流れになっています。
なぜこのような流れにしているかについては、PwintWriterクラスは実行されると直ちにストリームへの出力をするため、BufferedWriter でラップしバッファリングすることが推奨されているからです。
またこのコードではFileWriterクラスの引数に「true」を指定している為、追記モードになっていることが分かります。最終処理としてcloseメソッドでファイル処理のリソースを開放することを忘れないようにしましょう。
ファイルを読み込む
FileReaderクラスを使用することでファイルを読み込むことが出来ます。
FileReaderクラスを使用する際の注意点としては、”FileNotFoundException”という例外が発生する可能性があるため、必ず例外処理を忘れないようにしてください。
FileReaderクラスを使ったコードは次のように記述します。
import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class testClass { public static void main(String[] args) throws IOException { try { File file = new File("test.txt"); FileReader filereader = new FileReader(file); int ch; while((ch = filereader.read()) != -1){ System.out.print((char)ch); } } catch(FileNotFoundException e) { System.out.println(e); } catch(IOException e) { System.out.println(e); } } }
readメソッドは1文字読み込むと自動でポインタが次のターゲットに移ります。この習性を利用する為、Whileでread処理を繰り返します。最後の文字になるとreadメソッドは-1を返してくるので処理はここで止まるというわけです。
またwhileの中ではprintlnではなく敢えてprintを使用しています。これはprintlnを使うことで1文字ずつ改行されてしまうのを防ぐためです。printメソッドは最後の文字が処理された場合においても改行文字すら表示しようとするので自動的に改行されます。
ファイルをコピーする
コピーの方法についてはいくつかありますが、ここではJDK7以降で追加された”New I/O 2(NIO2)”というAPIを使った方法をご紹介します。
NIO2のFileクラスを使用する為のクラスインポートは忘れないようにしてください。それでは次のコードを見てみましょう。
import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) throws IOException { String spa = FileSystems.getDefault().getSeparator(); try { Path sourcePath = Paths.get("." + spa + "test.txt"); Path targetPath = Paths.get("." + spa + "sample" + spa + "test.txt"); Files.copy(sourcePath, targetPath); System.out.println("コピーが成功しました"); } catch (IOException e) { System.out.println(e); } } }
このコードでは、指定したファイルを別のディレクトリにコピーしています。
このようにcopyメソッドを使うと、コピー元のファイルパスとコピー先のファイルパスを指定するだけで簡単にコピーを実行することが出来ます。
またコピー先に同名のファイルが存在する場合に上書きコピーする方法としては、copyメソッドにオプションで「StandardCopyOption.REPLACE_EXISTING」を指定するだけで大丈夫です。
存在を確認する
ファイルの存在を確認する為にはexistsメソッドを使用します。
このメソッドも記述方法はcreateNewFileメソッドと一緒です。
File file = new File("ファイル名"); // インスタンスの引数にはファイル名を指定 file.exists();
Fileクラスの処理はファイルが存在しない場合、例外(FileNotFoundException)が発生します。Fileクラスのメソッドを使用する際には必ず事前にexistsメソッドでファイルの有無を確認する癖をつけるようにしましょう。
アクセス権限に注意!
existsメソッドは、仮にファイルが存在してもアクセス権限が無いと”false”を返すので注意しましょう。
まとめ
今回はFileクラスについて説明しました。
Fileクラスはどの言語においても頻繁に使うことになるクラスです。プログラミングを覚える中でこのクラスを外して考えることはまずあり得ませんので、完全に理解するまで何度も繰り返して構築し、色々なパターンを練習することを強くお勧めします。
またこの他の方法でもまだまだやり方は無数にありますので、どの方法が一番処理速度が速いのかなどの学習もしてみると面白いかもしれません。
mkdirメソッドとmkdirsメソッド
同じようなメソッドでmkdirsメソッドというものがあります。
ディレクトリを作成する際に該当ディレクトリの親ディレクトリすら存在していない場合にはコンパイルエラーとなります。このような場合にはmkdirsメソッドを使うことで親ディレクトリもまとめて作成することが出来ます。