键盘录入
简单用法Scanner扫描器接收键盘录入
System.in:InputStream用于指代系统默认的输入设备---键盘
屏幕输出
System.out:PrintStream用于指代系统默认的标准输出设备---屏幕显示
System.err:PrintStream用于指代系统默认的错误输出设备---屏幕显示
注意:在程序中同时使用System.out和System.err输出时,不能保证准确的输出顺序。所以为了查看执行顺序,一般只能选择其中一个进行使用
强调
-
一般使用缓存流的目标是在于以透明的方式引入缓冲区,以提高代码的执行效率,所以不会使用什 么特殊的方法,还是使用Reader/Writer、InputStream/OutputStream之类的父类中提供的方法
-
特殊的是BufferedReader方法readLine 过滤流使用必须有对应的节点流,因为过滤流是用于装饰节点流的,不是有具体的操作目标
-
执行close方法会自动关闭被装饰的对象,所以不需要再关闭FileReader、FileWriter
-
执行flush方法会自动刷新数据到被装饰的流上,但是并没有执行关闭流。针对输出流关闭时会自动先flush然后再关闭
数据流
DataInputStream和DataOutputStream允许与机器无关的风格读写java原始类型的数据,比较适合于网络上的数据传输。经常在大学java相关课程的期末考试中见到此类编程题目
只有字节流,没有对应的字符流
构造器:DataInputStream(InputStream) DataOutputStream(OutputStream)
FileOutputStream中并没有直接写出double类型数据的方法,所以只能将数据转换为字符串进行输出
数据流针对8种简单类型提供了对应的读写方法
数据类型 | 输入流DataInputStream | 输出流DataOutputStream |
---|---|---|
整数 | readByte、readShort、readInt、readLong | writeByte、writeShort、writeInt、writeLong |
浮点数 | readFloat、readDouble | writeFloat、writeDouble |
布尔型 | readBoolean | writeBoolean |
字符型 | readChar | writeChar |
数据流是通过EOFException用于判断流结束end-of-file
打印流
打印流都是用于实现打印输出,其中有PrintWriter和PrintStream,分别针对字符和字节,都提供了一 系列重载的print和println方法,可以输出多种类型数据
输出引用类型:具体实现是通过调用对象的toString()方法将对象转换为String进行输出
注意 PrintWriter和PrintStream的输出操作不会抛出异常,用户可以通过错误状态检查获取错误信息
PrintWriter和PrintStream都有自动的flush功能
特殊构造器
-
public PrintWriter (Writer out)
-
PrintWriter(Writer out,boolean autoFlush) boolean表示是否支持自动刷新
-
PrintWriter(OutputStream out) 直接使用OutputStream时不需要通过桥接处理
-
PrintWriter(OutputStream out, boolean autoFlush)
-
PrintStream(OutputStream out)
-
PrintStream(OutputStream out, boolean autoFlush)
-
PrintStream(String fileName) 参数为文件名称,表示数据直接输出到指定文件中
-
PrintStream(File file)
对象流
可以使用DataInputStream和DataOutputStream读写对象数据,但是操作繁琐
Java提供了ObjectInputStream和ObjectOutputStream可以直接读写Object对象,实际上还提供了针对 8种简单类型和String类型的读写操作方法
-
ObjectInputStream提供了读取对象的方法readObject():Object
-
ObjectOutputStream提供了写出对象的方法writeObject(Object):void
序列化
读写一个对象的前提是这个类型的对象是可序列化的
-
对象的序列化简单的来说就是将对象可以直接转换为二进制数据流
-
对象的反序列化将二进制数据流转换为对象
针对对象的序列化和反序列化是通过JVM实现的,编程中只做声明,序列化的目标就是将对象保存到磁盘中或者允许在网络中直接传动
如果需要使用序列化或者反序列化操作,则必须在序列化对象上添加对应的声明,否则NotSerializableException