Java基础4(IO流)

来源:互联网 发布:windows运行放在哪里 编辑:程序博客网 时间:2024/06/05 17:50

一、IO流
数据流(stream):指的是一组由顺序的、有起点和终点的字节序列。数据的存储、传输、识别本来就是以二进制位或字节为单位,但是个

别的抽象封装使得程序员看到的不是原始的字节,如字符、浮点数等,甚至会过滤。

分类:
1.按照传输方向分为输入流和输出流。输入流指数据流从原始数据到程序,输出流是指从程序到目的数据方向的数据流。
2.按数据类型可分为字节流和字符流。字节流的原始称谓就是二进制字节流,就是原始的二进制存储的数据。字符流是程序员所看到的原

始数据被封装后的结果,即逻辑数据,常规情况下使用的是Unicode字符集。

缓冲流:普通的输入和输出流一次只能进行一个字节或字符单位的读写(Java是如此抽象的),为了提高速度和程序效率,Java中还定义

了缓冲流。它有一个缓冲区,程序每次可以进行批量读写,事实上是对缓冲区进行的,当缓冲区不够使用的时候内部进行相应的数据源的

读写。

二、字节流:
字节流首先分为字节输入流(InputStream,简称为输入流)、字节输出流(OutputStream,简称为输出流)。
它们是一组抽象类。主要方法有读、写、定位、获取数据流、关闭数据流等,当然InputStream只能读、OutputStream只能写。
字节输入流的主要子类如下:
ByteArrayInputStream——用于将字节数组转换成流进行操作;
FileInputStream——用于将文件转换成流进行操作;
PipedInputStream——管道输入流,用于线程数据通信的流;
SequenceInputStream——串联输入流,用于流的串联;
FilterInputStream——过滤输入流,用于对输入流进行进一步的包装(装饰),这个类不能直接使用,一般使用它的几个子类,重要的如

DataInputStream(数据输入流,用于浮点等各种类型数据的读取)、BufferedInputStream(缓冲输入流,用于批量读取)。
字节输出流的主要子类名称同上面的类是对应的。
1.InputStream
InputStream类是所有字节输入流的父类,它定义了操作输入流的基本方法,常用方法如下表所示。
 int available()  返回当前输入流中可以读取的有效字节数量
 int read()  读取一个字节,以整型返回,值的范围为0~255,-1表示流结束
 int read(byte[] b)  从输入数据流中读取字节并存入数组b中,返回读到的字节数,最多会填满数组,最少可能是0,表示暂时没有,而

-1表示流结束
 int read(byte[] b, int off, int len)  从输入数据流读取len个字节,并存入数组b的指定位置中,其他含义同上
 void reset()  将当前输入流重新定位到最后一次调用mark() 方法时的位置
 void mark(int readlimit)  在输入数据流中加入标记
 markSupported()  测试输入流中是否支持标记
 void close()  关闭当前输入流,并释放任何与之关联的系统资源。不要等待java的垃圾自动回收功能进行自动关闭。之后的流已

经失去意义,不能使用,下同。
2.OutputSream
OutputStream类是所有字节输出流的父类,它定义了操作输出流的基本操作方法。常用的方法如下表所示。
 void write(int b)  将一个字节数据写入到输出流中
 void write(byte[] b)  将字节数组中的内容写入到输出流中
 void write(byte[] b, int off, int len)  从输入数据流读取len个字节,并存入数组bytes中
 void close()  关闭当前输入流,并释放任何与之关联的系统资源
 void flush()  将流中的缓冲数据完全写入目的地(流只是一种封装,write操作可能因为数据量不足等理由将数据写到流中并不

一定更新到目标介质中,所以有此刷新操作)

三、字符流:
字符流首先分为字符输入流(Reader)和字符输出流(Writer)。它们也是一组抽象类。
具体的非抽象子类有FileReader、FileWriter和 BufferedReader、BufferedWriter。前者总是以字符为单位进行读写,如果要提高效率,可

以使用后者的缓冲流类。当使用特定字符集(Unicode等)的文本文件时候,使用上述类进行读写。
一个Unicode字符包含两个字节,先读写的是高位字节,后读写的是低位字节。
1 Reader
Reader类是所有字符输入流的父类,它定义了操作字符输入流的基本方法。常用方法如下表所示。
 int read()  读入一个字符。若已读到流结尾,则返回值为−1
 int read(char[] c)  从输入数据流中读取字符并存入数组c中,返回读到的字符数,最多会填满数组,最少可能是0,表示暂时没有,而

-1表示流结束
 int read(char[] c, int off, int len)  从输入数据流读取最多len个字符,并存入数组c的指定位置中,其他含义同上
 long skip(long n)  跳过参数n指定的字符数量,并返回所跳过字符的数量
 void close()  关闭该流并释放与之关联的所有资源。
