ファイル操作
ファイルの情報を得る
ファイル操作は、実用的なプログラムの作成では重要な課題の一つです
ここで、いよいよファイル操作を学習していこうと思います
ファイルの入出力に関する操作はjava.ioパッケージを使用します
ファイルに関数情報をカプセル化しているクラスがjava.io.Fileクラスです
ファイルに関する情報を得るには、Fileクラスのインスタンスを生成します
コンストラクタの次の三つのいずれかの方法でインスタンス化できます
public File( String path )
public File( String path, String name )
public File( File dir, String name )
pathには、ファイルへのパスを指定します
最初の書式では、直接絶対パス指定でファイルの参照を指定します
ファイル名だけの場合は、classファイルからの相対パスになります
nameはファイル名を指定します
現在の絶対パスからの相対アドレスとしてファイル名を指定します
一番下の書式も同様ですが、ディレクトリのパスをFileオブジェクトで行う方法です
ディレクトリのパスが格納されたFileオブジェクトを第一パラメータに指定します
Fileクラスはオブジェクトが参照しているファイルの情報をカプセル化しています
ファイルの有無やサイズなどの情報をメソッドから引き出すことができます
ファイルの存在を調べるにはexists()メソッドを使用します
public boolean exists()
このメソッドは、オブジェクトが参照しているファイルが存在すればtrueを
存在していなければfalseを返します
プラットフォーム固有のファイルシステムによっては、ファイルの権限なども重要になります
当然これらの情報も読み出すことができます
ファイルが読み取り可能かどうかを調べるにはcanRead()メソッドを
書き込めるかどうかを調べるにはcanWrite()メソッドを使用します
public boolean canRead()
public boolean canWrite()
canRead()メソッドは、読み取り可能であればtrueを、そうでなければfalseを返します
同様にcanWrite()メソッドは、書き込み可能であればtrueを、そうでなければfalseを返します
import java.io.File;
class test {
public static void main(String args[]) {
try {
File file = new File(args[0]);
System.out.println(file.exists() ?
"ファイルは存在します" : "ファイルがありません :" + args[0]);
System.out.println("このファイルは" + (file.canRead() ?
"読み込み可能です" : "読み込み不可能です"));
System.out.println("このファイルは" + (file.canWrite() ?
"書き込み可能です" : "書き込み不可能です"));
}
catch(ArrayIndexOutOfBoundsException err) {
System.out.println("使い方 : java test <ファイルパス>");
}
}
}
コマンドラインから引数としてファイル名を指定します
Fileコンストラクタは、実行中のclassファイルのディレクトリからの相対パスとして
指定されたファイルへの参照をカプセル化したインスタンスを生成します
ファイルが存在しない場合、canRead()、canWrite()はfalseを返します
Fileコンストラクタにはディレクトリを指定することもできます
つまり、ディレクトリへの参照を持つオブジェクトも生成できるのです
そこで、オブジェクトの参照がファイルなのかディレクトリなのかを知る必要があります
オブジェクトがディレクトリかどうかを調べるにはisDirectory()を
オブジェクトがファイルかどうかを調べるにはifFile()メソッドを使用します
public boolean isDirectory()
public boolean isFile()
isDirectory()はオブジェクトがディレクトリであればtrue、そうでなければfalse
isFile()はオブジェクトがファイルであればtrue、そうでなければfalseを返します
import java.io.File;
class test {
public static void main(String args[]) {
try {
File file = new File(args[0]);
System.out.println(file.isDirectory() ?
"ディレクトリです" : "ディレクトリではありません");
System.out.println(file.isFile() ?
"ファイルです" : "ファイルではありません");
}
catch(ArrayIndexOutOfBoundsException err) {
System.out.println("使い方 : java test <ファイルパス>");
}
}
}
やはり、ファイルが存在しない場合は両方のメソッドともにfalseを返します
が、ファイルが存在する場合は、必ず排他的な結果が得られます
指定したオブジェクトが、現在どのようなパスをもっているか知りたい場合もあります
オブジェクトのファイル名を得るにはgetName()メソッドを
絶対パスはgetAbsolutePath()メソッドを
パス名の基準形式(システム依存)はgetCanonicalPath()メソッドを
現在のパス名の親ディレクトリ名を得るにはgetParent()メソッドを
オブジェクトで表されたファイルパスはgetPath()メソッドを、それぞれ使います
public String getAbsolutePath()
public String getCanonicalPath() throws IOException
public String getName()
public String getParent()
public String getPath()
それぞれが、取得する目的の名前をString型として返します
IOException例外クラスは、なんらかのIOエラーが発生した時に割り込みます
また、getParent()メソッドでは親ディレクトリの指定がない場合はnullを返します
import java.io.File;
class test {
public static void main(String args[]) {
try {
File file = new File(args[0]);
System.out.println("絶対パス : " + file.getAbsolutePath());
System.out.println("基準形式 : " + file.getCanonicalPath());
System.out.println("ファイル名 : " + file.getName());
System.out.println("親ディレクトリ名 : " + file.getParent());
System.out.println("ファイルパス : " + file.getPath());
}
catch(ArrayIndexOutOfBoundsException err) {
System.out.println("使い方 : java test <ファイルパス>");
}
catch(java.io.IOException err) {
System.out.println("IOエラー : " + err);
}
}
}
もうわかっていると思いますが、ファイルの表示についてはシステム依存です
そのプラットフォーム固有の方法でディレクトリの指定などをしてください
このほかにも、ファイルサイズを取得するlength()メソッドや
オブジェクトが絶対パスかどうかを調べるisAbsolute()メソッド
ディレクトリにあるファイルの一覧を得るlist()メソッドなどがあります
ファイル操作
ディレクトリの作成はmkdir()メソッドを使用します
作成するディレクトリを、オブジェクトの親ディレクトリも含める場合はmkdirs()を使います
public boolean mkdir()
public boolean mkdirs()
それぞれ成功した時はtrue、失敗した時はfalseを返します
import java.io.File;
class test {
public static void main(String args[]) {
try {
File file = new File(args[0]);
if (file.exists()) {
if (file.isDirectory()) {
System.out.println("すでに存在しています");
return;
}
}
if (!file.mkdir()) System.out.println("ディレクトリの作成に失敗しました");
}
catch(ArrayIndexOutOfBoundsException err) {
System.out.println("使い方 : java test <ファイルパス>");
}
}
}
適切な名前のディレクトリを引数として実行すると
プログラムによってディレクトリが作成されます
最後に、現在存在しているファイルの削除を行いましょう
ファイルやディレクトリの削除にはdelete()メソッドを使用します
public boolean delete()
ファイルを削除でき時はtrueを、それ以外はfalseを返します
オブジェクトがディレクトリを参照している場合
そのディレクトリにファイルが格納されていると削除することはできません
import java.io.File;
class test {
public static void main(String args[]) {
try {
File file = new File(args[0]);
System.out.println(file.delete() ? "OK" : "削除に失敗しました");
}
catch(ArrayIndexOutOfBoundsException err) {
System.out.println("使い方 : java test <ファイルパス>");
}
}
}