黑马程序员_Java I/O 技术

来源:互联网 发布:oltp是数据挖掘吗 编辑:程序博客网 时间:2024/05/20 13:36

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


输入/输出处理是程序设计中非常重要的一部分,比如从键盘读取数据、从文件中读取数据或向文件中写数据等等。Java把这些不同类型的输入、输出源抽象为流(stream),用统一接口来表示,从而使程序简单明了。
Jdk 提供了包java.io,其中包括一系列的类来实现输入/输出处理。进行I/O操作时可能会产生I/O异常,属于非运行时异常,应该在程序中处理。

如:
FileNotFoundException, EOFException, IOExceptio


流的概念:

流实际上是一个数据序列。采用流的机制可以使数据有序地输入和输出。

Java有各种各样的执行I/O的流,在java.io包中定义了这些流,其层次结构图如图8.3所示。编写程序时,java.io包必须被执行输入输出的程序导入。

输入输出流可以从以下几个方面进行分类:
从流的方向划分:输入流和输出流;
从流的分工划分:节点流和处理流;
从流的内容划分:字符流和字节流。


一、字符流:

Java中的字符使用的是Unicode编码,每个字符占有两个字节,即16bit。字符流是以16位的Unicode码表示的字符为基本处理单位,进行文本数据
的读写,可以实现Java程序中的内部格式和文本文件、显示输出、键盘输入等外部格式之间的转换。
Reader和Writer是java.io包中所有字符流的抽象基类。提供了输出字符的API及其部分实现。


Reader:
Reader类是处理所有字符流输入类的父类。主要有以下方法:

读取流:

public int read() throws IOException;//读取一个字符,返回值为读取的字符

public int read(char cbuf[]) throws IOException; //读取一系列字符到数组cbuf[]中,返回值为实际读取的字符的数量

public abstract int read(char cbuf[],int off,int len) throws IOException; //读取len个字符,从数组cbuf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现


标记流:

public boolean markSupported(); //判断当前流是否支持做标记
public void mark(int readAheadLimit) throws IOException;//给当前流作标记,最多支持readAheadLimit个字符的回溯。

public void reset() throws IOException; //将当前流重置到做标记处


关闭流

public abstract void close() throws IOException;


Writer
Writer类是处理所有字符流输出类的父类。主要有以下方法:
向输出流写入字符:

public void write(int c) throws IOException;//将整型值c的低16位写入输出流

public void write(char cbuf[]) throws IOException;//将字符数组cbuf写入输出流

public abstract void write(char cbuf[],int off,int len) throws IOException; //将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流 public void write(String str) throws IOException;//将字符串str中的字符写入输出流

public void write(String str,int off,int len) throws IOException;//将字符串str 中从索引off开始处的len个字符写入输出流
flush( ) ;//刷空输出流,并输出所有被缓存的字节。

关闭流 :

public abstract void close() throws IOException;


Reader与Writer的子类:

InputStreamReader  OutputStreamWriter

CharArrayReader  CharArrayWriter

PipedReader  PipedWriter

FilterReader  FilterWriter

BufferedReader  BufferedWriter

StringReader          StringWriter
     ——               PrintWriter


二、字节流:


字节流类是从抽象类 InputStream和OutputStream派生出来的一系列类。字节(byte)为基本处理单位。

InputStream类
InputStream类直接继承Object类。 主要方法如下:
从流中读取数据:

int read( ); //读取一个字节,返回值为所读的字节 ;

int read( byte b[ ] ); //读取多个字节,放置到字节数组b中,通常读取的字节数量为b的长度,返回值为实际读取的字节的数量;

int read( byte b[ ], int off, int len ); //读取len个字节,放置到以下标off开始字节数组b中,返回值为实际读取的字节的数量

int available( );//返回值为流中尚未读取的字节的数量

long skip(long n);//读指针跳过n个字节不读,返回值为实际跳过的字节数量
关闭流:

close( ); //流操作完毕后必须关闭
标记流:

void mark( int readlimit ); //记录当前读指针所在位置,readlimit表示读指针读出readlimit个字节后所标记的指针位置才失效

void reset( );//把读指针重新指向用mark方法所记录的位置

boolean markSupported( );//当前的流是否支持读指针的记录功能


OutputStream主要方法:


输出数据:

void write( int b );//往流中写一个字节b

void write( byte b[ ] ); //往流中写一个字节数组b

void write( byte b[ ], int off, int len ); //把字节数组b中从下标off开始,长度为len的字节写入流中
flush( );//刷空输出流,并输出所有被缓存的字节   由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。
关闭流:

close( );//流操作完毕后必须关闭


InputStream/OutputStream的子类
 FileInputStream    FileOutputStream

PipedInputStream    PipedOutputStream

ByteArrayInputStream    ByteArrayOutputStream

ObjectInputStream    ObjectOutputStream

FilterInputStream    FilterOutputStream

StringBufferInputStream

SequenceInputStream


三、标准输入/输出

