数据流:
DataInputStream
和
DataOutputStream
两个类创建的对象分别被称为数据输入流和数据输出流。这是 很有用的两个流,它们允许程序按与机器无关的风格读写Java
数据。所以比较适合于网络上的数据传 输。这两个流也是过滤器流,常以其它流如InputStream
或
OutputStream
作为它们的输入或输出
DataInputStram
和
DataOutputStream
分别继承自
InputStream
和
OuputStream
,属于过滤流,需要分 别套接在InputStream
和
OutputStream
类型的节点流上
只有字节流,没有对应的字符流
DataInputStream
和
DataOutputStream
提供了可以存取与机器无关的
Java
原始类型数据的方法
DataInputSteram
和
DataOutputStream
构造方法为
DataInputStream(InputStream)
DataOutputStream(OutputStream)
读取、写出一个
double
数据到文件中:
// 使用数据流就可以直接操作简单类型数据double dd = 123.4567 ;FileOutputStream fos = new FileOutputStream ( "d:\\a.data" );fos . write (( dd + "" ). getBytes ());fos . close ();// 如果不使用数据流,则需要额外编码进行数据类型转换FileInputStream fis = new FileInputStream ( "d:/a.data" );byte [] buffer = new byte [ 8192 ];int len = fis . read ( buffer );fis . close ();String str = new String ( buffer , 0 , len );double dd = Double . parseDouble ( str );System . out . println ( dd );
加入需要写一个double,然后一个String,然后再一个int
需要将输入内容转换为
String
,并且为了区分数据需要引入特殊符号,例如
@@
,输入数据为
123.456@@shi ya zhou@@12
。从功能角度上说没问题,但是编码太复杂了,所以引入
Data
类型的输 入输出流
// 这里不使用 OutputStream 定义变量的原因是:需要使用 DataOutputStream 中定义的特殊方法,而不是父类中定义的通用方法DataOutputStream dos = new DataOutputStream ( newFileOutputStream ( "d:\\a.data" ));dos . writeDouble ( 123.456 );dos . writeChars ( " 赵天爱小猴 !" );dos . writeInt ( 12 );dos . close ();
由于读取出现问题,针对中间的String数据引入一个额外的数据,其中存储String的char个数
写出数据:
double salary = 123.456 ;String ss = " 赵天爱小猴,小猿爱小主,小胡招小天 " ;int age = 12 ;DataOutputStream dos = new DataOutputStream ( new BufferedOutputStream ( newFileOutputStream ( "d:\\aa.data" )));dos . writeDouble ( salary );dos . writeInt ( ss . length ());dos . writeChars ( ss );dos . writeInt ( age );dos . close ();
读取数据:
double salary = 0 ;String str = "" ;int age = 0 ;// 读取数据的前提是必须知道数据的结构DataInputStream dis = new DataInputStream ( new BufferedInputStream ( newFileInputStream ( "d:\\aa.data" )));salary = dis . readDouble ();StringBuilder sb = new StringBuilder ();int len = dis . readInt ();for ( int i = 0 ; i < len ; i ++ ) sb . append ( dis . readChar ());str = sb . toString ();age = dis . readInt ();System . out . println ( salary + "---" + str + "---" + age );
注意:读取数据判断文件结束EOFException,这里没有-1
在具体应用中建议针对字串使用
readUTF
和
writeUTF
DataOutputStream dos = new DataOutputStream ( new FileOutputStream ( "data2.txt" ));dos . writeDouble ( 1234.56 );String str = " 猴子愛小終,小終愛信心 " ;dos . writeUTF ( str );dos . writeInt ( 99 );dos . close ();
DataInputStream dis = new DataInputStream ( new FileInputStream ( "data2.txt" ));double d1 = dis . readDouble ();String ss = dis . readUTF ();int kk = dis . readInt ();System . out . println ( d1 + "\t" + ss + "\t" + kk );dis . close ();
打印流:
PrintStream
和
PrintWriter
都属于输出流,分别针对字节和字符
PrintWriter
和
PrintStream
都提供了重载的
print
和
println
方法用于输出多种类型数据
print(Object):void
输出引用类型,实际上是调用对象的
toString
方法转换为
String
进行输出
public void println ( Object x ) {String s = String . valueOf ( x ); // 调用 String 类中的静态方法将 object 类型的数据转换为字符串synchronized ( this ) {print ( s );newLine (); //print('\n')}}//String 中的 valueOf 方法的定义public static String valueOf ( Object obj ) {return ( obj == null ) ? "null" : obj . toString (); // 如果输出对象非空,则调用对象的 toString 方法}
println表示输出后自动换行
PrintWriter和
PrintStream
的输出操作不会抛出异常,用户通过检测错误状态获取错误信息
PrintWriter和
PrintStream
有自动的
flush
功能
textOut.flushBuffer()
;
PrintWriter(Writer)
PrintWriter(Writer out, boolean autoFlush)
自动刷新
----println
PrintWriter ( OutputStream out ) // 参数是一个字节流,但是不需要通过桥接处理PrintWriter ( OutputStream out , boolean autoFlush )PrintStream ( OutputStream )PrintStream ( OutputStream out , boolean autoFlush )