Javaではファイルを操作するにはパスの指定が必要です。
しかし、ファイルのパスは環境によって区切り文字が違うので注意が必要です。
この記事では、
・ファイルの区切り文字(separator)とは
・プラットフォームごとの区切り文字の対応
・ファイル区切り文字の問題点
という基本的な内容から、
・プラットフォームごとに適したセパレータを生成する方法
・セパレータを置換する方法
などの応用的な使い方に関しても解説していきます。
今回はファイルのセパレータについて、わかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
ファイルの区切り文字(separator)とは
ファイルセパレータ(区切り文字)とは、ファイルのパス指定において、パスとファイルを区切るときに使用する「¥」「\」「/」などの文字のことを指します
このファイルの区切り文字は、WindowsやLinuxなどのプラットフォームごとに指定方法が異なります。
以下ではプラットフォームごとにパスを指定していますが、Windows、Mac/Linuxで指定方法が異なることがわかります。
//Windows File file = new File("c:¥¥tmp¥¥java.txt"); //Mac File file = new File("/Users/ユーザー名/tmp/java.txt"); //Linux File file = new File("/home/ユーザー名/tmp/java.txt”);
そもそもファイルのパスがどのようなものかについて詳しく知りたい方はこちらの記事を確認してください。
プラットフォームごとの区切り文字の対応
ファイル区切り文字の問題点
上述したようにOSごとに区切り文字が異なるため、Fileクラスを使用する場合は、OSで使用されている区切り文字を適切に扱う必要があります。
Windowsなら「¥」「\」、MacやLinuxなら「/」。
そのため、Fileクラスで異なるOSのファイル区切り文字を使用した場合、処理がうまくいかず環境によっては例外が発生する可能性もあります。
このような問題を避けるためには、ファイルのパス/ファイルは文字列で行わずにFileクラスのメソッドを使用する方法が確実です。
プラットフォームごとに適したFileクラスを生成する
プラットフォームごとに適切な区切り文字を指定するためには、Fileクラスのオブジェクト生成時に、getParentFileメソッドを指定する方法があります。
以下にgetParentFileメソッドを使用したオブジェクトを生成する方法を記述します。
public class fileClass{ public fileClass() throws IOException{ File file1 = new File("/Users/Shared/java/java.txt"); //getParentFileで親ディレクトリを取得する File file2 = new File(file1.getParentFile(), "java.txt"); System.out.println(file2.getPath()); } }
実行結果:
/Users/Shared/java/java.txt
このサンプルでは、Fileクラスのfile1オブジェクトではパス/ファイル名を文字列で指定していますが、file2のオブジェクトでは、第一引数にfile1に対してgetParentFile()で親ディレクトリを取得し、第二引数でファイル名を指定しています。
getParentFileメソッドを使用すれば、使用している開発環境のセパレータを取得できますので、プラットフォームごとに正しいパスを取得できます。
区切り文字を置換する方法
文字列のパス/ファイルの区切り文字を置換するには、StringクラスのreplaceAllメソッドを使います。
replaceAllメソッドは区切り文字を一括で置換することができるので、区切り文字を指定して置換することができます。
replaceAllメソッドを使用して、区切り文字を一括で置換する方法を次のプログラムで確認してみましょう。
public class fileClass{ public fileClass() throws IOException{ File file = new File("/Users/Shared/java/java.txt"); String strPath = file.getPath(); System.out.println("置換前:" + strPath); // replaceAllメソッドを使用する strPath = strPath.replaceAll("/", "¥"); System.out.println("置換後:" + strPath); } }
実行結果:
置換前:/Users/Shared/java/java.txt 置換後:¥Users¥Shared¥java¥java.txt
極端な例ですが、replaceAllメソッドを使用すれば区切り文字をLinux/Macの「/」からWindowsの「¥」に変換することができます。
文字列の一括置換については、以下の記事で詳しく解説しています!
JDKのインストールとパスを設定する方法
Javaのプログラミング入門者がつまずきやすいのが、JDKをインストールするときに行うパスの設定です。
環境変数などの実際のパスの設定がどのように行われるのかを知りたい方にはぜひ確認していただきたいオススメの内容です。
JDKのインストールとパスの設定についてはこちらの記事で詳しく解説しているので、ぜひ確認してください。
Fileクラスについてもっと詳しく知りたい方へ
Fileクラスのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
まとめ
ここでは、ファイルパス指定持のセパレータについて、プラットフォームごとの違いや問題点、正しくセパレータを取得する方法や置換する方法などを解説しました。
JavaはマルチプラットフォームでOSに依存しないプログラミング言語ですが、OSごとの特性を理解していないと、今回のセパレータのように、思わぬ不具合が発生してしまうこともあります。
もしファイルのセパレータの指定方法を忘れてしまったら、この記事を思い出してくださいね!