Javaクラスの使用方法まとめ（備忘録）

大学の授業でJavaをよく使うのですが、クラスの使い方や動作などは時間が経つと忘れてしまいがちです。
JavaDocやネット検索すればわかるのですが、自分の理解を深めるためにもよく使うクラスの機能を書き留めておくことにしました。また、引数の使い方など、クラスではないけど、基本的で大切なものもメモしています。
javadocなどとは違い、実際に手を動かして使いやすいような書き方を目指しています。

# 列挙型
enumと呼ばれる。型と変数を定義することで、列挙型をオブジェクトとして利用できる。クラスのように扱える上に、一度定義したenumオブジェクトの内容を修正したり、変数を追加することはできない。このため、宣言した変数は定数として扱うことができ、プログラムの安全性を向上させることができる。
列挙型とはstatic（静的）な変数をまとめて型付けをしたものである。以下の様
な記述となる。
public enum 型　{
	変数名1，変数名2，…
}
型.変数名1で参照することができる。

# 可変⻑引数
引数の個数が可変なメソッドを定義できる。
public void method1（型 ... 変数名）｛
	...
}
メソッドの定義において引数の型の後に半角ドットを3個連ねて記述するこ
とで、そのメソッドを可変長引数とすることができる。
引数の個数が決まらないメソッドに適している。



# Path (java.nio.Path)
ファイルシステムのファイルを特定するために使用可能なオブジェクトである。通常、それはシステムに依存する絶対パス／相対パスである。特別な区切り文字で区切られた一連のディレクトリ名およびファイル名の要素で構成される階層構造のパスを表す。
通常、ファイルやディレクトリの場所を表したいときに、文字列として記録するよりも安全なオブジェクトとして使われる。Pathに依存しているPathsクラスを用いて操作できる。以下のように記述すると、data1.txtの相対パスを宣言できる。
Path path = Paths.get("data1.txt");
さらに、以下のように記述すると絶対パスを宣言できる。
Path path = Paths.get("/home/user/example.txt");


# StandardCopyOption（列挙型）
Files.copy()や、Files.move()などの標準コピーを行うメソッドに対して使用できるオプションを提供するenum（列挙型）である。
Files.copy(Path source, Path target, StandardCopyOption.REPLACE_EXISTING);のように記述すると、すでにファイルが存在している場合、そのファイルに上書きする動作をする。COPY_ATTRIBUTESを使用すると、元ファイルの属性もコピーすることができる。さらに、ATOMIC_MOVEであれば、中断されない一括移動が可能である。

# Files (java.nio.file.Files)
ファイル、ディレクトリなどのファイルを操作するstaticメソッドのみを定義するクラスである。このクラス内の多くのメソッドは実際のファイル操作をそれ自身で行わずに、java.nio.file.spi.FileSystemProviderクラスなどに任せる。
## copy (Files.copy)
Files.copy(Path sourse, Path target)のように使う。
ファイルをsourceからtargetにコピーできる。
入力ストリームからのすべてのバイトをファイルにコピーしたり、ファイルから出力ストリームに全バイトをコピーすることもできる。
## move (Files.move)
Files.move(Path source, Path target)では、ファイルを移動または名称変更ができる。Files.exsists(Path path)では、ファイルが存在する確認することができる。
## delete (Files.delete)
Files.delete(Path target)では、ファイルを削除できる。

## size (Files.size)
FIle.size(Path path)では、ファイルサイズを取得できる。

## readAllLines(Files.readAllLines)とwrite(Files.write)
さらに、readAllLinesメソッドではファイルのテキストを一括で読み込み、writeメソッドではファイルにテキストを一括で書き込むことができる。これらを組み合わせると以下のように使用できる。
```java
List<String> file = Files.readALlLines(Path source);
Files.write(Path target, files);
```

## createDirectories (Files.createDirectories)
親ディレクトリも含めて、階層的に（再帰的に）ディレクトリを作成する。
ディレクトリが存在する場合は無視して進む。
```java
Path path = Paths.get("parent/child");
//"parent"が存在していればその中に"child"を作成。
//"parent"が存在しないときは、"parent"と"child"両方作成。
//"child"がすでに存在していたら、何もエラーを出さずに終了。
Files.createDirectories(path);
```
もちろん、"child"だけを単一で作成することも可能。

## createDirectory (Files.createDirectory)
１つのディレクトリを作成する。
親ディレクトリが存在していない場合、エラーとなる。
ディレクトリが存在する場合は、エラーとなる。
（存在確認ができる）
```java
Path path = Paths.get("parent/child");
//"parent"が存在していたらその中に"child"を作成。
//"parent"が存在していない時はエラー。
//"child"が存在しているときはエラー。
Files.createDirectory(path);
```
もちろん、"child"だけを単一で作成することも可能。


# BasicFileAttributes
多くのファイルシステムで必須またはオプショナルとなっているファイルの属性を基本属性（Basic Attributes)という。これを取得するためのインタフェースである。
例えば、creatationTime()では作成日時、lastModifiedTime()では最終更新日時、lastAccessTime()では最終アクセス日時、size()ではファイルサイズをバイトで取得できる。
例えば、creationTime()メソッドを使用する場面には以下のようなものがある。
BasicFileAttributes data = Files.readAttributes(
    Paths.get("data.txt"),
    BasicFileAttributes.class
);
System.out.println("作成日時: " + data.creationTime());

# LocalDateTime
不変の日時を表すクラスであり、タイムゾーンを含まない。タイムゾーンまたはその他の補正情報がない限り、時系列上のインスタンスとして表すことができず、ナノ秒単位で時刻を記録することができる。ISO-8601(2007-12-03T10:15:30のような形式）に準拠する日時を記録するのに適している。
　例えば、LocalDateTime.now()では現在の日時を取得でき、LocalDateTime.of(AAAA, BB, CC, DD, EE)でAAAA-BB-CCTDD:EEといった特定の時刻情報を取得できる。また、LocalDateTime.now().plusDays(1)で１日先の日時を取得でき、LocalDateTime.now().minusHours(1)で１時間前の日時を取得できる。

# ZoneId
タイムゾーンをIDで表現する。
ZoneId.systemDefault()を使用すると、システムで使用されている規定のタイムゾーンからIDを取得できる。また、ofメソッドを使用して、明示的にIDを取得したいタイムゾーンを指定できる。例えば、以下のように記述すると、東京のタイムゾーンに調整された現在時刻が取得できる。
ZoneId tokyo = ZoneId.of("Asia/Tokyo");
ZonedDateTime time = ZonedDateTime.now(tokyo);
変数timeは、System.out.print(time)等で出力できる。
これ以外にも、"UTC"と入力することで、協定世界時による時刻が取得できる。

# Class
Classクラスのオブジェクトは、実行中のJavaアプリケーションのクラスを表したものであり、リフレクションを行うAPIである。例えば、あるクラスが持っているフィールドやクラスの情報を取得したいときに有効である。
例えば、インスタンスからそのクラス名を取得したい時は、getClassメソッドを使用することで実現できる。以下のように記述すると、クラス名が出力される。
String a = "a";
Class<?> A = a.getClass(); 
System.out.println(A.getName());

Class型で宣言される変数は、インスタンス型からのみならず、クラス名から直接宣言することもできる。これにはclassメソッドを使用する。以下に、上記で行った結果と同じ結果を出力する例を示す。
Class<String> B = String.class;
System.out.println(A.getName());