Java中類型的比較
來源:
Theflashreads 在這篇文章中,您將了解 Java 中的幾種類型比較選項。 確定給定物件是否是給定類別、超類別或介面的
實例的最常見方法是使用二進位
instanceof運算子。它包括隱式空檢查,如果類型未綁定,則會產生編譯時錯誤。但是,它不允許使用原語,並且要求在編譯時知道類型。
如果您需要動態執行時間檢查
在這種情況下,請在
Class中使用等效的boolean isInstance(Object obj)方法。它還包括空檢查,但允許基元:
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);
檢查兩種類型的相容性
如果需要檢查子類型關係,請使用
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中有兩種類型的線程:
- 位元組流(位元組流)
- 字元流
位元組流
位元組流用於讀取和寫入一個位元組的資料。它包括 Java
InputStream和
OutputStream類別。
InputStream幫助讀取數據,
OutputStream幫助將數據寫入目標(可能是檔案)。
字元流
字元流用於讀寫一個字元的資料。它包括
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