Perbandingan tipe di Jawa
Sumber:
Theflashreads Pada postingan kali ini, Anda akan mempelajari beberapa tipe opsi perbandingan di Java. Cara paling umum untuk menentukan apakah suatu objek merupakan
turunan dari kelas, superkelas, atau antarmuka tertentu adalah dengan menggunakan operator
instanceof biner . Ini mencakup pemeriksaan nol implisit dan menghasilkan kesalahan waktu kompilasi jika tipenya tidak terikat. Namun, ini tidak mengizinkan penggunaan primitif dan mengharuskan tipenya diketahui pada waktu kompilasi.
Jika Anda memerlukan pemeriksaan runtime dinamis
Dalam hal ini, gunakan metode
boolean isInstance(Object obj) yang setara di
Class . Ini juga mencakup pemeriksaan nol, tetapi mengizinkan primitif:
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);
Memeriksa kompatibilitas dua jenis
Jika Anda perlu memeriksa hubungan subtipe, gunakan metode
boolean isAssignableFrom(Class<?> cls) di
Class . Ini akan membantu menangkap
NullPointerException .
Class<?> aClass = CharSequence.class;
Class<?> bClass = String.class;
bClass.isAssignableFrom(aClass());
CharSequence[].class.isAssignableFrom(String[].class);
Integer[].class.isAssignableFrom(String[].class);
Pencocokan Pola (Jawa 14)
if(a instanceof B b) {
b.toString();
}
Tipe khusus
enum Color { WHITE, GRAY, BLACK }
Color.class.isEnum();
Color.WHITE instanceof Enum;
String[].class.isArray();
Class<?> componentType = obj.getComponentType();
int.class.isPrimitive();
Java.io - Operasi I/O di Java
Sumber:
Medium Isi artikel ini tentang operasi I/O di Java. Dalam pengembangan aplikasi Android dan Java, input/output (Java I/O) merupakan salah satu topik yang sering digunakan, namun karena alasan tertentu jarang disebutkan. Namun, cakupan penerapannya luas: misalnya, kami melakukan operasi I/O saat mengonversi gambar bitmap ke format JPEG atau saat membaca/menulis file biasa. Paket Java java.io memiliki semua kelas yang diperlukan untuk melakukan operasi I/O. Operasi ini dilakukan menggunakan utas. Pada gilirannya, thread membantu melakukan operasi baca atau tulis. Misalnya, menulis pesan ke file.
Jenis aliran
Ada dua jenis thread di Java:
- Aliran Byte (aliran byte)
- Aliran Karakter
Aliran byte
Aliran Byte digunakan untuk membaca dan menulis satu byte data. Ini mencakup kelas Java
InputStream dan
OutputStream .
InputStream membantu membaca data dan
OutputStream membantu menulis data ke target (mungkin file).
Aliran karakter
Character Stream digunakan untuk membaca dan menulis satu karakter data. Ini mencakup kelas Java
Reader dan
Writer . Untuk memahami
Reader dan
Writer , Anda harus memahami kelas turunan seperti
InputStreamReader ,
FileReader ,
OutputStreamWriter ,
FileWriter dan lain-lain.
Aliran Masukan dan Aliran Keluaran
InputStream digunakan untuk membaca data dari sumber (mungkin file). Itu tidak berguna jika berdiri sendiri, tetapi memiliki beberapa kelas turunan seperti
FileInputStream ,
ByteArrayInputStream , dan
ObjectInputStream .
OutputStream digunakan untuk menulis data ke target (mungkin file). Kelas turunannya adalah
FileOutputStream ,
ByteArrayOutputStream , dan
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()
}
}
Selain aliran di atas, kami juga memiliki
DataInputStream dan
DataOutputStream . Mereka melakukan pekerjaan yang sama seperti thread lainnya. Perbedaannya adalah
DataInput /
OutputStream terutama digunakan untuk membaca/menulis tipe primitif, sedangkan
ObjectInput /
OutputStream terutama digunakan untuk objek dan seterusnya.
Pembaca dan Penulis
Di Java I/O, jika kita membaca/menulis data ke stream, kita harus mengonversinya menjadi byte terlebih dahulu. Hanya dengan begitu kita dapat membaca atau menulisnya ke stream.
InputStreamReader dan
OutputStreamWriter melakukan ini secara otomatis.
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())
}
}
Membaca dan menulis secara paralel
Terkadang kita memerlukan dukungan multithreading di Streams. Sederhananya, kami ingin membaca dan menulis ke aliran dari thread terpisah. Untuk ini kita perlu menggunakan
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