20220805学习内容 数据流和打印流

本文介绍了在Java中如何使用数据流处理double、String和int的组合写入,特别强调了处理String时的注意事项,以及在遇到文件结束时如何避免EOFException。同时,文章还探讨了打印流的使用,特别是println方法在输出后自动换行的功能。
摘要由CSDN通过智能技术生成

数据流:

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 ( new
FileOutputStream ( "d:\\a.data" ));
dos . writeDouble ( 123.456 );
dos . writeChars ( " 赵天爱小猴 !" );
dos . writeInt ( 12 );
dos . close ();

 由于读取出现问题,针对中间的String数据引入一个额外的数据,其中存储Stringchar个数

写出数据:
double salary = 123.456 ;
String ss = " 赵天爱小猴,小猿爱小主,小胡招小天 " ;
int age = 12 ;
DataOutputStream dos = new DataOutputStream ( new BufferedOutputStream ( new
FileOutputStream ( "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 ( new
FileInputStream ( "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 )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值