1、流的概念、 Java I/O流、 缓冲区、管道、文件操作,I/O 流 & 文件操作,目录,I/O流(字节流、字符流)Java标准输入输出 缓冲区 管道 文件操作,I/O流,输入/输出处理是程序设计中非常重要的一部分,例如从键盘、外部文件输入数据,向屏幕以及外部文件输出,以及在网络上与另一台计算机的数据交互。 Java将输入输出的 数据抽象为“流 (Stream)”,可 以向流中写入数据, 也可以从流中读出 数据。,I/O流,流实际上是一个数据序列。 利用流作为基本输入输出操作的好处是:程序编码独立于所涉及的设备。 Java将输入输出的类及接口放在java.io包中。 除了严格限定,Java a
2、pplet不能使用输入输出功能。 进行I/O操作时可能会发生异常,应当进行处理。,I/O流,“输入”与“输出”是站在“程序”的角度看的:,I/O流,通过流直接进行输入与输出,一般只适用于数据量很少的情况。当传输数据量大的时候,Java提供了“缓冲流”:数据与外设进行交互时,先集中到内存中的一块缓冲区。 Java中提供了大量的类(60多个)以完成输入输出,它们形成了一个合理的自顶向下的逻辑结构。参见:input and output streamReader and Writer,字节流与字符流,java.io包支持两种流:“字节流”和“字符流”。当向字节流中写入数据时,数据是以字节(byte)
3、为单位的序列,与内存中形式相同,不发生任何转换。而字符流则是以字符为单位的数据序列。 Java中实现字节流的基类是InputStream和OutputStream,它们均直接继承自Object类。 InputStream和OutputStream均是抽象类,定义了输入和输出字节的基本操作。它们派生出了大量的具体功能的类。,OutputStream类层次,字节流与字符流,Java中实现字符流的基类是Reader和Writer,它们均直接继承自Object类。 Reader和Writer也是抽象类,定义了输入和输出字符的基本操作。用户不能直接创建其对象,只能通过其子类来创建。,Reader类层次,
4、Writer类层次,InputStream & OutputStream,InputStream有3中方式从流中读入数据:int read() /读一个字节并返回,至流末尾时返回-1int read(byte ) / 将数据读入byte, 返回读的字节数int read( byte, int offset, int length ) 其它方法:void close( ) /关闭流int available() /返回未读的字节数long skip(long n) / 跳过n个字节void mark(int) /标记当前流,并建立int大小缓冲区,InputStream & OutputStre
5、am,OutputStream有3中方式向流中写入数据:void write( int ) / 写一个字节void write(byte ) / 写一个字节数组void write(byte , int offset, int length ) 其它方法:void close( ) /关闭流int flush() /强行写,Reader类的基本方法,int read();/读单个字符 int read(char cbuf);/读字符放入数组中 int read(char cbuf, int offset, int length); /读字符放入数组的指定位置 void close( ) /关闭
6、流。 long skip(long n) / 跳过n个字符 boolean markSupported( ) /测试打开的流是否支持书签 void mark(int) /标记当前流,并建立int大小缓冲区 void reset( ) / 返回标签出 boolean ready() /测试当前流是否准备好进行读,Writer类的基本方法,int write(int c) ; / 写单个字符 int write(char cbuf) ;/ 写字符数组 int write(char cbuf, int offset, int length) ; int write(String str) ; int
7、 write(String str, int offset, int length) ;void close( ) void flush( ) / 强行写,标准数据流,在Java应用程序开始执行时,会自动创建3个标准数据流,供System类使用: System.in、System.out和System.err System.in对象:是InputStream类型的,是连接程序与标准输入设备(通常是键盘)的一个输入流对象,当执行System.in.read()操作时,从键盘得到输入数据。 System.out对象:是PrintStream类型的,是连接程序和标准输出设备(通常是显示器)的一个输出
8、流对象,当执行System.out.println()语句时,数据输出到屏幕上。 System.err对象:标准错误输出流。,从键盘获取数据,System.in 是个已定义好的 InputStream 类型的对象,用以获取键盘输入。但其返回的值是键盘的ASCII码值,须经转换才能显示为字符。,BufferedReader buf= new BufferedReader(new InputStreamReader(System.in); try String str=buf.readLine();System.out.println(“从键盘输入的数据是:“ + str); catch (IOE
9、xception e) e.printStackTrace(); ,推荐的获取键盘输入的方式,Java文件操作,Java 1.4后引入新的文件功能,提高了I/O性能,但增加了复杂性。 新的I/O功能中涉及文件读写方面的有3个对象: 文件流对象:FileInputStream、FileOutputStream. 缓冲区对象:存放与文件进行传输的数据。 通道对象:连接文件,使用一个或多个缓冲区对象以对文件进行读写。,缓冲区对象,通道对象,文件流对象,缓冲区(buffer),缓冲区是内存中的一块区域,用以缓存程序与外设间交互的数据。 Buffer类是定义所以缓冲区类的基类,一个特定的缓冲区可存储一组
10、给定类的数据单元,例如存储byte型值、 char型值、 short型值、 int型值、 long型值、 float型值、 double型值,但不能存储boolean型值。,java.lang.Object,java.nio.Buffer,IntBuffer,ShortBuffer,CharBuffer,ByteBuffer,.,缓冲区,缓冲区的容量:缓冲区存储指定数据单元的最大数,而不是存储的最大字节数。例如IntBuffer型缓冲区容量是存储Int型数值的个数。 缓冲区的位置:要读写的下一个缓冲区单元的下标(首单元下标为0)。 缓冲区的边界:不能读写的第一个单元的下标。,缓冲区,创建缓冲区
11、:ByteBuffer buf = ByteBuffer.allocate(1024);向缓冲区写入数据:buf.put(bytes);/bytes是byte型数据buf.putChar();buf.putInt();. 从缓冲区读出数据:buf.put(bytes);/bytes是byte型数据buf.putChar();buf.putInt();.,通道(channel),java.nio.channels.Channel接口,WritableByteChannel,ReadableByteChannel,ByteChannel接口,FileChannel类,(FileChannel类不能
12、直接实例化其对象,可从其它流类获得。),通道(channel),FileChannel类不能直接实例化其对象,可从其它流类获得。 通道使用完毕后,须关闭:调用其 close()方法。关闭通道只是断开了同文件的连接,并不影响所连接的文件。 通道关闭后则不能再传输数据。判断通道是否处于打开状态,可使用方法isOpen()。,文件,File类主要用于获取磁盘中文件或目录的信息。File类的对象并不打开文件,也不提供任何文件处理功能。然而,java.io包中的其它类经常使用File对象来指定所要操作的文件或目录。File类的实例表示主机文件系统中的文件名或路径名。 File类提供4个构造函数 publ
13、ic File(String name) public File(String pathToName,String name) public File(File directory,String name) public File(URI uri),文件,File类提供了30多种方法以操作File对象: getName()/返回所关联的文件或目录的名称 getPath() ()/返回文件的路径 isAbsolute() ()/是否是绝对路径 list() ()/返回目录下的所有目录和文件名 isFile() ()/是否关联的是文件 isDirectory() ()/是否关联的是目录 delet
14、e() ()/删除所关联的文件或目录 ,文件流,当向磁盘上的物理文件读写数据时,可使用文件流FileInputStream和FileOutputStream。 创建文件流对象(以写文件为例): FileOutputStream outFile = new FileOutputStream (“myFile.txt”); FileOutputStream outFile = new FileOutputStream (“myFile.txt”,true);,文件操作,写文件的示例程序:WriteFile.java 读文件的示例程序:ReadFile.java 复制文件的示例程序:CopyFile.java,