Java数据流和打印流

数据流
DataInputStream DataOutputStream 两个类创建的对象分别被称为数据输入流和数据输出流。这是 很有用的两个流,它们允许程序按与机器无关的风格读写Java 数据。所以比较适合于网络上的数据传 输。这两个流也是过滤器流,常以其它流如InputStream OutputStream 作为它们的输入或输出
DataInputStram DataOutputStream 分别继承自 InputStream OuputStream ,属于过滤流,需要分 别套接在InputStream OutputStream 类型的节点流上
  • 只有字节流,没有对应的字符流
DataInputStream DataOutputStream 提供了可以存取与机器无关的 Java 原始类型数据的方法
DataInputSteram DataOutputStream 构造方法为
  • DataInputStream(InputStream)
  • DataOutputStream(OutputStream)

1、用数据输出流将菲波那契级数的前二十项存放在fei.dat文件中。

2 、从 fei.dat 文件中读出数列,显示输出,并计算累加和。
读取、写出一个 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 数据引入一个额外的数据,其中存储 String char 个数
写出数据
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 表示输出后自动换行
  • PrintWriterPrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息
  • PrintWriterPrintStream有自动的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)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值