Comparación de tipos en Java
Fuente:
Theflashreads En esta publicación, aprenderá sobre varios tipos de opciones de comparación en Java. La forma más común de determinar si un objeto determinado es
una instancia de una clase, superclase o interfaz determinada es utilizar el operador binario
instancia de . Incluye una verificación nula implícita y genera un error en tiempo de compilación si los tipos no están vinculados. Sin embargo, no permite el uso de primitivas y requiere que los tipos se conozcan en el momento de la compilación.
Si necesita verificación dinámica del tiempo de ejecución
En este caso, utilice el método
booleano isInstance(Object obj) equivalente en
Class . También incluye verificación de nulos, pero permite primitivas:
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);
Comprobando la compatibilidad de dos tipos.
Si necesita verificar la relación de subtipo, use el método
booleano isAssignableFrom(Class<?> cls) en
Class . Esto ayudará a detectar
NullPointerException .
Class<?> aClass = CharSequence.class;
Class<?> bClass = String.class;
bClass.isAssignableFrom(aClass());
CharSequence[].class.isAssignableFrom(String[].class);
Integer[].class.isAssignableFrom(String[].class);
Coincidencia de patrones (Java 14)
if(a instanceof B b) {
b.toString();
}
tipos especiales
enum Color { WHITE, GRAY, BLACK }
Color.class.isEnum();
Color.WHITE instanceof Enum;
String[].class.isArray();
Class<?> componentType = obj.getComponentType();
int.class.isPrimitive();
Java.io - Operaciones de E/S en Java
Fuente:
Medio El contenido de este artículo trata sobre operaciones de E/S en Java. En el desarrollo de aplicaciones Android y Java, la entrada/salida (Java I/O) es uno de los temas que se utiliza con frecuencia, pero por alguna razón rara vez se menciona. Sin embargo, su ámbito de aplicación es amplio: por ejemplo, realizamos operaciones de E/S al convertir una imagen de mapa de bits al formato JPEG o mientras leemos/escribimos un archivo normal. El paquete Java java.io tiene todas las clases necesarias para realizar operaciones de E/S. Estas operaciones se realizan mediante subprocesos. A su vez, los hilos ayudan a realizar operaciones de lectura o escritura. Por ejemplo, escribir un mensaje en un archivo.
tipos de corrientes
Hay dos tipos de subprocesos en Java:
- Flujo de bytes (flujo de bytes)
- Flujo de personajes
flujo de bytes
Un Byte Stream se utiliza para leer y escribir un byte de datos. Incluye las clases Java
InputStream y
OutputStream .
InputStream ayuda a leer datos y
OutputStream ayuda a escribir datos en un destino (posiblemente un archivo).
Flujo de personajes
Character Stream se utiliza para leer y escribir un carácter de datos. Incluye
las clases Java Reader y
Writer . Para comprender
Reader y
Writer , debe comprender las clases derivadas como
InputStreamReader ,
FileReader ,
OutputStreamWriter ,
FileWriter y otras.
Flujo de entrada y flujo de salida
InputStream se utiliza para leer datos de una fuente (posiblemente un archivo). No es útil por sí solo, pero tiene varias clases derivadas como
FileInputStream ,
ByteArrayInputStream y
ObjectInputStream .
OutputStream se utiliza para escribir datos en un destino (posiblemente un archivo). Sus clases derivadas son
FileOutputStream ,
ByteArrayOutputStream y
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()
}
}
Además de las transmisiones anteriores, también tenemos
DataInputStream y
DataOutputStream . Hacen el mismo trabajo que otros hilos. La diferencia es que
DataInput /
OutputStream se usa principalmente para leer/escribir tipos primitivos, mientras que
ObjectInput /
OutputStream se usa principalmente para objetos, etc.
Lectores y escritores
En Java I/O, si leemos/escribimos datos en flujos, primero debemos convertirlos a bytes. Sólo entonces podremos leerlos o escribirlos en transmisiones.
InputStreamReader y
OutputStreamWriter hacen esto automáticamente.
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())
}
}
Lectura y escritura paralelas
A veces necesitamos soporte multiproceso en Streams. En pocas palabras, queremos leer y escribir en transmisiones desde subprocesos separados. Para esto necesitamos usar
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