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中的配置文件。文件内容格式是键值对的形式。