Porównanie typów w Javie
Źródło:
Theflashreads W tym poście dowiesz się o kilku możliwościach porównywania typów w Javie. Najczęstszym sposobem ustalenia, czy dany obiekt jest
instancją danej klasy, nadklasy lub interfejsu, jest użycie binarnego operatora
instancjiof . Zawiera niejawne sprawdzanie wartości null i generuje błąd w czasie kompilacji, jeśli typy nie są powiązane. Nie pozwala jednak na użycie prymitywów i wymaga, aby typy były znane w czasie kompilacji.
Jeśli potrzebujesz dynamicznego sprawdzania środowiska wykonawczego
W takim przypadku użyj równoważnej metody
logicznej isInstance(Object obj) w
klasie . Obejmuje również sprawdzanie wartości null, ale pozwala na operacje podstawowe:
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);
Sprawdzanie zgodności dwóch typów
Jeśli chcesz sprawdzić relację podtypu, użyj metody
boolean isAssignableFrom(Class<?> cls) w
Class . Pomoże to złapać
wyjątek NullPointerException .
Class<?> aClass = CharSequence.class;
Class<?> bClass = String.class;
bClass.isAssignableFrom(aClass());
CharSequence[].class.isAssignableFrom(String[].class);
Integer[].class.isAssignableFrom(String[].class);
Dopasowywanie wzorców (Java 14)
if(a instanceof B b) {
b.toString();
}
Typy specjalne
enum Color { WHITE, GRAY, BLACK }
Color.class.isEnum();
Color.WHITE instanceof Enum;
String[].class.isArray();
Class<?> componentType = obj.getComponentType();
int.class.isPrimitive();
Java.io — operacje we/wy w Javie
Źródło:
Medium Treść tego artykułu dotyczy operacji we/wy w Javie. Podczas tworzenia aplikacji na Androida i Java, wejście/wyjście (Java I/O) to jeden z często używanych tematów, ale z jakiegoś powodu rzadko się o nim wspomina. Jednak zakres jego zastosowania jest szeroki: np. wykonujemy operacje I/O podczas konwersji obrazu bitmapowego do formatu JPEG lub podczas odczytu/zapisu zwykłego pliku. Pakiet Java java.io zawiera wszystkie niezbędne klasy wymagane do wykonywania operacji we/wy. Operacje te wykonywane są za pomocą wątków. Z kolei wątki pomagają wykonywać operacje odczytu lub zapisu. Na przykład zapisanie wiadomości do pliku.
Rodzaje strumieni
W Javie istnieją dwa typy wątków:
- Strumień bajtów (strumień bajtów)
- Strumień postaci
Strumień bajtów
Strumień bajtów służy do odczytu i zapisu jednego bajtu danych. Zawiera klasy Java
InputStream i
OutputStream .
InputStream pomaga czytać dane, a
OutputStream pomaga zapisywać dane w obiekcie docelowym (prawdopodobnie w pliku).
Strumień postaci
Strumień Znaków służy do odczytu i zapisu jednego znaku danych. Zawiera klasy Java
Reader i
Writer . Aby zrozumieć
Reader i
Writer , musisz zrozumieć klasy pochodne, takie jak
InputStreamReader ,
FileReader ,
OutputStreamWriter ,
FileWriter i inne.
Strumień wejściowy i strumień wyjściowy
WejścieStream służy do odczytu danych ze źródła (prawdopodobnie pliku). Samo w sobie nie jest to przydatne, ale ma kilka klas pochodnych, takich jak
FileInputStream ,
ByteArrayInputStream i
ObjectInputStream .
OutputStream służy do zapisywania danych w obiekcie docelowym (prawdopodobnie w pliku). Jego klasy pochodne to
FileOutputStream ,
ByteArrayOutputStream i
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()
}
}
Oprócz powyższych strumieni mamy również
DataInputStream i
DataOutputStream . Wykonują tę samą pracę, co inne wątki. Różnica polega na tym, że
DataInput /
OutputStream jest używany głównie do odczytu/zapisu typów pierwotnych, podczas gdy
ObjectInput /
OutputStream jest używany głównie do obiektów i tak dalej.
Czytelnicy i Pisarze
W Java I/O, jeśli czytamy/zapisujemy dane do strumieni, musimy najpierw przekonwertować je na bajty. Dopiero wtedy będziemy mogli je czytać lub zapisywać do strumieni.
InputStreamReader i
OutputStreamWriter robią to automatycznie.
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())
}
}
Równoległy odczyt i zapis
Czasami potrzebujemy obsługi wielowątkowości w strumieniach. Mówiąc najprościej, chcemy czytać i zapisywać do strumieni z oddzielnych wątków. W tym celu musimy użyć
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