黑马程序员-IO包中的其它对象

 

------- android培训java培训、期待与您交流! ----------

IO包中的其它对象:

1,随机流-RandomAccessFile(内部封装了字节流)

特点:可以对数据进行读和写的操作。通过构造器的第二个参数模式来区分读写。r/rw。

好处:对于规则的数据可以通过指针的偏移进行随机的数据获取。

方法:seek(),skipBytes(),getFilePointer()。

注意:如果在指定位置写入数据,该位置如果已存在数据,那么会发生局部数据覆盖。


2,管道流-PipedInputStream和PipedOutputStream

特点:读取流和写入流可以进行连接。

连接通过这两个流的构造器,或者通过两个流对象的connect方法。

管道流通常都需要结合多线程进行使用。


 

3,打印流PrintWriter与PrintStream

字节打印流:PrintStream,System.out对应的类型就是PrintStream。

该类构造器可以接收三种类型的参数:

a,File

b,String name

c,OutputStream

前两者在传递参数时,可以指定字符编码。

后者传递参数时,可以指定是否自动刷新。

 

字符打印流:PrintWriter。

该类构造函数可以接收四种类型的参数:

a,File

b,String name

c,OutputStream

d,Writer

前两者在传递参数时,可以指定字符编码。

后两者传递参数时,可以指定是否自动刷新。


该自动刷新动作,只有在被调用println,printf,format方法可以使用。

该打印流较为常用。在日后学习Javaweb中,在进行往客户端应答的时候通过response既可以获取PrintWriter对象,通过将html数据打印到客户端,客户端通过浏览器进行数据解析并展现页面效果。

需求:通过打印流操作字符数据,需要编码,同时也需要提高效率。

PrintWriter out =

new PrintWrite(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),"UTF-8")));

4,序列流-SequenceInputStream

特点:用来将多个读取流合并成一个流,操作多文件数据较为方便。

它的构造器有两个:

一个可以将两个流合并成一个流。

一个可以将枚举Enumeration中的流对象合并一个流。

通常获取Enumeration是通过Vector的elements方法来完成。但是Vector效率较低,所以改用ArrayList。

代码如下:

public void show() {

    ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();

    for(int x=1; x<=3; x++) {

        al.add(new FileInputStream(x+".txt"));

    }

 

    final Iterator<FileInputStream> it = al.iterator();

    Enumeration<FileInputStream> en = new Enumeration() {

            public boolean hasMoreElements() {

                return it.hasNext();

            }

 

            pullic FileInputStream nextElment(){

                return it.next();

            }

   };


    SequenceInputStream sis  = new SequenceInputStream(en);

    FileOutputStream fos = new FileOutputStream("a.txt");

    byte[] buf = new byte[1024];

    int len = 0;

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

        fos.write(buf,0,len);

    }

    os.close();

    sis.close();

}


 

5,操作对象的流-ObjectInputStream与ObjectOutputStream

特点:可以用流直接操作Object,将内存中的对象存储到硬盘上,这个过程称为:对象的本地持久化。

注意:被操作的Object 必须要实现一个标记接口Serializable,该接口中没有方法,该接口用来给类进行UID指定。

可以通过ObjectOutputStream的writeObject方法,来完成对象的持久化。

通过ObjectInputStream的readObject方法,获取存储的对象。

注意:static的变量,非static但被transient关键字所修饰的变量,它们的值不会被持久化。

这两个对象在构造的时候都需要传入一个字节流进行。


 

6,操作基本数据类型的流-DataInputStream与DataOutputStream

专门用于操作基本数据类型。如:writeInt(),readInt()。

writeUTF(),readUTF(),使用的是utf-8修改版。通过writeUTF()写入的数据,必须通过readUTF()获取。


7,操作字节数组的流-ByteArrayInputStream与ByteArrayOutputStream

这两个流中的子类对象,并没有调用底层资源。所以关闭方法close是无效的。

数据源和数据目的都是内存。


操作字节数组中的元素只要通过指针的偏移即可,为什么还要封装这样两个对象呢?

其实是:通过流的读写思想完成了数组操作。

ByteArrayInputStream bis = new ByteArrayInputStream("abc".getBytes());

ByteArrayOutputStream bos = new ByteArrayOutputStream();

int len = 0;

while((len=bis.read())!=-1) {

      bos.write(len);

}


String s = bos.toString();

byte[] arr = bos.toByteArray();

bos.writeTo(new FileOutputStream("a.txt"));

 

操作字符数组CharArrayReader与CharArrayWrite

操作字符串StringReader 与 StringWriter

原理和ByteArrayInputStream ByteArrayOutputStream相同。


---------------------------------------------------------------------------------------------------


字符编码:

ASCII:

ISO8859-1.

GB2312,GBK。

UTF-8.


在流对文本数据操作,为了方便提供了转换流,转换流中就融入了编码表,默认是GBK.

OutputStreamWriter osw = 

new OutputStreamWriter(new FileOutputStream("a.txt"),"UTF-8");

osw.write("你好");

osw.close();


将"你好"字符查了UTF-8的码表,并将码表中对应的数字写入到硬盘上。字节数是6。

InputStreamReader isr = 

new InputStreamReader(new FileInputStream("a.txt"),"gbk");

char[] buf = new char[10];

int len = isr.read(buf);

System.out.println(new String(buf,0,len));// 乱码。

isr.close();

为什么出现乱码呢?读到的数据一共有6个字节,如果是查GBK码表,该码表是一个中文两个字节。

所以读两个字节就查询GBK表,找了一个对应的文件浣,但是并不是和元数据相符。所以称为乱码。


所以要解决该问题。必须将gbk该成UTF-8。

 

------- android培训java培训、期待与您交流! ----------   
详细请查看:http://edu.csdn.net/heima/ 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值