黑马程序员_day25_IO流的其他流

Java IO流详解
本文详细介绍了Java中的IO流概念,包括PrintStream与PrintWriter的区别、序列流SequenceInputStream的使用、对象序列化与反序列化的操作方式,以及RandomAccessFile的特点与应用场景。

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

打印流:

PrintStream:

1,使它们能够方便地打印各种数据值表示形式.

2,提供了一系列的打印功能.可以打印任何数据。 

 3,它的特有的方法不抛出异常。 

构造方法:

该流是一个处理目的的流对象。 

目的:

1File对象。   可以指定字符集

2,字符串路径。可以指定字符集

 3,字节输出流。可以对println方法进行自动刷新。

Writeprint的区别(重要)

PrintStream out = new PrintStream("tempfile\\print_print.txt");

//使用PrintStream继承的方法。write

out.write(866); //write将接收到整数的最后一个字节写入到流。

//使用PrintStream的特有方法。print.

out.print(865);//print方法,可以将参数的数据表现形式打印到目的中。原理是将97转成字符串,在write到目的。 

//print方法打印各种数据都会将其变成字符串。所以可以保证数据的原有表现形式。

out.close();

打印流的另一个比较常用的字符打印流

PrintWriter:字符打印流。

构造函数:

 1File对象。

2,字符串路径。 

 3,字节输出流。 

 4,字符输出流。 

自动刷新 autoFlush

PrintWriter out = new PrintWriter(System.out,true);

注意传递参数只有是流时,才可以自动刷新,而且当后面的传递参数为true时,才会自动刷新。

//需求:想将键盘录入的数据存储到文件中,并希望自动刷新。

// PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true);

String line = null;

while((line=bufr.readLine())!=null){

if("over".equals(line)){

break;

}

out.write(line.toUpperCase()+"\r\n");                     

或者写out.println(line.toUpperCase());

}

out.close();

bufr.close();

二、序列流

SequenceInputStream: 序列流。

将多个流进行逻辑串联(进行合并,变成一个流,操作起来很方便,因为多个源变成了一个源)

FileInputStream fis1 = new FileInputStream("tempfile\\seq_1.txt");

FileInputStream fis2 = new FileInputStream("tempfile\\seq_2.txt");

FileInputStream fis3 = new FileInputStream("tempfile\\seq_3.txt");

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

v.add(fis1);

v.add(fis2);

v.add(fis3);

枚举对象的获取 ,Collection中的方法。

Enumeration<FileInputStream> en = Collections.enumeration(v);

SequenceInputStream sis = new SequenceInputStream(en);

三、操作对象的类

ObjectInputStreamObjectOutputStream:

1,可以用流直接操作对象。

writeObj();

readObj();

//反序列化。

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("tempfile\\obj.txt"));

Person p = (Person)ois.readObject();

System.out.println(p.getName()+":"+p.getAge());

ois.close();

}注意:这里的person类要实现 class Person implements Serializable接口

// 序列化。使用ObjectOutputStream写一个对象到文件中。如果目的是硬盘等设备,也就对象的持久化。

public static void writeObj() throws IOException, IOException{

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("tempfile\\obj.txt"));

oos.writeObject(new Person("xiaoming",20));

writeObject()的参数是一个对象。

oos.close();

Serializable:接口

 用于给被序列化的类添加一个序列版本号。

private static final long serialVersionUID = 123456L;该数值可以自定义

为了判断序列化的对象和对应的class类是否匹配。

注意:类中的静态数据不会被序列化。

那么非静态数据有些不需要序列化的怎么办呢?这需要一个关键字来完成。transient 瞬间的,暂时的。 

四、RandomAccessFile:

1,不是字节流或者字符流体系中的成员。

2,该类是用于操作File的类。

3,该对象既可以读取又可以写入。

4,该对象中封装中了一个byte类型的数组。

5,其实它内部就是封装了字节输入流和字节输出流。

 6,通过seek方法设置数组的指针就可以实现对文件数据的随机读写。 可以实现数据的修改。 

注意:被操作的数据一定要规律。 

五、流规律

明确数据所在的设备:

源设备:

键盘(System.in)

硬盘(FileXXX)FileReader FileInputStream

内存(数组)ByteArrayInputStream CharArrayReader StringReader

网络(Socket)

目的设备:

显示器(控制台System.out)

硬盘(FileXXX)FileWriter FileOutputStream

内存(数组)ByteArrayOutputStream CharArrayWriter StringWriter

网络(Socket)

具体使用哪个对象就可以明确了。

明确是否需要额外功能?

1,是否需要高效?缓冲区Buffered 四个。 

2,是否需要转换?转换流 InputStreamReader OutputStreamWriter

3,是否操作基本数据类型? DataInputStream  DataOutputStream

4,是否操作对象(对象序列化)? ObjectInputStream ObjectOutputStream 

5,需要对多个源合并吗? SequenceInputStream

6,需要保证数据的表现形式到目的地吗? PrintWriter 

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值