java语言中 I/O是计算机输入/ 输出的接口,流是一个有序的字节序列。即可作为一个输入源,也可作为一个输出的目的地,任何一个实现了serilizable接口的对象和数据都能被写入输出流也可以被输入流读出。流是数据传输时的形态!
按照读取数据的方式I/O流可分为以下:
|
字节流(每次读写一个字节8位) |
字符流(每次读写一个字符16位) |
输入流 |
inputstream |
reader |
输出流 |
outputstream |
writer |
以下程序可以说明两种流读写数据时的差异:
public class ShenGao {
public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream ("java.txt");
fos.write("zhonguo and 中国".getBytes());
//FileWriter fw=new FileWriter("java.txt");
//fw.write("我们是中国人");
//fw.flush();
FileInputStream fis= new FileInputStream("java.txt");
byte[] b= new byte[1024]; //字节数组
int s =fis.read(b);
FileReader fr=new FileReader("java.txt");
char[] c= new char[1024 ]; //字符数组
int len=fr.read(c);
System.out.println(new String(b,0,s));
System.out.println(new String (c,0,len));
//fw.close();
fr.close();
}
}public class ShenGao {
public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream ("java.txt");
fos.write("zhonguo and 中国".getBytes());
//FileWriter fw=new FileWriter("java.txt");
//fw.write("我们是中国人");
//fw.flush();
FileInputStream fis= new FileInputStream("java.txt");
byte[] b= new byte[1024]; //字节数组
int s =fis.read(b);
FileReader fr=new FileReader("java.txt");
char[] c= new char[1024 ]; //字符数组
int len=fr.read(c);
System.out.println(new String(b,0,s));
System.out.println(new String (c,0,len));
//fw.close();
fr.close();
}
}
按照功能可以分为介质流(media stream)或者称为原始流(raw stream)和过滤流(filter stream),介质流是指一些基本的流。主要是从具体的介质上进行分类,如文件、内存缓冲去(byte 数组、char数组、和Stringbuffer对象等),过滤流主要是对其包装的类进行某些特定的处理,如缓存、数据打包等.....
我们很容易可以利用介质流来将一个整型、字符串等数据进行读写!可是如何将一个浮点型小数写入文件?恐怕就没有那么简单了!这就用到了过滤流 filterinpututstream和filteroutputstream,下面一个程序告诉我们如何对一个对象进行读写:
public class ShenGao {
public static void main(String[] args) throws IOException {
File f=new File("D:/java.txt");
FileOutputStream file=new FileOutputStream(f);
DataOutputStream dop= new DataOutputStream(file);
dop.writeFloat(184518164);
DataInputStream di=new DataInputStream(new FileInputStream(f));
System.out.println(di.readFloat());
dop.close();
di.close();
}
}
因为float类实现了serilizable接口所以可以对其进行直接读写。当然我们也可以自己定义一个类然后实现这个接口,然后让其打包在机器中读写和传输。java中的Objectinputstreamg和Objectoutputstream是对datainputstream和dataoutputstream接口的的扩充,DataInput 包括基本类型的输入方法;ObjectInput 扩展了该接口,以包含对象、数组和 String 的输出方法。
public class ShenGao {
public static void main(String[] args) throws IOException {
test t=new test(110,"伟杰",21);
File f=new File("D:/java.txt");
FileOutputStream file=new FileOutputStream(f);
ObjectOutputStream oop= new ObjectOutputStream(file);
ObjectInputStream di=new ObjectInputStream(new FileInputStream(f));
oop.writeObject(t);
try {
System.out.println ((test)di.readObject());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
oop.close();
di.close();
}
}
class test implements Serializable{
int id;
String name;
int age;
test(int id,String name,int age){
this.id=id;
this.name=name;
this.age=age;
}
public String toString(){
return "id:"+id +",name:"+name + ",age:"+age;
}
}
输出结果为 id:110,name:伟杰,age:21