InputStream类操作的是字节数据(byte),不是字符(char),在ASC11中字符和字节数据对应为8为数据,java的字符为16位数据,Unicode字符集对应的是16位字节数据,java的整数为32位。
一:保存字节级数据
a.DataOutputStream类,向输出流中写个java基本类型,所写的是可以移植的,它们能用DataInputStream类读取。
b.FileOutputStream类 可以简单的向文件写入数据。
简单代码(保存):
package inAndoutStream; import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class SimpleOutPutTest { public static void main(String[] args) { double pi=3.1415; int i= 10; boolean okay=true; char cc='j'; String s="java C pascle"; try { FileOutputStream fs_out=new FileOutputStream("sample.dat"); DataOutputStream out=new DataOutputStream(fs_out); out.writeDouble(pi); out.writeInt(i); out.writeBoolean(okay); out.writeChar(cc); out.writeUTF(s); out.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
在代码中,FileOutputStream fos= new FileOutputStream("Sample.dat"); ,是用来创建一个文件来保存数据;
Sample.dat <------ fs_out(FileOutputStream)<-------out(DataOutputStream)
二:读取字节级数据
a: DataInputStream
b: FileInputStream
简单代码(读取):
package inAndoutStream; import java.io.DataInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class SimpleInputTest { public static void main(String[] args) { try { FileInputStream fis=new FileInputStream("sample.dat"); DataInputStream dis=new DataInputStream(fis); double pi=dis.readDouble(); int i=dis.readInt(); boolean b=dis.readBoolean(); char c=dis.readChar(); String s=dis.readUTF(); dis.close(); System.out.println("pi= "+pi+", i= "+i); System.out.println("b= "+b); System.out.println("s= "+s); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
outprint:
DataInputStream & DataOutputStream的作用一样,其的构造方法需要一个低层次的输入流对象作为参数,FileInputStream可以提供这个流的对象。
Sample.dat ------> fs_out(FileOutputStream)------->out(DataOutputStream)
三:BufferedOutputStream
bufferedOutputStream类增强了批量数据输出到另一个输出流的能力。当关闭时,如果缓存未满,就强迫将数据压入输出流中,所有关于输出流操作的方法都是自动进行缓存的。
以下是简单的代码对比:
不用缓存:
package inAndoutStream; import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class WriteUnbufferTest { public static void main(String[] args) { try { long start=System.currentTimeMillis(); FileOutputStream pos= new FileOutputStream("Daniel.dat"); DataOutputStream dos=new DataOutputStream(pos); for(int i=0;i<100000;i++){ dos.writeDouble(Math.random()); } dos.close(); long stop=System.currentTimeMillis(); System.out.println("Times ="+(stop-start)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
outprintln:
Times =656
有缓存:
package inAndoutStream; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class WriteBufferedTest { public static void main(String[] args) { try { long start=System.currentTimeMillis(); FileOutputStream pos= new FileOutputStream("Daniel.dat"); BufferedOutputStream bos=new BufferedOutputStream(pos); DataOutputStream dos=new DataOutputStream(bos); for(int i=0;i<100000;i++){ dos.writeDouble(Math.random()); } dos.close(); long stop=System.currentTimeMillis(); System.out.println("Times ="+(stop-start)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
outpirnt:
Times =94
Sample.dat ------> fos(FileOutputStream)----->bos(BufferedOutputStream) ------->dos(DataOutputStream)