Java の型の比較
出典:
Theflashreads この記事では、Java のいくつかの型比較オプションについて学びます。 特定のオブジェクトが特定のクラス、スーパークラス、またはインターフェイスの
インスタンスであるかどうかを判断する最も一般的な方法は、バイナリの
instanceof演算子を使用することです。これには暗黙的な null チェックが含まれており、型がバインドされていない場合はコンパイル時エラーが生成されます。ただし、プリミティブの使用は許可されておらず、コンパイル時に型がわかっている必要があります。
動的なランタイムチェックが必要な場合
この場合、 Classで同等の
ブール値 isInstance(Object obj)メソッドを使用します。null チェックも含まれていますが、プリミティブも許可されています。
a instanceof B
null instanceof B
a.getClass().isInstance(b);
Class<T> type = b.getClass();
type.isInstance(a);
int x = 4;
Integer.class.isInstance(x);
2 つのタイプの互換性を確認する
サブタイプの関係を確認する必要がある場合は、
Classの
boolean isAssignableFrom(Class<?> cls)メソッドを使用します。
これはNullPointerException をキャッチするのに役立ちます。
Class<?> aClass = CharSequence.class;
Class<?> bClass = String.class;
bClass.isAssignableFrom(aClass());
CharSequence[].class.isAssignableFrom(String[].class);
Integer[].class.isAssignableFrom(String[].class);
パターンマッチング (Java 14)
if(a instanceof B b) {
b.toString();
}
特殊なタイプ
enum Color { WHITE, GRAY, BLACK }
Color.class.isEnum();
Color.WHITE instanceof Enum;
String[].class.isArray();
Class<?> componentType = obj.getComponentType();
int.class.isPrimitive();
Java.io - Java での I/O 操作
出典:
Medium この記事の内容は、Java での I/O 操作に関するものです。 AndroidやJavaのアプリケーション開発において、入出力(Java I/O)はよく使われるトピックの一つですが、なぜかあまり言及されません。ただし、その適用範囲は広く、たとえば、ビットマップ画像を JPEG 形式に変換するときや、通常のファイルを読み書きするときに I/O 操作を実行します。Java パッケージ java.io には、I/O 操作を実行するために必要なクラスがすべて含まれています。これらの操作はスレッドを使用して実行されます。さらに、スレッドは読み取りまたは書き込み操作の実行を支援します。たとえば、ファイルにメッセージを書き込む場合です。
ストリームの種類
Java には 2 種類のスレッドがあります。
- バイトストリーム (バイトストリーム)
- キャラクターストリーム
バイトストリーム
バイト ストリームは、1 バイトのデータの読み取りと書き込みに使用されます。これには、Java の
InputStream クラスと
OutputStreamクラスが含まれます。
InputStream はデータの読み取りに役立ち、
OutputStream はターゲット (ファイル) へのデータの書き込みに役立ちます。
文字ストリーム
Character Stream は、1 文字のデータの読み取りと書き込みに使用されます。これには、
Readerおよび
Writer Java クラスが含まれます。
Readerと
Writerを理解するには、
InputStreamReader、
FileReader、
OutputStreamWriter、
FileWriterなど の派生クラスを理解する必要があります。
入力ストリームと出力ストリーム
InputStream は、ソース (ファイルなど) からデータを読み取るために使用されます。これ自体は役に立ちませんが、
FileInputStream、
ByteArrayInputStream、
ObjectInputStreamなどのいくつかの派生クラスがあります。
OutputStream は、ターゲット (場合によってはファイル) にデータを書き込むために使用されます。その派生クラスは、
FileOutputStream、
ByteArrayOutputStream、および
ObjectOutputStreamです。
class InputOutput {
data class Car(val name: String): java.io.Serializable
fun fileStream() {
val outputStream = FileOutputStream("kotlin.txt")
outputStream.write(1)
outputStream.write("hello".toByteArray())
val inputStream = FileInputStream("kotlin.txt")
println(inputStream.read())
val msg = String(inputStream.readBytes())
println(msg)
outputStream.close()
inputStream.close()
}
fun byteArrayStream() {
val outputStream = ByteArrayOutputStream()
outputStream.write(1)
outputStream.write("hello".toByteArray())
val readByteArray = outputStream.toByteArray()
val inputStream = ByteArrayInputStream(readByteArray)
println(inputStream.read())
val msg = String(inputStream.readBytes())
println(msg)
outputStream.close()
inputStream.close()
}
fun objectStream() {
val car = Car(name = "BMW")
val fileOutputStream = FileOutputStream("kotlin.txt")
val objOutputStream = ObjectOutputStream(fileOutputStream)
objOutputStream.writeObject(car)
val fileInputStream = FileInputStream("kotlin.txt")
val objInputStream = ObjectInputStream(fileInputStream)
val carObject = objInputStream.readObject() as Car
println(carObject.name)
fileOutputStream.close()
objOutputStream.close()
fileInputStream.close()
objInputStream.close()
}
fun bufferStream() {
val fileOutputStream = FileOutputStream("kotlin.txt")
val outputStream = BufferedOutputStream(fileOutputStream)
outputStream.write("hello".toByteArray())
outputStream.flush()
val fileInputStream = FileInputStream("kotlin.txt")
val inputStream = BufferedInputStream(fileInputStream)
val msg = String(inputStream.readBytes())
println(msg)
fileOutputStream.close()
fileInputStream.close()
}
}
上記のストリームとは別に、
DataInputStreamと
DataOutputStreamもあります。これらは他のスレッドと同じ作業を行います。違いは、
DataInput /
OutputStreamは主にプリミティブ型の読み書きに使用されるのに対し、
ObjectInput /
OutputStreamは主にオブジェクトなどに使用されることです。
読者とライター
Java I/O では、データをストリームに読み書きする場合、まずストリームをバイトに変換する必要があります。そうして初めて、ストリームへの読み取りまたは書き込みが可能になります。
InputStreamReaderと
OutputStreamWriter はこれを自動的に行います。
class ReaderWriter {
fun readerWriter() {
val outputStream = FileOutputStream("kotlin.txt")
val writer = OutputStreamWriter(outputStream)
writer.write("Hello Kotlin")
writer.flush()
val inputStream = FileInputStream("kotlin.txt")
val reader = InputStreamReader(inputStream)
println(reader.readText())
}
}
並列読み取りおよび書き込み
場合によっては、Streams でのマルチスレッドのサポートが必要になります。簡単に言うと、別々のスレッドからストリームの読み取りと書き込みを行いたいのです。
このためには、 PipedInput /
OutputStreamを使用する必要があります。
fun pipedStream() {
val inputStream = PipedInputStream()
val outputStream = PipedOutputStream()
inputStream.connect(outputStream)
val writeThread = object : Thread() {
override fun run() {
try {
for (i in 0..100) {
outputStream.write(i)
println("Write : $i")
sleep(100)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
val readThread = object : Thread() {
override fun run() {
try {
for (i in 0..100) {
println("Read : ${inputStream.read()}")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
writeThread.start()
readThread.start()
}
GO TO FULL VERSION