第十二章 java流与文件操作 第五讲

来源:互联网 发布:转行程序员后悔了 编辑:程序博客网 时间:2024/04/30 10:17

五 打印流的应用 一------PrintStream

(1) 打印输出流的作用:在OutputStream输出流的基础上提供了增强的功能,即可以方便地输出各种类型的数据(而不仅限于byte类型)的格式化表示形式。

(2)在输出的时候可以调用多种方法,可以输出不同种类型的数据,例如:

 print(boolean b)

print(char c)

print(char[] s)

print(double d)

print(float f)

print(itn i)

print(long l)

print(object b)----------打印对象

print(String s)

(3) 打印输出流的构造方法

PrintStream可以作为节点流使用而直接关联到文件数据源,也可以作为处理流关联到其他的字节输出流并向其输出数据提供增强的功能。其实他们关键的不同是构造函数的参数不同。

PrintStream(File file)
PrintStream(String fileName)
PrintStream(OutputStream out)
PrintStream(OutputStream out, boolean autoFlush)

 

(1)当作为节点流时:----作用----指定编码字符集

       PrintWriter rw  = new PrintWriter("dome.txt","UTF-8"); 

       File f1 = new File("res/dome5.txt");

PrintWriter pw1 = new PrintWriter(f1,"UTF-8");

以上两个方法的作用是一样的

(2)当作为处理流时,把字符流封装-----作用----指定自动刷新

       FileWriter fw = new FileWriter("res/dome.txt");

PrintWriter pw = new PrintWriter(fw,true);

(3) 因为打印流的类只能在不同的时候实现不同的功能,下列是既能实现刷新又能指定编码字符集的代码:

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("demo.txt"),"UTF-8");

PrintWriter pe2= new PrintWriter(osw,true);


注:PrintStream的方法不抛IOException;而是在异常的情况下设置一个内部标志,可以通过成员方法checkError()测试此标志的值以表明是否出现异常。

System.out就是一个PrintStream类型的对象

打印流的应用 二 ---------PrintWriter

PrintWriter和PrintStream相似,区别在于:作为处理流使用时,PrintStream只能封装OutputStream类型的字节输出流,而PrintWriter既可封装OutputStream,还能够封装Writer类型字符输出流并增强其功能。

六  基本数据类型的流对象  DataInputStream 

      DataInputStream:属于处理流,它能够以一种与机器无关的方式,直接从底层字节输入流读取Java基本数据类型和String类型的数据。

      构造方法:

public DataInputStream(InputStream);
FileInputStream fis=new FileInputStream(“a.txt”);
DataInputStream ds=new DataInputStream(fis);

常用方法:

int readInt();    boolean readBoolean();
short readShort();      long readLong();
String readUTF();

 

DataOutputStream:能够直接将Java基本类型数据写出其他的字节输出流,随后可以使用DataInputStream输入流读取这些数据

构造方法:

public DataOutputStream(OutputStream);

常用方法:
writeInt(int):一次写入四个字节writeBoolean(boolean);

注:注意和write(int)不同,write(int)只将该整数的最低一个8位写入。剩余三个8位丢弃。

writeShort(short);
writeLong(long);
writeUTF(String);//按照utf-8修改版将字符数据进行存储,只能通过readUTF读取。

注:通常只要操作基本数据类型的数据,就需要通过DataStream进行包装。通常成对使用。

七  对象的序列化 ----------FileOutputStream

     对象序列化是指将对象的状态数据以字节流的形式进行处理,一般用于实现对象的持久性,即长久保持一个对象的状态并在需要时获取该对象的信息以重新构造一个状态完全相同的对象。

 对象的写入:

      Employee e1=new Employee();

      //FileOutputStream参数是一个输出流的对象

      FileOutputStream fos = new FileOutputStream("obj.dat");

    ObjectOutputStream oos = new ObjectOutputStream(fos);

    Oss.writeObject(e1);

对象的读取:

    FileOutputStream fos = new FileOutputStream("obj.dat");

    ObjectInputStream ois = new ObjectInputStream(fos);

    Employee  e = (Employee)ois.readObject(e1);

    System.out.println(e.toString());

 

    private int stati count=100;//静态序列的变量不会被序列化

    private transient int age; //加了关键字transient的不会被序列化

   

     并不是任何引用类型的对象都可以被序列化,只有实现了java.io.Serializable接口的类的对象才可以

    Serializable接口中实际上没有定义任何属性和方法,它只是起到标记性作用(标记接口)。

在Java的语言规范中规定,Serializable接口的实现类均应提供无参的构造方法,以供可能的反序列化操作、系统重建对象时自动调用。

八   和文件相关的集合类---Properties

    java.util.Properties是集合类型,用于存储“键-值”对数据。

    该集合不需要泛型,因为该集合中的“键-值”对都是String类型。

(1)常用的方法

    存入键值对:setProperty(String key,String value);

Properties pro = new Properties(); //集合类的创建

       pro.setProperty("中国首都", "北京");//集合类的赋值

       pro.setProperty("日本首都", "东京");

          //获取键对应的值:String getProperty(String key);

       System.out.println(pro.getProperty("中国首都"));//根据键查找值

    String getProperty(String key,String defaultValue);

       System.out.println(pro.getProperty("中国首都",”该国家没记录”));

 

读取全部文件  第一种:

       //创建文件,并打开文件,向文件中输入键值对

       FileReader fr = new FileReader("res/sample.properties");

       //读取文件中的数据

       pro.load(fr);

       pro.list(System.out);

 

读取指定文件  第二种:

    /显示指定的数据------只显示键----用到枚举类型

    //pro.propertyNames()方法是获取键值放在枚举类型的集合中

    Enumeration<String> e =(Enumeration<String>)pro.propertyNames();

       //通过循环是方式将集合中的集合e里的所有元素都获取到

    while(e.hasMoreElements()){//

       String key = e.nextElement();//读取存放到枚举集合中的集的数据的---键

       String value = pro.getProperty(key);//从集合类中查找键所对应的----值

       System.out.println(key+"="+value);

       }

获取集合中所有键:Enumeration propertyNames();在jdk1.6版本给该类提供一个新的方法:Set<String> stringPropertyNames();

九  顺序流的合并----- FileInputStream

   例:

       FileInputStream fis1 = new FileInputStream("res/34.jpg");

       FileInputStream fis2 = new FileInputStream("res/35.jpg");

      

    FileOutputStream fos = new FileOutputStream("res/36.jpg");

       //构建顺序流,把两个流合并

       SequenceInputStream sis = new SequenceInputStream(fis1,fis2);

      

       //创建一个字节数组,并从数组中读取出来

       byte[] buf = new byte[1024];

       int len;

       while((len=sis.read(buf))!=-1){

           fos.write(buf,0,len);

       }