2.Writer
Writer类是所有字符输出流的父类,它定义了操作输出流的基本方法。常用方法如下表所示。
 void write(int c)  将字符c写入输出流
 void write(String str)  将字符串str写入输出流
 void write(char[] cbuf)  将字符数组的数据写入到字符输出流
 int write(String str, int off, int len)  将将字符串的部分数据写入到字符输出流
 int write(char[] c, int off, int len)  将字符数组的部分数据写入到字符输出流
 void flush()  刷新当前输出流,并强制写入所有缓冲的字符数据
 void close()  向输出流写入缓冲区的数据,然后关闭当前输出流,并释放所有与当前输出流有关的系统资源

四、File类:
1、文件目录操作类File
File类不属于流,它为文件整体与目录级操作提供了支持,在Java中目录也是文件,File类可以用来解决诸如文件或目录的创建、改名、删

除、获得相关信息如名称、路径、长度、读写属性等。
File类的主要构造方法如下:
public File(String pathname)
通过指定的文件路径字符串来创建一个File实例对象。
public File(String parent, String child)
根据指定的父路径字符串和子路径字符串创建File实例对象。
public File(File parent, String child)
根据指定的File类型父路径和子路径字符串创建File实例对象。
以上的几个构造方法创建对象时候并不要求有实际的文件或目录存在,可以理解成一个File对象表示的是要操作的一个路径,参数可以指定

到文件名。

2、File类的主要方法
File类包含了文件和文件夹的多种属性和操作方法。常用的方法如下表所示。

 String getName() 获取文件的名字
 String getParent() 获取文件的父路径字符串
 String getPath() 获取文件的相对路径字符串
 String getAbsolutePath() 获取文件的绝对路径字符串
 boolean exists() 判断文件或文件夹是否存在
 boolean canRead() 判断文件是否可读
 boolean isFile() 判断File对象是否是文件
 boolean canWrite() 判断文件是否可被写入
 boolean isDirectory() 判断File对象是不是目录
 boolean isAbsolute() 判断是不是绝对路径
 boolean isHidden() 判断文件是否是隐藏文件
 boolean delete() 删除文件或文件夹,如果删除成功返回结果为true
 boolean mkdir() 创建文件夹,如果创建成功返回结果为true
 boolean mkdirs() 创建路径中包含的所有父文件夹和子文件夹,如果所有父文件夹和子文件夹都成功创建,返回结果为true
 boolean createNewFile() 创建一个新文件
 long length() 获取文件的长度
 long lastModified() 获取文件的最后修改日期
 String[] list() 获取目录类型File对象的内部文件或子目录的名字列表
 File[] listFiles() 获取目录类型File对象的内部文件或子目录的File型列表

五、文件流
1 FileInputSteam
文件字节输入流FileInputStream类是InputStream类的子类,它实现了文件的字节方式读取,是进行物理级文件数据操作的类。
类的基本读取方法等是从InputStream类继承并重写的,需要注意的是,读操作时候相当于有一个指针在文件上进行顺序移动,几乎所有

的流操作方法声明中都有异常抛出声明,而且这些异常必须进行捕获处理。
这里只解释一下构造方法:
public FileInputStream(String name) throws FileNotFountException
public FileInputStream(File   name) throws FileNotFountException
以上的两个典型构造方法分别利用文件名字符串或File对象创建字节文件输入流,如果发生某种原因导致失败,则抛出相应的异常。如果成

功,初始定位于文件开头。
2.FileOutptSream
文件字节输出流FileOutputStream类是OutputStream类的子类,它实现了文件的字节方式写入,是进行物理级文件数据操作的类。
类的基本写入方法等是从OutputStream类继承并重写的,这里只解释一下构造方法:
public FileOutputStream(String name) throws FileNotFountException
public FileOutputStream(File   name) throws FileNotFountException
public FileOutputStream(String name, boolean append) throws FileNotFountException
以上的几个典型构造方法分别利用文件名字符串或File对象创建字节文件输出流,如果发生某种原因导致失败,则抛出相应的异常。如果文

件不存在,则将创建一个文件。
如果成功,前两者初始定位于文件开头(原有文件内容被清除),第三个方法定位于文件末尾(追加方式写入)。
3 FileReader和FileWriter
此二者分别对应文件的字符输入流和字符输出流,同样的,主要关心构造方法:
FileReader(String fileName) throws FileNotFoundException
FileReader(File file) throws FileNotFoundException
FileWriter(String fileName) throws IOException
FileWriter(File file) throws IOException
FileWriter(String fileName, boolean append) throws IOException
FileWriter(File file, boolean append) throws IOException

六、随机访问文件类:RandomAccessFile
标准的字节流类只支持顺序访问和单一读/写操作,随机访问文件类是对字节流类的补充,能同时进行读和写操作。RandomAccessFile是一

个独立的类,不依赖于字节流。
RandomAccessFile类的构造方法如下:
RandomAccessFile (String name, String mode) throws FileNotFountException
RandomAccessFile (File file, String mode) throws FileNotFountException
其中第一个参数对应文件,第二个参数mode指定对文件的访问模式,它可以是r、rw、rws或rwd,r代表只读, rw代表可读写,后两者代

