Comparaison des types en Java
Source :
Theflashreads Dans cet article, vous découvrirez plusieurs types d'options de comparaison en Java. La manière la plus courante de déterminer si un objet donné est
une instance d'une classe, d'une superclasse ou d'une interface donnée consiste à utiliser l'opérateur binaire
instanceof . Il inclut une vérification nulle implicite et génère une erreur de compilation si les types ne sont pas liés. Cependant, il ne permet pas l'utilisation de primitives et nécessite que les types soient connus au moment de la compilation.
Si vous avez besoin d'une vérification dynamique de l'exécution
Dans ce cas, utilisez la méthode
booléenne isInstance(Object obj) équivalente dans
Class . Il inclut également la vérification des valeurs nulles, mais autorise les primitives :
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);
Vérification de la compatibilité de deux types
Si vous devez vérifier la relation de sous-type, utilisez la méthode
boolean isAssignableFrom(Class<?> cls) dans
Class . Cela aidera à attraper
NullPointerException .
Class<?> aClass = CharSequence.class;
Class<?> bClass = String.class;
bClass.isAssignableFrom(aClass());
CharSequence[].class.isAssignableFrom(String[].class);
Integer[].class.isAssignableFrom(String[].class);
Correspondance de modèles (Java 14)
if(a instanceof B b) {
b.toString();
}
Types spéciaux
enum Color { WHITE, GRAY, BLACK }
Color.class.isEnum();
Color.WHITE instanceof Enum;
String[].class.isArray();
Class<?> componentType = obj.getComponentType();
int.class.isPrimitive();
Java.io - Opérations d'E/S en Java
Source :
Medium Le contenu de cet article concerne les opérations d'E/S en Java. Dans le développement d'applications Android et Java, les entrées/sorties (Java I/O) sont l'un des sujets souvent utilisés, mais pour une raison quelconque, ils sont rarement mentionnés. Cependant, son champ d'application est large : par exemple, nous effectuons des opérations d'E/S lors de la conversion d'une image bitmap au format JPEG ou lors de la lecture/écriture d'un fichier normal. Le package Java java.io possède toutes les classes nécessaires pour effectuer des opérations d'E/S. Ces opérations sont effectuées à l'aide de threads. À leur tour, les threads aident à effectuer des opérations de lecture ou d’écriture. Par exemple, écrire un message dans un fichier.
Types de flux
Il existe deux types de threads en Java :
- Flux d'octets (flux d'octets)
- Flux de personnages
Flux d'octets
Un Byte Stream est utilisé pour lire et écrire un octet de données. Il comprend les classes Java
InputStream et
OutputStream .
InputStream aide à lire les données et
OutputStream aide à écrire des données sur une cible (éventuellement un fichier).
Flux de personnages
Character Stream est utilisé pour lire et écrire un caractère de données. Il comprend
les classes Java Reader et
Writer . Pour comprendre
Reader et
Writer , vous devez comprendre les classes dérivées telles que
InputStreamReader ,
FileReader ,
OutputStreamWriter ,
FileWriter et autres.
InputStream et OutputStream
InputStream est utilisé pour lire les données d'une source (éventuellement un fichier). Ce n'est pas utile en soi, mais il possède plusieurs classes dérivées telles que
FileInputStream ,
ByteArrayInputStream et
ObjectInputStream .
OutputStream est utilisé pour écrire des données sur une cible (éventuellement un fichier). Ses classes dérivées sont
FileOutputStream ,
ByteArrayOutputStream et
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()
}
}
Outre les flux ci-dessus, nous avons également
DataInputStream et
DataOutputStream . Ils font le même travail que les autres fils. La différence est que
DataInput /
OutputStream est principalement utilisé pour la lecture/écriture de types primitifs, tandis que
ObjectInput /
OutputStream est principalement utilisé pour les objets, etc.
Lecteurs et écrivains
Dans Java I/O, si nous lisons/écrivons des données dans des flux, nous devons d’abord les convertir en octets. Ce n'est qu'alors que nous pouvons les lire ou les écrire dans des flux.
InputStreamReader et
OutputStreamWriter le font automatiquement.
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())
}
}
Lecture et écriture parallèles
Parfois, nous avons besoin du support multithread dans Streams. En termes simples, nous voulons lire et écrire dans des flux à partir de threads distincts. Pour cela, nous devons utiliser
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