Java数据流

在JAVA中,把不同类型的输入输出源抽象为流(Strean),而其中输入或输出的数据称为数据流(data stream)。

数据流的基本概念

数据流是一组有顺序的、有起点和终点的数据字节集合。

数据流可以被分为输入数据流(input stream)和输出数据流(output stream);输入数据流只能读不能写,输出 数据流只能写不能读。

输入数据流

输入数据流是指只能读不能写的数据流,用于向计算机输入数据。

java.io 中的所有输入数据都是抽象类InputStream继承而来,并且实现了其中的所有方法,包括读取数据,标记位置,重置读写指针,获取数据量。从数据流中读取数据时,必须有一个数据源和数据流相连。

输入数据流的主要数据操作方法有:

* int read();
* int read(byte[]b)
* int read(byte []b,int off,int len)

以上三个函数提供访问数据流中的数据的方法,函数所读取的数据都默认为字节类型。其中最简单的是第一个read方法,它向输入流中读一个字节的二进制数据,然后以此数据为低位字节,微商一个全零字节,形成一个0~255之间的整数返回,当输入结束的时候,它会得到-1,标志数据流的结束。第二个read()方法将多个字节读到数组中,填满整个数组。第三个read()方法从输入流中读取长度为len的数据,从数组下标为off的位置开始放置读入的数据,读毕返回读取的字节数。

在实际应用中,为提高效率,读取数据时经常以系统允许的最大数据块长为单位读取。要与BufferedInputStream相连。

  • void close()

当结束对一个数据流的操作时要将其关闭。同时释放与该数据流相关的资源。用到的方法是close()。

  • int available()

该方法返回的是目前可以从字节中读取的字节数。

输出数据流

  • void write(int i)

将字节i 写入数据流中。

  • void write(byte[]b)

将数组中的全部字节写入数据流。

  • void write(byte[]b,int off,int len)

将数组中的第off个字节开始的len个字节写入数据流。

基本直接数据流类

前面提到的InputStream和OutputStream两个类都是抽象类。在实际运用中,我们用到的都是他们的子类。

文件数据流

文件数据流包括FileInputStream和FileOutputStream,这两个类用来进行IO处理,其数据源和终点源都应该是文件。

在使用文件数据流进行I/O操作的时候,类似于FileInputStream的实例对象。如果指定的文件不存在,就会抛出FileNotFoundException异常。对于类FileOutputStream的实例对象,如果指定的文件不存在,就会创建一个新的文件,如果文件存在,那么新写入的内容会覆盖原有数据。

过滤流

过滤流(filter)是另外一种数据流。一个过滤数据流在创建时与一个已经存在的数据流相连。因此在这样的数据流中读取数据时,它提供的是对一个原始输入数据流的内容进行了特定处理的数据。

缓冲区数据流

缓冲区数据流有BufferedInputStream和BufferedOutputStream,他们都属于过滤器数据流,都是在数据流上增加了一个缓冲区。当读写数据时,数据以块为单位先进入缓冲区(块的大小可以自行设置),其后的读写操作则是作用于缓冲区。

in

FileInputStream fis=new FileInputStream("myfile");
inputstream is=new BufferedInputStream(fis);

out

FileOutputStream fos=new FileOutputStream("myfile");
OutputStream os=new BufferedOutputStream(fos);

一般在关闭一个缓冲区输出流之前,应使用flush()方法,强制输出剩余数据,以确保缓冲区内的所有数据全部写入写出。

数据数据流

在前面提到的数据流中,处理的数据都是字节或者字节数组,这是进行数据传输系统默认的数据类型。DataInputStream和DataOutputStream就是这样的两个过滤器,可以用来读写Java基本类型。

对象流

能够输入输出对象的流称为对象流。Java的数据流不仅能对基本数据类型进行操作,而且也提供吧对象写入文件数据流或从文件数据流中读出的功能。

这一功能是通过java.io包中的ObjectInputStream和ObjectOutputStream两个类实现的。

文件的处理

File类

在对一个文件进行I/O操作之前,必须先获得有关这个文件的基本信息。

创建File类的对象之后,可以使用相关方法获取文件的信息。

  • 与文件名相关的方法:
String getName()_获取文件名
String getPath()_获取文件路径
String getAbsolutePath()_获取文件的绝对路径
String getPatent()_获取文件的父目录
boolean renameTo(File newName)_更改文件名
  • 文件测定方法:
boolean exists()_文件对象是否存在
boolean canWrite()_对象是否可写
boolean canRead()_对象是否可读
boolean isFile()_对象文件是否是文件
boolean isDirectory()_对象文件是否是目录
boolean isAbsolute()_文件对象是否是绝对路径
  • 常用文件信息和方法
long lastModified()_获取文件最后修改的时间
long length()_获取文件的长度
boolean delete()_删除文件对象指向的文件
  • 目录工具
boolean mkdir()_创建新目录
boolean mkdirs()_创建新目录(一次性生成多个层次的子目录)
String []list()_列出符合模式的文件名