表可共享同步写入,rwd主要适合于高速的文件操作。
RandomAccessFile类常用的方法如下表所示:
 方 法 名 称  功 能 描 述
 length()  获取文件的长度
 seek(long pos)  设置文件指针位置
 readByte()  从文件中读取一个字节
 readChar()  从文件中读取一个字符
 readInt()  从文件中读取一个int值
 readLine()  从文件中读取一个文本行
 readBoolean()  从文件中读取一个布尔值
 readUTF()  从文件中读取一个UTF字符串
 write(byte bytes[])  把bytes.length个字节写到文件
 writeInt(int v)  向文件中写入一个int值
 writeChars(String str)  向文件中写入一个作为字符数据的字符串
 writeUTF(String str)  向文件中写入一个UTF字符串
 close()  关闭文件

七、其他数据流
这里介绍一些其他流,一般地,这些流是建立在对基本流对象的包装上的,也就是说构造方法使用另一个流作为参数。
如果一个流a是由另一个流创建的,如过滤、串联等,关闭了流a,原始的流也自动关闭。
1 DataInputSteam和DataOutptSream
过滤器流(FilterStream)是为某种目的过滤字节或字符的数据流。基本输入流提供的读取方法,只能用来读取字节或字符。而过滤器流能

够读取整数值、双精度值或字符串等。但需要一个过滤器类来包装输入流。
DataInputStream 和DataOutputStream类分别是FilterInputStream和FilterOutputStream类的子类。它们分别实现了DataInput和

DataOutput接口,该接口中定义了独立于具体机器的带格式的读写操作,从而可以实现对Java中的不同基本类型数据的读写。
例如,从文件中读取数据。可以先创建一个FileInputStream类的对象,然后把该类传递给一个DataInputStream的构造方法。
fis = new FileInputStream("Example.txt");
DataInputStream dis=new DataInputStream(fis);
int i=dis.readInt();
dis.close();
如果要把数据写入文件。可以先创建一个FileOutputStream类的对象,然后把该类传递给一个DataOutputStream的构造方法。
FileOutputStream  fos=new FileOutputStream("Example.txt");
DataOutputStream  dos=new DataOutputStream(fos);
dos.writeBytes("Example");
dos.close();
2 BufferedReader和BufferedWriter
BufferedReader类是Reader类的子类,使用该类可以以行为单位读取数据。
BufferedWriter类是Writer类的子类,该类可以以行为单位写入数据。
BufferedReader类的主要构造方法如下,其中sz表示缓冲区长度,BufferedWriter类似:
BufferedReader(Reader in)
BufferedReader(Reader in, int sz)
BufferedReader类中的读行数据方法为:
public String readLine() throws IOException
BufferedWriter类中的写行方法为:
public void newLine() throws IOException
3 标准I/O和打印流PrintStream
PrintStream是打印输出流,它可以使用print或println直接输出各种类型的数据。创建打印输出流常用的构造方法为:
PrintStream(OutputStream out)
该构造方法使用OutputStream类的对象,创建一个PrintStream对象。
System类中的静态对象out就属于打印流,它表示标准输出设备。

System类中的in是静态变量,类型是InputStream。用于获取用户输入的典型语法为:
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
try {
     String str=br.readLine();
     br.close();
} catch (IOException e) {
     e.printStackTrace();
}

4 对象序列化和对象输入输出流
使用对象输入输出流实现对象序列化可以直接存取对象。
将对象存入一个流称为序列化。而从一个流将对象读出称为反序列化。
ObjectInput接口与ObjectOutput接口分别继承了DataInput接口和DataOutput接口,提供了对基本数据类型和对象序列化的方法。使用

对象序列化功能可以非常方便地将对象写入输出流,或者从输入流读取对象。ObjectInput接口与ObjectOutput接口中定义的对象反序列

化和序列化方法如下
(1)readObject()
所谓反序列化就是从输入流中获取序列化的对象数据,用这些数据生成新的Java对象。该方法定义在ObjectInput接口中,由

ObjectInputStream类实现。
Object object=readObject()
(2)writeObject ()
序列化就是将对象写入到输出流,这个输出流可以是文件输出流、网络输出流以及其他数据输出流。该方法定义在ObjectOutput接口中,

由ObjectOutputStream类实现。
writeObject(Object);
注意:使用readObject()方法获取的序列化对象是Object类型的,必须通过强制类型转换才能使用。

Java提供了ObjectInputStream和ObjectOutputStream类读取和保存对象,它们分别是对象输入流和对象输出流。ObjectInputStream类

和ObjectOutputStream类是InputStream类和OutputStream类的子类,继承了它们所有的方法。
创建ObjectInputStream 类的构造方法为:
ObjectInputStream(InputStream in)
使用对象输入流读取一个对象的示例如下:
FileInputStream fis=new FileInputStream("Example.txt");
ObjectInputStream ois=new ObjectInputStream(fis);
Object o=ois.readObject();
ois.close();

创建ObjectOutputStream类的构造方法为:
ObjectOutputStream(OutputStream out)
使用对象输入流写入一个对象的示例如下:
FileOutputStream fos=new FileOutputStream("Example.txt");
ObjectOutputStream obs=new ObjectOutputStream(fos);
obs.writeObject("Example");
obs.close();

原创粉丝点击