JavaRush /Java блог /Random UA /Кава-брейк #169. Порівняння типів. Java.io - Операції вве...

Кава-брейк #169. Порівняння типів. Java.io - Операції введення-виведення в Java

Стаття з групи Random UA

Порівняння типів у Java

Джерело: Theflashreads Завдяки цій публікації ви дізнаєтеся про кілька варіантів порівняння типів Java. Кава-брейк #169.  Порівняння типів.  Java.io - Операції введення-виведення в Java - 1Найпоширеніший спосіб визначити, чи є об'єкт екземпляром даного класу, суперкласу або інтерфейсу, - це використовувати бінарний оператор instanceof . Він включає неявну перевірку null і створює помилку часу компіляції, якщо типи не пов'язані. При цьому він не дозволяє використовувати примітиви та вимагає, щоб типи були відомі під час компіляції.

Якщо вам потрібна динамічна перевірка під час виконання

В даному випадку використовуйте еквівалентний метод boolean isInstance(Object obj) у Class . Він також включає нульову перевірку, але допускає примітиви:
a instanceof B
    // returns false for null
    null instanceof B

    a.getClass().isInstance(b);
    // commonly used for generics
    Class<T> type = b.getClass();
    type.isInstance(a);

    // Note that the parameter is autoboxed to type Integer
    int x = 4;
    Integer.class.isInstance(x);

Перевірка сумісності двох типів

Якщо потрібно перевірити ставлення підтипу, використовуйте метод boolean isAssignableFrom(Class<?> cls) в Class . Це допоможе виявити NullPointerException .
// is it possible to B b = new A()
   Class<?> aClass = CharSequence.class;
   Class<?> bClass = String.class;
   bClass.isAssignableFrom(aClass());

   // works for arrays
   CharSequence[].class.isAssignableFrom(String[].class); // true
   Integer[].class.isAssignableFrom(String[].class); //false

Зіставлення зі зразком (Java 14)

if(a instanceof B b) {
       // b is casted
       b.toString();
   }

Спеціальні типи

// Enums
    enum Color { WHITE, GRAY, BLACK }

    Color.class.isEnum(); // Enum.class.isAssignableFrom(Color.class);
    Color.WHITE instanceof Enum; // true

    // Arrays
    String[].class.isArray();
    // get the type of the variables in an array (null if obj is not an array)
    Class<?> componentType = obj.getComponentType();

    // Primitives
    int.class.isPrimitive();

Java.io - Операції введення-виведення в Java

Джерело: Medium Зміст цієї статті присвячено операціям введення-виведення Java. Кава-брейк #169.  Порівняння типів.  Java.io - Операції введення-виведення в Java - 2В Android-розробці та розробці Java-додатків введення-виведення (Java I/O) - одна з тем, яка часто використовується, але про яку чомусь рідко згадують. При цьому сфера її застосування широка: наприклад, ми виконуємо операції введення-виводу під час перетворення растрового зображення у формат JPEG або під час читання/запису звичайного файлу. У Java-пакеті java.io є всі необхідні класи, необхідні виконання операцій вводу-вывода. Ці операції виконуються із використанням потоків. У свою чергу потоки допомагають виконувати операції читання або запису. Наприклад, запис повідомлення до файлу.

Типи потоків

