Java でファイルと入出力を操作する方法
出典:
Medium このチュートリアルでは、Java でファイルを作成、読み取り、書き込み、削除する方法を説明します。また、File クラス、InputStreamクラス、およびOutputStreamクラスがどのように機能するかについても学習します。
導入
Java では、ファイルは
Fileクラスによって表されます。
Fileクラスは、ファイルの作成、読み取り、書き込み、削除のためのメソッドを提供します。入出力 (I/O) は、プログラムとファイル、ネットワーク ソケット、コンソールなどの外部ソースとの間でデータを転送するプロセスです。
Java には、 InputStreamクラスや
OutputStreamクラスなど、入出力用のクラスが多数用意されています。
ファイルの作成
ファイルを作成するには、
File.createNewFile()メソッドを使用できます。同じ名前のファイルが存在しない場合は、新しいファイルが作成されます。そのようなファイルがすでに存在する場合、
createNewFile()メソッドはIOExceptionをスローします。現在のディレクトリに
myfile.txtという新しいファイルを作成する方法の例を次に示します。
File myFile = new File("myfile.txt");
myFile.createNewFile();
ファイルの読み取り
Java でファイルを読み取るには、
FileInputStreamクラスを使用できます。ファイルからバイトを読み取るメソッドを提供します。ファイルの内容を読み取るには、
read()メソッドを使用する必要があります。このメソッドは、ファイルから 1 バイトを読み取り、そのバイトの値を返します。たとえば、次のコードはファイル
myfile.txtの内容を読み取り、それをコンソールに出力します。
File myFile = new File("myfile.txt");
FileInputStream inputStream = new FileInputStream(myFile);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, bytesRead));
}
inputStream.close();
録音ファイル
ファイルに書き込むには、
FileOutputStreamクラスを使用できます。ファイルにバイトを書き込むためのメソッドを提供します。文字列の内容をファイルに書き込むには、
write()メソッドを使用します。このメソッドは、指定された配列から指定されたバイト数をファイルに書き込みます。以下は、文字列「Hello, world!」の記述例です。
myfile.txtファイルに:
File myFile = new File("myfile.txt");
FileOutputStream outputStream = new FileOutputStream(myFile);
byte[] buffer = "Hello, world!".getBytes();
outputStream.write(buffer);
outputStream.close();
ファイルの削除
Java でファイルを削除するには、
File.delete()メソッドを使用する必要があります。削除するファイルが存在しない場合、
delete()メソッドはfalseを返します。
myfile.txtファイルを削除するコードの例を次に示します。
File myFile = new File("myfile.txt");
myFile.delete();
結論
この投稿では、ファイルと I/O Java の操作の基本について説明しました。ファイルの作成、読み取り、書き込み、削除の方法を学習しました。
また、 Fileクラス、
InputStream クラスおよび
OutputStreamクラスについても学習しました。
Objects クラスのユーティリティ メソッド - それらの操作方法
出典:
Inside Javaこの投稿により、 Objectsクラスで提供されるさまざまなメソッドについての知識が深まります。Java のObjects クラスには、オブジェクトに対してさまざまな操作を簡単に実行できるようにする多くのユーティリティ メソッドがあります。
Objectsクラスは、 JDK リリースでいくつかの更新を受けています。JDK 8 と 9 では非常に重要な更新があり、JDK 16 と 19 ではマイナーな更新があります。Objects
クラスの使用方法を見てみましょう。
オブジェクトの比較
オブジェクトには、 2 つのオブジェクトの値を比較するためのいくつかのオプションが用意されています。
Objects実装を使用する主な利点は、
null の発生に対する安全性です。
等しい()
以下は 2 つのレコードを比較する例です。
record RaceTime(String runnerName, Duration time) {}
RaceTime nullValue = null;
RaceTime billy =
new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime copyOfbilly =
new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));
nullValue.equals(billy);
Objects.equals(nullValue, billy);
Objects.equals(billy, nicolai);
Objects.equals(billy, copyOfbilly);
deepEquals()
Objectsクラスでは、
deepEquals()を使用して2 つの配列を比較することもできます。通常の
quals()とは異なり、これは配列に格納された値を比較するため、より一貫性のある結果が得られます。
基本的に、このメソッドはArrays.deepEquals()を経由します。
record RaceTime(String runnerName, Duration time) {}
RaceTime billy =
new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));
RaceTime[] raceTimes1 = new RaceTime[] { billy, nicolai };
RaceTime[] raceTimes2 = new RaceTime[] { billy, nicolai };
Objects.equals(raceTimes1, raceTimes2);
Objects.deepEquals(raceTimes1, raceTimes2);
比較する()
Objects には、2 つのオブジェクトとComparator<T>を受け取ることができる
Compare()メソッドもあります。
Compare()メソッドは、引数の 1 つが
nullの場合、許容される戻り値がないため、
Objectsの数少ないnull -unsafe メソッドの1 つです。
record RaceTime(String runnerName, Duration time) {}
class RaceTimeComparator implements Comparator<RaceTime> {
@Override
public int compare(RaceTime o1, RaceTime o2) {
return o1.time.compareTo(o2.time);
}
}
RaceTime billy =
new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));
Objects.compare(billy, nicolai, new RaceTimeComparator());
Objects.compare(null, nicolai, new RaceTimeComparator());
文字列とハッシュコード
Objectsクラスは、オブジェクトをString 値とHashCode値に変換するメソッドを提供します。繰り返しますが、これらのメソッドの主な利点は、 null の発生から安全であることです。
文字列に変換
より興味深いメソッドの 1 つは
toString(obj, nullDefault)で、エラーが発生した場合にデフォルト値を提供します。これは、
toIdentityString(obj) が、渡されたオブジェクトの
toString()と
hashCode()を、どちらのメソッドも上書きされていないかのように返すことを意味します。
record RaceTime(String runnerName, Duration time) {}
RaceTime nullValue = null;
RaceTime billy =
new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));
Objects.toString(billy);
Objects.toString(nullValue);
Objects.toString(nullValue, "Did not finish");
Objects.toIdentityString(billy);
ハッシュコードに変換
オブジェクトには、オブジェクトをそのハッシュ コード値に変換するメソッドも提供されます。
record RaceTime(String runnerName, Duration time) {}
RaceTime nullValue = null;
RaceTime billy =
new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));
Objects.hashCode(nullValue);
Objects.hashCode(billy);
Objects.hash(billy, nicolai);
nullのチェック
Objectsクラスには、
nullをチェックして処理するためのメソッドがいくつか用意されています。
null で NullPointException をスローする
requireNonNull(obj)メソッドは、渡された値が
nullの場合、 NullPointException をスローします。
record RaceTime(String runnerName, Duration time) {
RaceTime{
runnerName = Objects.requireNonNull(runnerName);
time = Objects.requireNonNull(time);
}
}
ユーザーへのメッセージとともに null に対して NullPointException をスローする
requireNonNull(obj, String)メソッドは、渡された値が
nullの場合、ユーザーにメッセージを含む
NullPointExceptionエラーをスローします。
record RaceTime(String runnerName, Duration time) {
RaceTime{
runnerName = Objects.requireNonNull(runnerName, "runner name required!");
time = Objects.requireNonNull(time, "race time required!");
}
}
null の場合はデフォルト値を返します
requireNonNullElse(obj,defaultValue)メソッドは、
objがnullの場合、渡された
defaultValueを返します。
record RaceTime(String runnerName, Duration time) {
RaceTime{
runnerName = Objects.requireNonNullElse(runnerName, "John Smith");
time = Objects.requireNonNullElse(time, Duration.ZERO);
}
}
サプライヤーの使用
Objectsクラスには
、requireNonNull(obj, Supplier<String>)メソッドと
T requireNonNullElseGet(T, Supplier<T>)メソッドも提供されており、これらを使用してメッセージまたはデフォルト値を提供できます。これらは、メッセージまたはデフォルト値の作成がパフォーマンスに重大な影響を与える場合にのみ使用してください。
record RaceTime(String runnerName, Duration time) {
static Supplier<String> noNameMsgSupplier = () -> "runner name required!";
static Supplier<String> noTimeMsgSupplier = () -> "race time required!";
RaceTime{
runnerName = Objects.requireNonNull(runnerName, noNameMsgSupplier);
time = Objects.requireNonNull(time, noTimeMsgSupplier);
}
}
record RaceTime(String runnerName, Duration time) {
static Supplier<String> noNameValueSupplier = () -> "John Smith";
static Supplier<Duration> noTimeValueSupplier = () -> Duration.ZERO;
RaceTime{
runnerName = Objects.requireNonNullElseGet(runnerName, noNameValueSupplier);
time = Objects.requireNonNullElseGet(time, noTimeValueSupplier);
}
}
予測nullチェック
オブジェクトは述語で使用するためのnullチェックを提供しますが、他のシナリオでも同様に使用できます。
record RaceTime(String runnerName, Duration time) {}
RaceTime nullValue = null;
Objects.nonNull(nullValue);
Objects.isNull(nullValue);
インデックスチェック
最後に、
Objectsクラスは、 File、
String、
Collection 、または同様のオブジェクトを走査するときにインデックス位置をチェックするためのいくつかのオプションを提供します。これらのメソッドの一部は最近 JDK 16 に追加されました。
int checkIndex(int index, int length)
int checkFromToIndex(int fromIndex, int toIndex, int length)
int checkFromIndexSize(int fromIndex, int size, int length)
long checkIndex(long index, long length)
long checkFromToIndex(long fromIndex, long toIndex, long length)
long checkFromIndexSize(long fromIndex, long size, long length)
GO TO FULL VERSION