So sánh các loại trong Java
Nguồn:
Theflashreads Trong bài đăng này, bạn sẽ tìm hiểu về một số tùy chọn so sánh loại trong Java. Cách phổ biến nhất để xác định xem một đối tượng nhất định có phải là
một thể hiện của một lớp, siêu lớp hoặc giao diện nhất định hay không là sử dụng toán tử
instanceof nhị phân . Nó bao gồm kiểm tra null ngầm định và tạo ra lỗi thời gian biên dịch nếu các loại không bị ràng buộc. Tuy nhiên, nó không cho phép sử dụng kiểu nguyên thủy và yêu cầu phải biết các kiểu đó tại thời điểm biên dịch.
Nếu bạn cần kiểm tra thời gian chạy động
Trong trường hợp này, hãy sử dụng phương thức
boolean isInstance(Object obj) tương đương trong
Class . Nó cũng bao gồm việc kiểm tra null, nhưng cho phép các kiểu nguyên thủy:
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);
Kiểm tra tính tương thích của hai loại
Nếu bạn cần kiểm tra mối quan hệ kiểu con, hãy sử dụng phương thức
boolean isAssignableFrom(Class<?> cls) trong
Class . Điều này sẽ giúp bắt
NullPointerException .
Class<?> aClass = CharSequence.class;
Class<?> bClass = String.class;
bClass.isAssignableFrom(aClass());
CharSequence[].class.isAssignableFrom(String[].class);
Integer[].class.isAssignableFrom(String[].class);
Khớp mẫu (Java 14)
if(a instanceof B b) {
b.toString();
}
Các loại đặc biệt
enum Color { WHITE, GRAY, BLACK }
Color.class.isEnum();
Color.WHITE instanceof Enum;
String[].class.isArray();
Class<?> componentType = obj.getComponentType();
int.class.isPrimitive();
Java.io - Hoạt động I/O trong Java
Nguồn:
Medium Nội dung của bài viết này là về các thao tác I/O trong Java. Trong phát triển ứng dụng Android và Java, đầu vào/đầu ra (Java I/O) là một trong những chủ đề thường được sử dụng nhưng vì một lý do nào đó lại ít được nhắc đến. Tuy nhiên, phạm vi ứng dụng của nó rất rộng: ví dụ: chúng tôi thực hiện các thao tác I/O khi chuyển đổi hình ảnh bitmap sang định dạng JPEG hoặc khi đọc/ghi một tệp thông thường. Gói Java java.io có tất cả các lớp cần thiết để thực hiện các thao tác I/O. Các hoạt động này được thực hiện bằng cách sử dụng các luồng. Đổi lại, các luồng giúp thực hiện các thao tác đọc hoặc ghi. Ví dụ, viết một tin nhắn vào một tập tin.
Các loại luồng
Có hai loại luồng trong Java:
- Luồng byte (luồng byte)
- Luồng ký tự
Luồng byte
Luồng Byte được sử dụng để đọc và ghi một byte dữ liệu. Nó bao gồm các lớp Java
OutputStream và
OutputStream .
inputStream giúp đọc dữ liệu và
OutputStream giúp ghi dữ liệu vào mục tiêu (có thể là tệp).
Luồng ký tự
Luồng ký tự được sử dụng để đọc và ghi một ký tự dữ liệu. Nó bao gồm các lớp Java
Reader và
Writer . Để hiểu
Reader và
Writer , bạn phải hiểu các lớp dẫn xuất như
inputStreamReader ,
FileReader ,
OutputStreamWriter ,
FileWriter và các lớp khác.
Luồng đầu vào và luồng đầu ra
inputStream được sử dụng để đọc dữ liệu từ một nguồn (có thể là tệp). Bản thân nó không hữu ích nhưng nó có một số lớp dẫn xuất như
FileInputStream ,
ByteArrayInputStream và
ObjectInputStream .
OutputStream được sử dụng để ghi dữ liệu vào đích (có thể là tệp). Các lớp dẫn xuất của nó là
FileOutputStream ,
ByteArrayOutputStream và
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()
}
}
Ngoài các luồng trên, chúng tôi còn có
DataInputStream và
DataOutputStream . Họ làm công việc tương tự như các chủ đề khác. Sự khác biệt là
DataInput /
OutputStream chủ yếu được sử dụng để đọc/ghi các kiểu nguyên thủy, trong khi
ObjectInput /
OutputStream chủ yếu được sử dụng cho các đối tượng, v.v.
Người đọc và người viết
Trong Java I/O, nếu chúng ta đọc/ghi dữ liệu thành luồng, trước tiên chúng ta phải chuyển đổi chúng thành byte. Chỉ khi đó chúng ta mới có thể đọc hoặc ghi chúng vào luồng.
inputStreamReader và
OutputStreamWriter thực hiện việc này một cách tự động.
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())
}
}
Đọc và ghi song song
Đôi khi chúng tôi cần hỗ trợ đa luồng trong Luồng. Nói một cách đơn giản, chúng ta muốn đọc và ghi vào các luồng từ các luồng riêng biệt. Để làm được điều này, chúng ta cần sử dụng
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