• java中的标准I/O流与文件2(J2SE入门17)


    随机存取文件 
    RondomAccessFile类允许随机访问文件,这个类也是支持直接输出输入各种数据类型。
    GetFilepoint()可以知道文件中的指针位置,使用seek()定位。
    Mode(r:随机读;w:随机写;rw:随机读写)
    1) 实现了二个接口:DataInputDataOutput 
    2) 只要文件能打开就能读写; 
    3) 通过文件指针能读写文件指定位置; 
    4) 可以访问在DataInputStream和DataOutputStream中所有的read()和write()操作; 
    5) 在文件中移动方法: 
    a. long getFilePointer(): 返回文件指针的当前位置 
    b. void seek(long pos): 设置文件指针到给定的绝对位置 
    c. long length(): 返回文件的长度

    字符流

    字符流可以解决编程中字符的编码问题。从字符到整数,对字符集和整数集建立一一对应的关系,就算叫做编码,从整数映射到字符,就叫做解码。

    编码问题:
    字节流的字符编码:
    字符编码把字符转换成数字存储到计算机中,按ASCii将字母映射为整数。
    把数字从计算机转换成相应的字符的过程称为解码。

    编码的方式:
    每个字符对应一个整数。不同的国家有不同的编码,当编码方式和解码方式不统一时,产生乱码。因为美国最早发展软件,所以每种的编码都向上兼容ASCII 所以英文没有乱码。
    ASCII(数字、英文)1个字符占一个字节(所有的编码集都兼容ASCII)
    ISO8859-1(欧洲)  1个字符占一个字节
    GB-2312/GBK        1个字符占两个字节
    Unicode            1个字符占两个字节(网络传输速度慢)
    UTF-8              变长字节,对于英文一个字节,对于汉字两个或三个字节。


    InputStreamReader和OutputStreamWriter(字节流转化成字符流的桥转换器)
    这两个类不是用于直接输入输出的,他是将字节流转换成字符流的桥转换器,并可以指定编解码方式。

    Reader和Writer (字符流类,所有字符流的父类型)

    1) Java技术使用Unicode来表示字符串和字符,而且提供16位版本的流,以便用类似的方法处理字符。 
    2) InputStreamReader和OutputStreamWriter作为字节流与字符流中的接口。 
    3) 如果构造了一个连接到流的Reader和Writer,转换规则会在使用缺省平台所定义的字节编码和Unicode之间切换。 

    BufferedReader/(BufferedWriter,不常用)(这两个类需要桥转换)
    PrintWriter(带缓存的字符输出流,不需要桥转换)

    常用输入输出类型,不需要桥接,其中其它方法请参看API文档。
    以上两个都是过滤流,需要用其他的节点流来作参数构造对象。
    BufferedReader的方法:readLine():String ,当他的返回值是null时,就表示读取完毕了。要注意,再写入时要注意写换行符,否则会出现阻塞。
    BufferedWriter的方法:newLine() ,这个方法会写出一个换行符。
    PrintWriter的方法:println(.String,Object等等)和write(),println(...)这个方法就不必再写换行符了,在使用时会自动换行。

    注意:在使用带有缓冲区的流时,在输入之后就要flush()方法,把缓冲区数据发出去

    原则:保证编解码方式的统一,才能不至于出现错误。
    java.io包的InputStreamReader输入流的从字节流到字符流的桥转换类。这个类可以设定字符转换方式。
    OutputStreamWriter:输出流的字节流桥转换成字符流
    BufferedReaderreadLine()使得字符输入更加方便。

    在I/O流中,所有输入方法都是阻塞方法。
    Bufferwrite给输出字符加缓冲,因为它的方法很少,所以使用父类PrintWrite,它可以使用字节流对象,而且方法很多。

    ObjectInputStream和ObjectOutputStream(对象流)

    对象流是过滤流,需要节点流作参数来构造对象。用于直接把对象写入文件和从文件读取对象。只有实现了Serializable接口的类型的对象才可以被读写,Serializable接口是个标记接口,其中没有定义方法。对象会序列化成一个二进制代码。

    writeObject(o),readObject()这两个是对象读写操作时用的方法。

    Object o = new Object();
    FileOutputStream fos=new FileOutputStream("Object.txt");
    ObjectOutputStream oos=new ObjectOutputStream(fos);
    oos.writeObject(o);
    oos.close();

    FileInputStream fis =new FileInputStream(“Object.txt”);
    ObjectInputStream ois =new ObjectInputStream(fis);
    Object o = (Object)Ois.readObject();
    ois.close();


    对象流读取结束返回 EOFException异常对象。

    一个类中有其他类型的对象,那么,这个类实现了Serializable接口,在对象序列化时,也同样要求这个类中属性都能够对象序列化(基本类型除外)。

    注意:对于对象流的操作,在写对象时要一次写入完毕,如果使用追加模式写入,只会读取到上一次写入的对象,使用对象流写入时,会先写入一个头部,然后写入数据,最后加上结束符号,如果使用追加方式写入的话,那就会在结束符号继续向下写入,但是在读取时只会读到结束符为止,以后再次写入的数据就会丢失。

    注意:在使用对象流写入对象时要一次向文件写入,不能够采用追加方式

    serialver命令判断是否一个属性或对象可序列化,
    serialver TestObject(TestObject必须为已经编译,也就是.class)
    执行结果:如果不可序列化;则出现不可序列化的提示。如果可以序列化,那么就会出现序列化的ID:UID。

    Externalizable这是Serializable的子接口,他可以让用户自定义如何序列化对象。
    readExternal(ObjectInput in),writeExternal(ObjectOutput out)这是这个接口中的两个方法,通过这两个方法可以定制序列化过程。这个方法不安全,可以调用以上两个方法改变对象的状态。

    transient只能用来修饰属性。表示这个属性在对象序列化时将被忽略。
    transient int num;
    表示当我们对属性序列化时忽略这个属性(即忽略不使之持久化)。所有属性必须都是可序列化的,特别是当有些属性本身也是对象的时候,要尤其注意这一点。

    java.util.StringTokenizer类,这个类是用于字符串截取的。
    StringTokenizer(参数1,参数2)按某种符号隔开文件
    StringTokenizer(s,:) 用隔开字符,s为对象。
    补充:字节流结束返回-1,字符流结束返回null,对象流结束返回 EOFException
    引申---------〉异常经常被用在流程控制, 异常也是方法的一种返回形式。

  • 相关阅读:
    c--日期和时间函数
    笔试题:360找镇长的题。
    【JavaScript】BOM和DOM
    也谈在 .NET 平台上使用 Scala 语言(续)
    生成n个元素的全排列 C实现
    jsp安全性问题
    stm32DMA通道 ADC通道
    POJ 1860
    Codeforces Round #FF (Div. 2) A. DZY Loves Hash
    Configure the modules to be find by modprobe
  • 原文地址:https://www.cnblogs.com/syxchina/p/2197224.html
Copyright © 2020-2023  润新知