Java IO(4)

来源:互联网 发布:mentohust mac.tar.gz 编辑:程序博客网 时间:2024/06/18 09:28

上次回顾:
 File类:直接与文件本身有关系
   字节流:OutputStream、InputStream
   字符流:Writer、Reader
    存放在文件中的都是字节,而读到内存中才可能变成字符
 打印流:PrintStream/PrintWriter:提供了各种打印功能,可以输出任意的内容,根据实例化对象的不同输出的位置也不同。
   System.in:键盘输入流、System.out:屏幕输出流
   输入数据的一个基本格式:BufferedReader

一、字符集: 文件保存时所使用的编码。
   GB2312<GBK<ISO8859-1  (中文简体<中文简体加繁体的字符集 <国际通用字符集)
   设置系统编码字符集:
         System.getProperties().put("file.encoding","iso8859-1")
   列出系统全部设置属性:
         System.getProperties().list(System.out)
   转换编码:
         String类中的:byte[] getBytes(String charsetName)
       使用指定的字符集将此String编码为byte序列,并将结果存储到一个新的byte数组中。 
   file.encoding=GBK :说明JVM中默认的文件编码为GBK。
   在这种编码下,可以正常在文件中输出中文,如果在程序中将编码变成ISO8859-1,则会出现乱码。
   乱码产生的根本原因:两国语言不通,即两个操作间的字符集没有匹配。
二、SequenceInputStream类 用来合并文件。
   SequenceInputStream(InputStream s1, InputStream s2)
          通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),以提供从此 SequenceInputStream 读取的字节。
接收两个InputStream对象,这就意味着程序要先使用InputStream找到这两个文件。
  例:将csdn1.txt和csdn2.txt文件合成一个新的csdn文件,把内容也合并。
后面内容为 Java → J2EE中都占用很大比重的部分 ----- 序列化

三、对象序列化(1)
 对象序列化是指把对象写入到流中,对象的饭序列化是指从流中恢复对象
 优点在于即使程序运行结束,对象仍然可以保存下来(到文件中)。
 对象所在的类必须实现java.io.Serializable接口,才能被序列化。
▼对象序列化的步骤:
   1.创建一个对象输出流,他可以连接到一个其他的流,比如文件输出流
       ObjectOutputStream out=new ObjectOutputStream(OutputStream out)
          创建写入指定 OutputStream 的 ObjectOutputStream。
       new FileOutputStream("F://object.obj")
   2.通过对象输出流的writeObject方法序列化对象
       void writeObject(Object obj)
          将指定的对象写入 ObjectOutputStream。
     例:
       out.writeObject("hello")
       out.writeObject(new date())
       out.writeObject(serialObject)
 如果需要将对象变为byte流,则需要将对象进行转化:ObjectOutputStream实现
  此种做法类似于PrintWriter/PrintStream,谁为ObjectOutputStream实例化就向那里输出。
▼对象反序列化的步骤
   1.创建一个对象输入流,他可以连接到一个其他的流,比如文件输入流
       ObjectInputStream in=new ObjectInputStream(InputStream in)
          创建写入指定 InputStream 的 ObjectInputStream。
       new FileInputStream("F://object.obj")
   2.通过对象输入流的writeObject方法序列化对象
       Object readObject()
          从 ObjectInputStream 读取对象。 
     例:
       in.readObject("hello")
       in.readObject(new date())
       in.readObject(serialObject)
 必须明确告诉ObjectInputStream从哪里读内容。
 一个序列化的核心部分:Serializable接口
 Ψ疑问的是:在Person类中并没有重写接口中的任何方法?(Person类为被序列化的类)
    因为此接口只是一个声明性接口,表示实现此接口的类可以被序列化。
 也可以这样理解:此接口只是一个标识,说明可以被序列化;与克隆类似,如果一个类要被克隆,则必须实现Cloneable接口,这个接口也是一个标识。
 Ψ又疑的是:现在程序中姓名和年龄都被序列化,现在不希望年龄被序列化。
    可以使用transient关键字:当不希望类中的某个字段被序列化时,可用此关键字。
    例:private transient int age;
小结一下:
  变量声明的完整定义:
  [public | protected | private] [final] [static] [transient] 数据类型 变量名 ;
  方法的完整定义:
  [public | protected | private] [final] [static] [synchronized]
    方法返回类型 | void  方法名 ( [参数列表]) { }
练习一下:
  设计以程序Copy.java,实现文件的拷贝工作
  要求:模仿DOS的Copy命令,输入两个路径名
  提示:可以使用File、FileInputStream、FileOutputStream实现
  执行如下:java Copy C://1.txt d://
本次IO学习重点:
 File类
 字节流和字符流的操作
 打印流的使用
 对象序列化(重点)

原创粉丝点击