Порівняння типів у Java
Джерело:
Theflashreads Завдяки цій публікації ви дізнаєтеся про кілька варіантів порівняння типів Java. Найпоширеніший спосіб визначити, чи є об'єкт
екземпляром даного класу, суперкласу або інтерфейсу, - це використовувати бінарний оператор
instanceof . Він включає неявну перевірку null і створює помилку часу компіляції, якщо типи не пов'язані. При цьому він не дозволяє використовувати примітиви та вимагає, щоб типи були відомі під час компіляції.
Якщо вам потрібна динамічна перевірка під час виконання
В даному випадку використовуйте еквівалентний метод
boolean 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);
Перевірка сумісності двох типів
Якщо потрібно перевірити ставлення підтипу, використовуйте метод
boolean 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 - Операції введення-виведення в Java
Джерело:
Medium Зміст цієї статті присвячено операціям введення-виведення Java. В Android-розробці та розробці Java-додатків введення-виведення (Java I/O) - одна з тем, яка часто використовується, але про яку чомусь рідко згадують. При цьому сфера її застосування широка: наприклад, ми виконуємо операції введення-виводу під час перетворення растрового зображення у формат JPEG або під час читання/запису звичайного файлу. У Java-пакеті java.io є всі необхідні класи, необхідні виконання операцій вводу-вывода. Ці операції виконуються із використанням потоків. У свою чергу потоки допомагають виконувати операції читання або запису. Наприклад, запис повідомлення до файлу.
Типи потоків
Існує два типи потоків в Java:
- Byte Stream (байтовий потік)
- Character Stream (потік символів)
Байтовий потік
Потік байтів (Byte Stream) використовується для читання та запису одного байта даних. Він включає класи Java
InputStream та
OutputStream .
InputStream допомагає читати дані, а
OutputStream допомагає записувати дані в ціль (можливо, файл).
Потік символів
Потік символів (Character Stream) використовується для читання та записування одного символу даних. Він включає Java-класи
Reader і
Writer . Щоб зрозуміти
Reader і
Writer , ви повинні розуміти похідні класи, такі як
InputStreamReader ,
FileReader ,
OutputStreamWriter ,
FileWriter та інші.
InputStream та OutputStream
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 в основному використовується для об'єктів тощо.
Readers та Writers
У 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. Простіше кажучи, ми хочемо читати та записувати в streams з окремих threads. Для цього нам потрібно використовувати
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()
}
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