在Java应用程序开始执行时(也就是当main方法被执行时),Java自动创建3个与设备关联的流对象:

System.in、System.out,System.err
System.in对象(标准输入流对象)是InputStream类型的,是连接程序与标准输入设备(通常是键盘)的一个输入流对象,当执行System.in.read()操作时,从键盘得到的信息通过System.in流到了程序中。
System.out对象(标准输出流对象)是PrintStream类型的,是连接程序和标准输出设备(通常是显示器)的一个输出流对象,当执行System.out.println()语句时,信息流从程序通过System.out流到了屏幕上。


四、过滤流与流的串接

过滤流在读/写数据的同时可以对数据进行处理,它提供了同步机制,使得某一时刻只有一个线程可以访问一个I/O流,以防止多个线程同时对一个I/O流进行操作所带来的意想不到的结果。
类FilterInputStream和FilterOutputStream分别作为所有过滤输入流和输出流的父类。
作用:给朴素的Input/OutputStream加上一些修饰--某些有用的格式

要使用过滤流,首先必须把它串接到某个输入/输出流上,以达到数据转换的目的。通常在构造方法的参数中指定所要连接的流:

FilterInputStream(InputStream in);
FilterOutputStream(OutputStream out);

过滤流:


BufferedInput/OutputStream
DataInput/OutputStream
LineNumberInputStream
PushBackInputStream
PrintStream


BufferedInput/OutputStream(带缓冲的过滤流):
自动利用内存缓冲,不必每次存取外设,还可在其外面再加包装

new DataInputStream(new BufferedInputStream(
                           new FileInputStream(“File1.dat”) ) );


DataInput/OutputStream(数据流)
对于基本数据类型进行有格式的读写
注意:此处为存储格式,DataOutputStream 与DataInputStream配套使用才有意义。
writeLine - 写入的重要方法,实现了DataInput接口
readUTF/Int/Float/Char/Boolean/Long/Double()
readLine()-读入的重要方法,实现了DataOutput接口
writeUTF/Int/Float/Char/Boolean/Long/Double()

LineNumberInputStream
提供了行控制能力


PushBackInputStream
提供了超前读入与退回的能力


PrintStream
提供了将各种原始数据输出为文本的方法


五、文件流类与文件操作

I/O处理中,最常见的是对文件的操作。java.io包中有关文件处理的类有:File、FileDescriptor、 FileInputStream、
FileOutputStream、RamdomAccessFile和处理字符文件的FileReader、FileWriter;接口有:FilenameFilter。
在进行文件操作时,会产生非运行时异常IOException,必须捕获或声明抛弃。


文件的操作步骤:

对于文件的操作也就是实现对文件的读写,而不管是文本文件还是二进制文件都可采用相同的步骤:
1. 把一个合适的流连接到文件;
2. 使用循环读或写数据;
3. 关闭流。


File类:

File类主要用于获取磁盘中文件或目录的信息。能够创建、删除文件、重命名文件、判断文件的读写权限及是否存在,设置和查询文件的最近修改时间等 。
File类的实例表示主机文件系统中的文件名或路径名,提供4个构造函数。
public File(String name);//指定与File对象关联的文件或目录的名称,name可以包含路径信息及文件或目录名;
public File(String pathToName,String name) ;//使用参数pathToName(绝对路径或相对路径)来定位参数name所指定的文件夹或目录
public File(File directory,String name) ;//使用现有的File对象directory(绝对路径或相对路径)来定位参数name所指定的文件夹或目录
public File(URI uri) ;//使用给定的统一资源定位符URI对象来定位文件


FileInputStream、FileOutputStream类:

FileInputStream和FileOutputStream 分别是InputStream和OutputStream的子类,用于处理文件字节流,每次一个字节。

FileInputStream类
用来打开一个输入文件,若文件不存在,则会产生非运行时例外FileNotFoundException,必须捕获或声明抛弃;

FileOutputStream类
用来打开一个输出文件,若文件不存在,则会创建一个新的文件,否则原文件的内容会被新写入的内容所覆盖。


RandomAccessFile类:

类RandomAccessFile允许对文件内容同时完成读和写操作,直接继承object,并且同时实现了接口DataInput和DataOutput,提供了支持随机文件操作的方法:
readXXX()或writeXXX():
如readInt(), readLine(), writeChar(), writeDouble()等。


六、对象串行化

对象流:

能够输入输出对象的流称为对象流。可以将对象串行化后通过对象输入输出流写入文件或传送到其它地方。在java中,允许可串行化的对象通过对象流进行传输。
类ObjectOutputStream和ObjectInputStream分别继承了接口ObjectOutput和ObjectInput,将数据流功能扩展到可以读写对象 。


串行化的过程:

1. 定义一个可串行化对象
在java.io包中,接口Serializable用来作为实现对象串行化的工具,只有实现了Serializable的类的对象才可以被串行化。

2. 构造对象的输入/输出流

使用ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象。







原创粉丝点击