การเปรียบเทียบประเภทใน Java
ที่มา:
Theflashreads ในโพสต์นี้ คุณจะได้เรียนรู้เกี่ยวกับตัวเลือกการเปรียบเทียบหลายประเภทใน Java วิธีที่พบบ่อยที่สุดในการพิจารณาว่าอ็อบเจ็กต์ที่กำหนดนั้นเป็น
อินสแตนซ์ของคลาส ซูเปอร์คลาส หรืออินเทอร์เฟซที่กำหนดหรือไม่ คือการใช้อินสแตนซ์ไบนารีของตัว
ดำเนิน การ รวมถึงการตรวจสอบค่า null โดยนัย และสร้างข้อผิดพลาดเวลาคอมไพล์หากประเภทไม่ได้ถูกผูกไว้ อย่างไรก็ตาม ไม่อนุญาตให้ใช้ข้อมูลพื้นฐานและกำหนดให้ต้องทราบประเภท ณ เวลารวบรวม
หากคุณต้องการการตรวจสอบรันไทม์แบบไดนามิก
ในกรณีนี้ ให้ใช้เมธอด isInstance(Object obj)แบบ บู ลี นที่เทียบเท่า ใน
Class นอกจากนี้ยังมีการตรวจสอบค่าว่างด้วย แต่อนุญาตให้ใช้ข้อมูลพื้นฐาน:
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);
การตรวจสอบความเข้ากันได้ของสองประเภท
หากคุณต้องการตรวจสอบความสัมพันธ์ของประเภทย่อย ให้ใช้ เมธอดบูลี น
isAssignableFrom(Class<?> cls)ใน
Class สิ่งนี้จะช่วยจับ
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 - การดำเนินการ I/O ใน Java
ที่มา:
สื่อ เนื้อหาของบทความนี้เกี่ยวกับการดำเนินการ I/O ใน Java ในการพัฒนาแอปพลิเคชัน Android และ Java อินพุต/เอาท์พุต (Java I/O) เป็นหนึ่งในหัวข้อที่มักใช้ แต่ไม่ค่อยมีการกล่าวถึงด้วยเหตุผลบางประการ อย่างไรก็ตาม ขอบเขตการใช้งานนั้นกว้าง: ตัวอย่างเช่น เราดำเนินการ I/O เมื่อแปลงภาพบิตแมปเป็นรูปแบบ JPEG หรือในขณะที่อ่าน/เขียนไฟล์ปกติ แพ็คเกจ Java java.io มีคลาสที่จำเป็นทั้งหมดที่จำเป็นในการดำเนินการ I/O การดำเนินการเหล่านี้ดำเนินการโดยใช้เธรด ในทางกลับกัน เธรดจะช่วยดำเนินการอ่านหรือเขียน เช่น การเขียนข้อความลงไฟล์
ประเภทของสตรีม
เธรดใน Java มีสองประเภท:
- ไบต์สตรีม (ไบต์สตรีม)
- สตรีมตัวละคร
กระแสไบต์
Byte Stream ใช้เพื่ออ่านและเขียนข้อมูลหนึ่งไบต์ ประกอบด้วย คลาส Java
InputStreamและ
OutputStream InputStreamช่วยในการอ่านข้อมูล และ
OutputStreamช่วยในการเขียนข้อมูลไปยังเป้าหมาย (อาจเป็นไฟล์)
สตรีมตัวละคร
Character Stream ใช้เพื่ออ่านและเขียนข้อมูลหนึ่งอักขระ ประกอบด้วย คลาส
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