コンストラクタと値 - Fileクラス - 萌えJava超入門
Fileクラス

コンストラクタと値

Fileはファイルやディレクトリを扱う一番メジャーなクラスです。

new File("pathname.txt");

目次

1.インスタンスの生成


Fileクラスのインスタンスは、1つのファイル、又はディレクトリを表します。
Fileクラスは、java.io の所属です。
使用するためには「import java.io.File;」が必要です。
Fileクラスのインスタンスは、ファイルパスを表す文字列を与えて
new演算子で生成します。

ご参照↓
    第十五章 アクセス修飾子
    publicとimport

 public File(String pathname)

コンストラクタ 書式
String pathname;
   File file = new File(pathname);
import java.io.File; が必要です。




2.サンプルコード

萌えJava超入門
とりあえずインスタンスを生成してみよう。
文字列のリテラルは「""」で文字列を囲む。
絶対パスでも相対パスでも大丈夫だが、
相対パスがオススメだ。
//Sample01_01.java

import java.io.File;

class Sample01_01{
    public static void main(String[] args){
      File file = new File("pathname.txt");
      String strPath = file.getPath();//←パス名取得
      System.out.println(strPath);
    }
}

この例では file が生成されたインスタンスです。
インスタンスを生成しただけではよくわからないので、「file.getPath()」でパス名を取得してみました。
出来上がった Sample01_01.java を ws ディレクトリに保存して、コマンドラインから、コンパイルと実行をしてみましょう。

コマンドライン
>cd ws
ws>javac Sample01_01.java
ws>java Sample01_01
pathname.txt  ←ファイルパス

萌えJava超入門
これで
wsディレクトリ にある
「pathname.txt」というファイル
(又はディレクトリ)を示す
Fileクラスのインスタンスが生成で来た。
萌えJava超入門 萌えJava超入門
簡単ね。


3. インスタンスの生成はファイルの生成じゃない

萌えJava超入門
ここで重要なのが、
Fileのインスタンスを生成しても
そのファイルが実在するかどうか
分からない点だ。
萌えJava超入門 萌えJava超入門
え?
インスタンスの生成=ファイルの生成
じゃないの?
萌えJava超入門
実は、Fileクラスのインスタンス化は、
変数 path に、引数の文字列を
代入するだけだ。
Fileクラス コンストラクタと値の抜粋

Fileクラスのコンストラクタを見てみましょう。
引数である pathnameを、 String変数の path に代入しただけです。

Fileクラスのコンストラクタと値の抜粋
  private final String path;

  public File(String  pathname) {
      if (pathname == null) {
          throw new NullPointerException();
      }
      this.path = fs.normalize(pathname);
      this.prefixLength = fs.prefixLength(this.path);
  }

萌えJava超入門
「normalize」や。
「prefixLength」が気になるが、
今はスルーだ。
重要
  インスタンスの生成は、ファイルの生成 ではありません。
  引数の文字列を、String変数の path に代入しただけです。
  この時点では、ファイルの生成も、存在の確認も行っていないのです。
  この存在の不確かなpathの文字列を「抽象パス名」と呼びます。

萌えJava超入門
もう一つだけ。
一度生成されたコンストラクタの
抽象パス名は変更できない。
Stringクラスに似ているな。
重要
  String変数の path には、
  final修飾子が付与されているので、変更できません

萌えJava超入門
これだけだと実感がわかないな。
もう少し説明を続けよう。




萌えJava超入門 萌えJava超入門


5.prefixLength と normalize の知らなくてもいい話


萌えJava超入門
どーしても気になっちゃう人だけ
読んでくれ。
でも超ザックリだぞ?
normalizeメソッドの超ザックリな役割
 インスタンス化する際に与えた文字列は、path に代入される前に
 FileSystem#.normalizeメソッドによって標準化されます。
 具体的には
  • ファイル区切り文字の重複の修正 "//" → "/"
  • ファイル区切り文字の読替 '/' → '¥' (Windows版のみ)
 が行われます。

final int変数 prefixLengthの超ザックリな役割
 抽象パス名の内、ルートを表す文字列が先頭から何文字あるかを示す値です。
 具体的には
  • Linux版では、先頭文字が「/」であれば prefixLength=1 その他は prefixLength=0
  • Windows版では、先頭文字が「\\」とか「c:」とかならその文字数 その他は prefixLength=0
 です。
    prefixLength == 0 なら相対パス
    prefixLength != 0 なら絶対パスとして扱われます。



お疲れ様でした。




© 2019 awasekagami