java---IO流中的其他部分

java中除了基本输入输出流之外,还有一些比较重要的其他一些流,下面分别介绍:

1、DataOutputStream和DataInputStream:都属于数据流:可以针对Java基本数据类型的数据进行读写操作

      比如写入dos.writeByte(100) ;
     dos.writeInt(1000) ;

    然后读取byte b = dis.readByte() ;
     int i = dis.readInt() ;

注意,当你写入文件之后,打开查看,是一些看不懂的字符乱码的字符,而读出来则是输入的类型,而且写入和读取的类型顺序要一致,否则乱码,输出来的就不在是当时写入的数据类型了。

2、ByteArrayInputStream和ByteArrayOutStream
   内存操作流:针对内存的数据进行操作的,程序一结束,这些内存中的数据就消失掉了!特点:针对小文件进行操作

   他里面有一个reset重置方法,可以重置内存操作输出流。这是针对字节进行操作的,每次读写一个字节或者一个字节数组,并且在读的时候,它传入的是一个字节数组,它们的构造方式是:

  ByteArrayOutputStream baos = new ByteArrayOutputStream() ;

  ByteArrayInputStream bais = new ByteArrayInputStream(buffer) ;

 可以看出,它们在构造时,并没有传入文件,是直接对内存进行操作,每次读取一个字节数组。

对于对文件操作的流来说,每次刷新写入数据之后,一定要关闭资源,而内存流中的close方法并没有实际内容,所以可要可不要,这也体现了内存操作流的特点,程序一结束,数据就消失掉了。

3、打印流: 字节打印流:PrintStream和字符打印流:PrintWriter

         打印流特点:
   1)在复制文件的,打印流不能操作数据源,只能操作目的地的数据(只能输出数据)
   2)打印流可以有自动刷新的功能
   3)打印流可以直接针对文本文件进行操作

打印流,其实可以理解为输出流,也是可以用于写数据的,他和输出流的不同,主要体现在可以自动刷新以及换行上面,在构造的时候,如果第二个参数是true,则认为有自动刷新功能。而且他的两个构造方法(这里以字符流为例),

PrintWriter pw = new PrintWriter("pw.txt") ;

PrintWriter pw = new PrintWriter(new FileWriter("Copy.java"), true) ;

第一种构造方式传入的直接是文件,而第二种构造方式传入的是一个字符流和boolean参数。

4、标准输入和输出流System类中有两个字段:
    in:----->InputStream is = System.in ; 
   out----->PrintStream ps = System.out ;

我们平时在编程的时候,比较常用的输出打印方式就是System.out.println() ;In和Out是标准输入输出流,System.in和System.out 相当于是创建了一个新的基本输入输出流,所以相交以前的键盘录入方式,这里提供另外一种的键盘录入方式。其中用到了字符缓冲流的readLine方法,代码如下:

           BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

这行代码是创建了一个字符缓冲流对象br,这是为了调用BufferedReader中的readLine方法,这行代码相当于下面的这段代码

                InputStream is = System.in ; //标准输入流
InputStreamReader isr = new InputStreamReader(is) ;
BufferedReader br = new BufferedReader(isr) 

创建之后,利用BufferedReader中的readLine方法读取每一行输入的字符

System.out.println("请输入一个字符串:");
String line = br.readLine() ;
System.out.println("您录入的字符串是:"+line);

这样就完成了键盘录入了,如果想要录入其他的类型的数据,那么在最后输出的时候进行类型转换即可。

而System.out也可以用于直接输出打印,方式如下:

       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)) ;

      bw.write("hello") ;

创建一个字符缓冲输出流对象,当用write方法写入的时候,直接将其输入在平台上而不是写入某个文件。

5、RandomAccessFile:随机访问流:此类的实例支持对随机访问文件的读取和写入
  不是实际意义上的流,因为它继承自Object类
   常用的构造方法:
   public RandomAccessFile(String name, String mode)
参数一:指定该文件的路径
参数二:指定的一种模式:常用的模式:"rw",这种模式是可以读也可以写

这里指的不是实际意义上的流,是指他并没有像之前的那些流一样是继承自基本输入输出流的,而是继承自Object类,但是他却可以针对文件进行输入输出操作,也可以算是一种流。

6、 SequenceInputStream:合并流(读数据):表示其他输入流的逻辑串联

这个流的主要作用就是用于多个文件的复制,之前所讲的方法只能将文件单个向单个复制,而这个方法却可以将多个文件一次性复制到一个文件中,他有两种复制文件的方法,一种用于将两个文件复制到另外一个文件,另一个是实现将多个文件复制到另外一个文件中。

方法一:两个文件的复制

public SequenceInputStream(InputStream s1,InputStream s2),这个方法就是将需要的复制的两个文件复制到指定文件中,例如:

InputStream s1 = new FileInputStream("a.txt") ;
InputStream s2 = new FileInputStream("b.txt") ;
//创建合并流对象
SequenceInputStream sis = new SequenceInputStream(s1, s2) ;

                 //封装目的地
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("Copy.java"));
byte[] bys = new byte[1024] ;
int len = 0 ;
while((len = sis.read(bys))!=-1){
//写数据
bos.write(bys, 0, len) ;
bos.flush() ;
}
2、第二种方式是可以真正的复制多个文件的,这里就需要用到之前学到的集合了,Vector集合,他里面有一个public Enumeration<E> elements()方法,可以实现,代码如下:

//创建一个Vector集合,泛型数据类型<InputStream>
Vector<InputStream> v = new Vector<InputStream>() ;

//封装者三个java文件
InputStream s1 = new FileInputStream("DataStreamDemo.java") ;
InputStream s2 = new FileInputStream("ByteArrayStreamDemo.java") ;
InputStream s3 = new FileInputStream("CopyFileDemo.java") ;

//添加到集合中
v.add(s1) ;
v.add(s2) ;
v.add(s3) ;

//调用特有功能:
//public Enumeration<E> elements()
Enumeration<InputStream> en = v.elements() ;
//创建合并刘对象
SequenceInputStream sis = new SequenceInputStream(en) ;
//封装目的地
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("Copy.java"));

//一次读取一个字节数组
byte[] bys = new byte[1024] ;
int len = 0 ;
while((len=sis.read(bys))!=-1){
//写数据
bos.write(bys, 0, len) ;
bos.flush() ;
}

向集合中添加InputStream类型的数据,然后用集合调用 elements()方法,返回一个Enumeration(枚举),将其传入合并流即可

6、ObjectOutputStream和ObjectInputStream 

 序列化流:将对象像流的方式或者网络传输中的数据写数据.对象---->流数据:
 反序列化:将流数据或者网络传输中的流数据读取出来.流数据---->还原成对象:

这个流的主要作用就是将一个对象转换为流数据,需要注意的是此对象的类型需要实现序列化接口Serializeable,不然会出现异常。

7、 Properties:属性集合类,该类继承自Hashtable<K,V>,该类属于Map集合

         是用于读取java中的配置文件。文件内容格式是键值对的形式。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值