Java中类型的比较
来源:
Theflashreads 在这篇文章中,您将了解 Java 中的几种类型比较选项。 确定给定对象是否是给定类、超类或接口的
实例的最常见方法是使用二进制
instanceof运算符。它包括隐式空检查,如果类型未绑定,则会生成编译时错误。但是,它不允许使用原语,并且要求在编译时知道类型。
如果您需要动态运行时检查
在这种情况下,请在
Class中使用等效的boolean isInstance(Object obj)方法。它还包括空检查,但允许基元:
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);
检查两种类型的兼容性
如果需要检查子类型关系,请使用
Class中的
boolean isAssignableFrom(Class<?> cls)方法。这将有助于捕获
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 中的 I/O 操作
来源:
Medium 本文内容是关于Java中的I/O操作。 在Android和Java应用程序开发中,输入/输出(Java I/O)是经常使用的主题之一,但由于某种原因很少被提及。然而,它的应用范围很广泛:例如,我们在将位图图像转换为JPEG格式时或在读/写常规文件时执行I/O操作。Java 包 java.io 具有执行 I/O 操作所需的所有必要类。这些操作是使用线程执行的。反过来,线程帮助执行读或写操作。例如,将消息写入文件。
流的类型
Java中有两种类型的线程:
- 字节流(字节流)
- 字符流
字节流
字节流用于读取和写入一个字节的数据。它包括 Java
InputStream和
OutputStream类。
InputStream帮助读取数据,
OutputStream帮助将数据写入目标(可能是文件)。
字符流
字符流用于读写一个字符的数据。它包括
Reader和
Writer Java 类。要了解
Reader和
Writer,您必须了解派生类,例如
InputStreamReader、
FileReader、
OutputStreamWriter、
FileWriter等。
输入流和输出流
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主要用于对象等。
读者和作家
在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 中的多线程支持。简而言之,我们希望从单独的线程读取和写入流。为此,我们需要使用
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