talosのプログラミング教室

Java Gold合格への道 ~Java I/O・パスワードの入力~

こんにちは。たろすです。

今回はJava I/Oのパスワードの入力について説明します。

方法

Javaの標準入力でパスワードを入力させる際にはConsoleクラスのreadPasswordメソッドを使用します。

これを使用することで入力した文字がコンソールに表示されなくなります。

Console console;
char[] password = {};

if ((console = System.console()) != null && (password = console.readPassword("Enter new password:")) != null) {
	// パスワードをDBに登録する処理など
}

if文の中で二回null値の判定をしています。

EclipseなどのIDEではCosoleクラスに未対応なため、consoleメソッドはnullを返します。

一回目の判定は、そのような場合にreadLineメソッドを行おうとするとヌルぽになるため、nullではないことを確認しています。

また、コンソール上でCrtl+Cなどでプログラムを強制終了するとreadPasswordの戻り値はnullになります。

二回目の判定は、そのような場合にnullが標準入力の結果として変数に格納されないように確認しています。

おわりに

今回はJava I/Oのパスワードの入力について説明しました。

Java Gold合格への道 ~Java I/O・標準入力~

こんにちは。たろすです。

今回はJava I/Oの標準入力について説明します。

方法

Javaの標準入力はSystemクラスのconsoleメソッドを使用してConsoleオブジェクトを取得し、ConsoleオブジェクトのreadLineメソッドを使用することによって行えます。

Console console;
String line = null;

if ((console = System.console()) != null && (line = console.readLine()) != null) {
	// 読み取った文字列を使用した処理など
}

if文の中で二回null値の判定をしています。

EclipseなどのIDEではCosoleクラスに未対応なため、consoleメソッドはnullを返します。

一回目の判定は、そのような場合にreadLineメソッドを行おうとするとヌルぽになるため、nullではないことを確認しています。

また、コンソール上でCrtl+Cなどでプログラムを強制終了するとreadLineの戻り値はnullになります。

二回目の判定は、そのような場合にnullが標準入力の結果として変数に格納されないように確認しています。

おわりに

今回はJava I/Oの標準入力について説明しました。

Java Gold合格への道 ~Java I/O・プリミティブ型のデータ出力~

こんにちは。たろすです。

今回はJava I/Oのプリミティブ型のデータ出力について説明します。

方法

PrentStreamやPrintWriterクラスを使用することでプリミティブ型をそのまま出力できます。

機能はほぼ同じなのでここではPrintWriterの使い方を紹介します。

String filePath = "sample.txt";
try (PrintWriter writer = new PrintWriter(filePath)) {
	writer.println(1);
	writer.println(0.1);
	writer.println(true);
} catch (FileNotFoundException e) {
	e.printStackTrace();
}

try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
	String line;
	while ((line = br.readLine()) != null) {
		System.out.println(line);
	}
} catch (FileNotFoundException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
}
1
0.1
true

printメソッドは改行なしの出力、printlnメソッドは改行ありの出力です。

printlnはプラットフォームにあわせた改行文字を出力するため、開発者が意識する必要はありません。

おわりに

今回はJava I/Oのプリミティブ型のデータ出力について説明しました。

Java Gold合格への道 ~Java I/O・読み込みの位置制御~

こんにちは。たろすです。

今回はJava I/Oの読み込みの位置制御について説明します。

位置制御の方法

位置制御にはmarkメソッドやresetメソッド、skipメソッドを使います。

try (BufferedWriter bw = new BufferedWriter(new FileWriter(filePath))) {
	bw.write("abcdefgh");
} catch (IOException e) {
	e.printStackTrace();
}

try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
	for (int i = 0; i < 3; i++) {
		System.out.print((char) br.read());
		br.skip(1);
	}

	System.out.println();

	br.mark(3);
	System.out.println(br.readLine());

	br.reset();
	System.out.println(br.readLine());

} catch (FileNotFoundException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
}
ace
gh
gh

skipメソッドは引数の分だけデータをスキップします。

なので一文字飛ばしで「ace」と出力されます。


markメソッドは現在の位置にマークを設定します。

引数は読み取ることができる文字数の上限です。

最後に「e」が出力され、その後に1バイトスキップされているので現在位置は「g」になります。

そこからreadLineで1行読み込んでいるので「gh」と出力されます。


resetメソッドは最後に設定されたマークに移動します。

「g」の位置にマークがあるのでそこに移動し、readLineで1行読み込んでいるので「gh」と出力されます。

おわりに

今回はJava I/Oの読み込みの位置制御について説明しました。

Java Gold合格への道 ~Java I/O・ファイルの読み書き~

こんにちは。たろすです。

今回はJava I/Oのファイルの読み書きについて説明します。

ファイルの読み書き方法

1文字ずつ

バイナリファイルの読み書きにはFileInputStreamとFileOutputStream、テキストファイルの読み書きにはFileReaderとFileWriterを使います。

String filePath = "files/text.txt";

// ファイル書き込み
try (FileWriter writer = new FileWriter(filePath)) {
	writer.write('a');
} catch (IOException e) {
	e.printStackTrace();
}