Існує два типи потоків в Java:
  1. Byte Stream (байтовий потік)
  2. 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() {
        //Create FileOutputStream that used for writing to file
        val outputStream = FileOutputStream("kotlin.txt")

        //write to output stream
        outputStream.write(1) //write a int
        outputStream.write("hello".toByteArray()) //write a string as byte array

        //Create FileInputStream that used for reading from file
        val inputStream = FileInputStream("kotlin.txt")

        //reading single first byte from input stream
        //output - 1
        println(inputStream.read())

        //reading string from input stream
        //output - hello
        val msg = String(inputStream.readBytes())
        println(msg)

        //close
        outputStream.close()
        inputStream.close()
    }

    fun byteArrayStream() {
        //Create ByteArrayOutputStream
        val outputStream = ByteArrayOutputStream()

        //write to output stream
        outputStream.write(1)
        outputStream.write("hello".toByteArray())

        //Create ByteArrayInputStream
        val readByteArray = outputStream.toByteArray()
        val inputStream = ByteArrayInputStream(readByteArray)

        //Reading a single byte from input stream
        //output - 1
        println(inputStream.read())

        //Reading string from input stream
        //output - hello
        val msg = String(inputStream.readBytes())
        println(msg)

        //close
        outputStream.close()
        inputStream.close()
    }

    fun objectStream() {
        //custom object
        val car = Car(name = "BMW")

        //Create ObjectOutputStream
        val fileOutputStream = FileOutputStream("kotlin.txt")
        val objOutputStream = ObjectOutputStream(fileOutputStream)

        //writing to output stream
        objOutputStream.writeObject(car)

        //Create ObjectInputStream
        val fileInputStream = FileInputStream("kotlin.txt")
        val objInputStream = ObjectInputStream(fileInputStream)

        //Reading from input stream
        val carObject = objInputStream.readObject() as Car
        println(carObject.name) //output - BMW

        //close
        fileOutputStream.close()
        objOutputStream.close()

        fileInputStream.close()
        objInputStream.close()
    }

    fun bufferStream() {
        //Buffer - Buffer is used for storing stream of data in Java I/O
        //BufferStream is faster way to write and read bytes in streams.

        //Create BufferOutputStream
        val fileOutputStream = FileOutputStream("kotlin.txt")
        val outputStream = BufferedOutputStream(fileOutputStream)

        //Write to output stream
        outputStream.write("hello".toByteArray())

        //flush() - Sending the data from BufferedOutputStream to main stream.
        //This is required to push changes to main stream.
        outputStream.flush()

        //Create BufferInputStream
        val fileInputStream = FileInputStream("kotlin.txt")
        val inputStream = BufferedInputStream(fileInputStream)

        //Reading from input stream
        val msg = String(inputStream.readBytes())
        println(msg)

        //close
        fileOutputStream.close()
        fileInputStream.close()
    }
}
Крім перерахованих вище потоків, у нас також є DataInputStream і DataOutputStream . Вони виконують ту саму роботу, що інші потоки. Відмінність полягає в тому, що DataInput / OutputStream в основному використовується для читання/запису примітивних типів, а ObjectInput / OutputStream в основному використовується для об'єктів тощо.

Readers та Writers

У Java I/O, якщо ми читаємо/записуємо дані в потоки, ми повинні спочатку перетворити їх на байти. Тільки після цього ми можемо читати чи записувати їх у потоки. InputStreamReader та OutputStreamWriter роблять це автоматично.
class ReaderWriter {
    fun readerWriter() {
        //StreamReader or Writer:
        //It reads bytes and decodes them into characters using a specified charset.

        //Create OutputStreamWriter
        val outputStream = FileOutputStream("kotlin.txt")
        val writer = OutputStreamWriter(outputStream)

        //write to output stream
        writer.write("Hello Kotlin")
        writer.flush()

        //Create InputStreamReader
        val inputStream = FileInputStream("kotlin.txt")
        val reader = InputStreamReader(inputStream)

        //read from input stream
        //output - Hello Kotlin
        println(reader.readText())
    }
}

Паралельне читання та запис

Іноді нам потрібна підтримка багатопоточності в Streams. Простіше кажучи, ми хочемо читати та записувати в streams з окремих threads. Для цього нам потрібно використовувати PipedInput / OutputStream .
fun pipedStream() {
       //Create PipedInput/OutputStream for parallel read/writes
       val inputStream = PipedInputStream()
       val outputStream = PipedOutputStream()

       //make a connection
       inputStream.connect(outputStream)

       //write from separate thread
       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()
               }
           }
       }

       //read from another thread
       val readThread = object : Thread() {
           override fun run() {
               try {
                   for (i in 0..100) {
                       println("Read : ${inputStream.read()}")
                   }
               } catch (e: Exception) {
                   e.printStackTrace()
               }
           }
       }

       //start
       writeThread.start()
       readThread.start()
   }
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