JAVA数据流的概述
考虑到数据源的多样性,为了有效的进行数据的输入、输出操作,java中把不同数据源与程序间的数据传输都抽像的表述为“流”(Stream),以实现相对统一和简单的输入/输出(Inout/Output,I/O)操作方式。
下面就看看java数据流的概述:
流概述
流的分类:
• 按数据流动方向
– 输入流:只能从中读取字节数据,而不能向其写出数据
– 输出流:只能向其写入字节数据,而不能从中读取数据
• 按照流所处理的数据类型
– 字节流:用于处理字节数据。
– 字符流:用于处理Unicode字符数据
• 按照流所处理的源
– 节点流:从/向一个特定的IO设备读/写数据的流
– 处理流:对已存在的流进行连接和封装的流
过滤流
抽象的InputStream和OutputStream类允许我们对字串及数字进行读写。为达到这个目的,还需要功能更多的子类。例如:DateInputStream和DataOutputStream允许我们对所有基本的java类型进行读写。
文件流类与抽象的InputStream和OutputStream类相似,这些类也只支持字节级的读写操作。换言之,只能从fin对象中读取字符和字节数组。byteb=fin.read(),他们没有提供专门的数值类型,所以DataInputStream没有办法从一个文件中获取数字。
解决方案:java给流职责分工,某些流(FileInputStream)负责从文件或另一些更特殊的地方读入字节数据。而另一些流
(DataInputStream、PrintWriter)负责将字节“组装”成更有用的数据类型。必须综合运用这两种流,将其合并成所谓的"过滤流(FilteredStreams)",方法是将一个现成的流传递给另一个流的构建器。
数据流
l DataInputStream
l DataOutputStream
类的构造及成员详见文档
//在文件中写入并读出人名及其工资
import java.io.*;
public class T1 {
public static void main(String[] args) {
String[] name = {"Tom","Jack","Mary"};
double[] salary = {300, 400, 1200};
try{
FileOutputStream fos = new FileOutputStream("res/salary.txt");
DataOutputStream dos = new DataOutputStream(fos);
for(int i=0; i<name.length; i++){
dos.writeUTF(name[i]);
dos.writeDouble(salary[i]);
}
dos.close();
fos.close();
///
FileInputStream fin = new FileInputStream("res/salary.txt");
DataInputStream dis = new DataInputStream(fin);
for(int i=0; i<name.length; i++){
String n = dis.readUTF();
double s = dis.readDouble();
System.out.println(n + " :" + s);
}
dis.close();
fin.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
字节缓冲流
l BufferedInputStream
l BufferedOutputStrem
类的构造及成员详见文档
默认情况下,流不会进行缓冲。即每读一次,都会要求操作系统提供一个字节。通过BufferedInputStream和
BufferedOutputStream对流构建器进行过滤分层,实现缓冲。
1、构造函数:
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, intsize) //size:缓冲区的大小
2、代码演示:
BufferedInputStream bis=newBufferedInputStream(System.in);
BufferedInputStream bis=newBufferedInputStream(System.in ,100);
//用缓冲字节流实现文件读写
import java.io.*;
public class BufferedIOTest {
public static void main(String[] args) {
try{
FileOutputStream fos = new FileOutputStream("res/new.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
DataOutputStream dos = new DataOutputStream(bos);
dos.writeUTF("goodmorning!");
dos.writeInt(250);
dos.close();
bos.close();
fos.close();
FileInputStream fis = new FileInputStream("res/new.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
System.out.println(dis.readUTF() + "\n"+ dis.readInt());
dis.close();
bis.close();
fis.close();
}catch(Exception e){
e.printStackTrace();
}
}
}