// ファイル読み取り
try (FileReader reader = new FileReader(filePath)) {
	int c;
	while ((c = reader.read()) != -1) {
		System.out.print((char) c);
	}
} catch (FileNotFoundException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
}
a

ファイルの書き込みにはwriteメソッドを使います。

一方で読み込みにはreadメソッドを使います。

readメソッドではファイルの終端に達すると-1を返すため、-1になるまでwhileループを回します。

戻り値はintなのでcharにキャストして出力しています。

1行ずつ

BufferedReaderとBufferedWriterを使います。

String filePath = "files/text.txt";

try (BufferedWriter bw = new BufferedWriter(new FileWriter(filePath))) {
	bw.write("abc");
	bw.newLine();
	bw.write("def");
} catch (IOException e) {
	e.printStackTrace();
}

try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
	String line;
	while ((line = br.readLine()) != null) {
		System.out.println(line);
	}
} catch (FileNotFoundException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
}
abc
def

書き込みにはwriteメソッド、読み込みにはreadLineメソッドを使います。

newLineメソッドはプラットフォームあわせた改行を入れることができます。

readLineメソッドは終端まで達するとnullを返すので、nullになるまでwhileループを回しています。

おわりに

今回はJava I/Oのファイルの読み書きについて説明しました。

Java Gold合格への道 ~Java I/O・Fileクラス~

こんにちは。たろすです。

今回はJava I/OのFileクラスについて説明します。

Fileクラス

Fileクラスはファイルやディレクトリを扱うためのクラスです。

ファイルのデータを読み書きする機能はありません。

Fileクラスの主なメソッド

try {
	// ファイルの作成
	File file = new File("files/tmp/sample.txt");
	file.createNewFile();

	// ファイルの存在有無確認
	if (file.exists()) {
		System.out.println(file.getName() + "は存在します。");
	} else {
		System.out.println(file.getName() + "は存在しません。");
	}
	
	// ファイルかどうかの判定
	if (file.isFile()) {
		System.out.println(file.getName() + "はファイルです。");
	} else {
		System.out.println(file.getName() + "はファイルではありません。");
	}

	// 絶対パスの表示
	System.out.println("絶対パス:" + file.getAbsolutePath());

	// ファイルの最終更新日の表示
	System.out.println("最終更新日:" + Instant.ofEpochMilli(file.lastModified()));

	// ファイルの長さの表示
	System.out.println("ファイル長:" + file.length());

	// 親ディレクトリの表示
	File dir = new File("files/tmp");
	System.out.println("親ディレクトリ:" + dir.getParent());

	// ディレクトリかどうかの判定
	if (dir.isDirectory()) {
		System.out.println(dir.getName() + "はディレクトリです。");
	} else {
		System.out.println(dir.getName() + "はディレクトリではありません。");
	}

	// リストの表示
	System.out.print("ディレクトリ内のリスト:");
	for (String fileName : dir.list()) {
		System.out.print(fileName + " ");
	}
	System.out.println();
	
	// ファイルの削除
	file.delete();

	// リストの表示
	System.out.print("ディレクトリ内のリスト:");
	for (File f : dir.listFiles()) {
		System.out.print(f + " ");
	}
} catch (IOException e) {
	e.printStackTrace();
}
sample.txtは存在します。
sample.txtはファイルです。
絶対パス:C:\pleiades\workspace\java-gold\JavaIO\files\tmp\sample.txt
最終更新日:2022-01-29T05:35:31.222Z
ファイル長:0
親ディレクトリ:files
tmpはディレクトリです。
ディレクトリ内のリスト:sample.txt 
ディレクトリ内のリスト:

createNewFile()

指定のファイルが存在しない場合は新規作成します。

exists()

ファイルが存在するかを判定します。

isFile()

普通のファイルかどうかを判定します。

getAbsolutePath()

絶対パスを返します。

lastModified()

ファイルの最終更新時間を返します。

length()

ファイルの長さを返します。

getParent()

ディレクトリを返します。

isDerectory()

ディレクトリかどうかを判定します。

list()

ディレクトリ内のリストやファイルの名前の配列を返します。

delete()

ファイルやディレクトリを削除します。

listFiles()

ディレクトリ内のファイルの配列を返します。

おわりに

今回はJava I/OのFileクラスについて説明しました。

Java Gold合格への道 ~日付/時刻API・Instant~

こんにちは。たろすです。

今回は日付/時刻APIのInstantについて説明します。

Instantとは

Instantは1970年1月1日0時0分0秒からの経過秒数(エポック数)を保持するクラスです。

Instantオブジェクトの生成

LocalDateTimeなどと同様にnowメソッドで現在の日時を取得できます。

System.out.println(Instant.now());
2022-01-21T04:34:20.664Z


その他の日時オブジェクトからはtoInstantメソッドによって取得できます。

System.out.println(LocalDateTime.now().toInstant(ZoneOffset.ofHours(0)));
2022-01-21T13:34:20.717Z


ofEpochSecondメソッドやofEpochMilliメソッドを使うことによってエポックから引数の分だけ経過した日時を取得できます。

System.out.println(Instant.ofEpochMilli(0));
1970-01-01T00:00:00Z

おわりに

今回は日付/時刻APIのInstantについて説明しました。