Presentation is loading. Please wait.

Presentation is loading. Please wait.

第九章 Java输入输出系统.

Similar presentations


Presentation on theme: "第九章 Java输入输出系统."— Presentation transcript:

1 第九章 Java输入输出系统

2 本章目录 流的基本概念 1 6 字节流 2 7 字符流 3 过滤流 8 File类 4 文件的随机访问 9
FileInputStream类和FileOutputStream类 6 字节流 2 FileReader类和FileWriter类 7 字符流 3 过滤流 8 File类 4 文件的随机访问 9 System.in和System.out对象 5 案例分析:多种流的实现 10

3 教学目标 掌握流的基本概念 掌握Java中各种常用输入/输出流的基本用法 能够熟练地编写应用程序解决文件的读写问题。

4 教学重点 字节流与字符流的区别 File类的使用 过滤流的合理使用 文件的随机访问操作

5 9.1 流的基本概念 java.io包: 支持流的输入输出 十分巨大,定义了大约60个类,包含大量方法 要了解更多的信息参看API文档
9.1 流的基本概念 java.io包: 支持流的输入输出 十分巨大,定义了大约60个类,包含大量方法 要了解更多的信息参看API文档 在Java1.3及其以后的版本中,读写文件的唯一手段就是使用流。

6 9.1 流的基本概念 流(stream): 是输入和输出设备的一种抽象表示,这些设备是数据源或数据终点。
9.1 流的基本概念 流(stream): 是输入和输出设备的一种抽象表示,这些设备是数据源或数据终点。 可以向流中写入数据,也可以从流中读出数据。 大家可以把流想象为流入自己程序或从自己程序中流出的字节序列。

7 9.1 流的基本概念 为什么引入流作为的基本输入输出操作? 让实现这些操作的程序编码独立于所涉及的设备。这样做的好处有两点:
9.1 流的基本概念 为什么引入流作为的基本输入输出操作? 让实现这些操作的程序编码独立于所涉及的设备。这样做的好处有两点: 不必担心各种设备的具体工作机制,对于它们的管理均在幕后进行。 用户的程序可以适用于各种输入输出设备,改变输入输出设备时不用改写程序编码。

8 9.1 流的基本概念 流式输入输出的特点 每个数据都必须等待排在它前面的数据读入或送出之后才能被读写;
9.1 流的基本概念 流式输入输出的特点 每个数据都必须等待排在它前面的数据读入或送出之后才能被读写; 每次读写操作处理的都是序列中剩余的未读写数据中的第一个,而不能随意选择输入输出的位置。

9 9.1 流的基本概念 文件 程序 终端 网络端点 数据流 文件,字符串 存储区

10 9.1 流的基本概念 Java中有两种基本的流 (1)输入流:打开流 → 当流中还有数据时执行读操作 → 关闭流。
9.1 流的基本概念 Java中有两种基本的流 (1)输入流:打开流 → 当流中还有数据时执行读操作 → 关闭流。 (2)输出流:打开流 → 当有数据需要输出时执行写操作 → 关闭流。

11 9.1 流的基本概念 输出流:从计算机流向外设的数据序列,即把数据写入流时,该流称为输出流。 输出流可以通往任何可以传输字节序列的设备,
9.1 流的基本概念 输出流:从计算机流向外设的数据序列,即把数据写入流时,该流称为输出流。 输出流可以通往任何可以传输字节序列的设备, 例如硬盘上的文件,或连接用户系统至远程系统的电话线路。输出流也可以通向显示器,但这会大大限制其真正的功能。 输入流:从外设流入计算机的数据序列;

12 9.1 流的基本概念 数据 数据 程序 输入流 输出流 显示器 键盘

13 9.1 流的基本概念 1. 输入流(Inputstream) 读数据的逻辑为: open a stream
while more information read information close the stream 9.1 流的基本概念 1. 输入流(Inputstream) 通过打开一个到数据源(文件、内存或网络端口上的数据)的输入流,程序可以从数据源上顺序读取数据。

14 9.1 流的基本概念 2. 输出流(Outputstream) 通过打开一个到目标的输出流,程序可以向外部目标顺序写数据

15 9.1 流的基本概念 2. 输出流 (Outputstream)
9.1 流的基本概念 2. 输出流 (Outputstream) 文件,当向其中写数据时,它就是一个输出流;当从其中读取数据时,它就是一个输入流。 键盘只是一个输入流, 屏幕只是一个输出流。 写数据的逻辑为: open a stream while more information write information close the stream

16 9.1 流的基本概念 另外,根据流中数据单位的不同,可将流分为字节流和字符流。 (1)字节流:流中数据以8位字节为单元进行读写。
9.1 流的基本概念 另外,根据流中数据单位的不同,可将流分为字节流和字符流。 (1)字节流:流中数据以8位字节为单元进行读写。 (2)字符流:流中数据以16位字符为单位进行读写。

17 9.1 流的基本概念 java.io包支持两种类型的流:
9.1 流的基本概念 java.io包支持两种类型的流: 字符流类(Character Streams) 字符流类用于向字符流读写16位二进制字符。  字节流类(Byte Streams) 字节流类用于向字节流读写8位二进制的字节。一般地,字节流类主要用于读写诸如图象或声音等的二进制数据。

18 9.1 流的基本概念 java.io中的基本流类: 说明:它们是抽象类,不能直接创建对象。 Byte Streams
9.1 流的基本概念 java.io中的基本流类: 说明:它们是抽象类,不能直接创建对象。 Byte Streams Character Streams InputStream Reader OutputStream Writer

19 9.2 字节流 InputStream类和OutputStream类是字节流的两个顶层父类。它们提供了输入流类与输出流类的通用API。
9.2 字节流 InputStream类和OutputStream类是字节流的两个顶层父类。它们提供了输入流类与输出流类的通用API。 字节流一般用于读写二进制数据,例如图像和声音数据。 有两个字节流ObjectInputStream和ObjectOutputStream是用来实现对象的串行化,即对象的输入输出。

20 9.2 字节流 1. InputStream类

21 9.2 字节流 InputStream类的主要方法 read():从流中读入数据 skip():跳过流中若干字节数
9.2 字节流 InputStream类的主要方法 read():从流中读入数据 skip():跳过流中若干字节数 available():返回流中可用字节数 mark():在流中标记一个位置 reset():返回标记过的位置 markSupport():是否支持标记和复位操作 close():关闭流

22 ByteArrayInputStream
9.2 字节流 InputStream SequenceInputStream AudioInputStream 用于读取流序列 用于读取音频数据 ByteArrayInputStream FileInputStream 用于读取字节数组 用于读取文件中的数据 PipedInputStream 用于读取管道流 ObjectInputStream FilterInputStream 用于读取流中的对象 用于过滤现有流的输入

23 9.2 字节流 FilterInputStream类有9个直接子类,它们提供对输入流数据过滤或转换的更多的特殊方式。
9.2 字节流 FilterInputStream类有9个直接子类,它们提供对输入流数据过滤或转换的更多的特殊方式。 BufferedInputStream DataInputStream CheckedInputStream CipherInputStream DigestInputStream InflaterInputStream LineNumberInputStream ProgressMonitorInputStream PushbackInputStream

24 输9.2 字节流 BufferedInputStream
输9.2 字节流 BufferedInputStream 把流包装到BufferedInputStream对象中的效果是将基本数据流缓冲入内存,使得一次可以从流中读入大块数据(其最大值取决于缓冲区的大小),然后让read方法可以直接从内存缓冲区中读取数据,当缓冲区为空时,仅从基本数据流执行一次真正的读操作。 BufferedInputStream keyboard = new BufferedInputStream(System.in);

25 9.2 字节流 2.OutputSteam类

26 9.2 字节流 write(int b):将一个整数输出到流中(只输出低位字节,为抽象方法)
9.2 字节流 write(int b):将一个整数输出到流中(只输出低位字节,为抽象方法) write(byte b[]):将字节数组中的数据输出到流中 write(byte b[], int off, int len):将数组b中从off指定的位置开始,长度为len的数据输出到流中 flush():刷空输出流,并将缓冲区中的数据强制送出 close():关闭流

27 ByteArrayOutputStream
9.2 字节流 OutputStream ByteArrayOutputStream FileOutputStream 用于向字节数组写 用于向文件写 PipedOutputStream ObjectOutputStream 用于向流管道写 用于将对象写入流 FilterOutputStream 用于过滤现有流的输出

28 9.3 字符流 字符流能够处理Unicode字符集中所有的字符,而字节流限于处理ISO-Latin-1的8位字节
9.3 字符流 字符流能够处理Unicode字符集中所有的字符,而字节流限于处理ISO-Latin-1的8位字节 字符流采用了统一的编码标准,可国际化 使用字符流来读写文本类数据。 Reader类和Writer类是java.io包中两个字符流类的顶层抽象父类。

29 9.3 字符流 Reader和Writer都是抽象类。
9.3 字符流 Reader和Writer都是抽象类。 Reader和Writer对象通常使用InputStream或OutputStream对象来创建 InputStream或OutputStream对象封装了与最终数据源或数据终点这种外设的连接。

30 9.3 字符流 Reader InputStreamReader PipedReader 用于读取字符流 用于读取PipedWriter
9.3 字符流 Reader InputStreamReader PipedReader 用于读取字符流 用于读取PipedWriter BufferedReader CharArrayReader 用于缓冲其他Readers类 用于读取字符数组 FilterReader StringReader 用于读取过滤后的流 用于读取字符串

31 9.3 字符流 用于像读取字符流一样读取二进制输入流的具体类是InputStreamReader。
9.3 字符流 用于像读取字符流一样读取二进制输入流的具体类是InputStreamReader。 InputStreamReader类定义了3种read()方法,这些方法将从基本流中读取一个或多个字节,并且使用默认转换方式将它们由本地字符编码转换为Unicode码后,再将它们返回。 InputStreamReader keyboard = new InputStreamReader(System.in);

32 9.3 字符流 如果使用BufferedReader对象来缓冲数据流,则读取工作的效率会有所提高。
9.3 字符流 如果使用BufferedReader对象来缓冲数据流,则读取工作的效率会有所提高。 CharArrayReader对象创建于数组,并且允许用户从数组读取数据,就像是从字符输入流中读取数据一样。 StringReader对象类实质上做相同的事情,只是处理的是String对象。 BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));

33 9.3 字符流 Writer PipedWriter OutputStreamWriter 用于向PipedReader写 用于写字符流
9.3 字符流 Writer PipedWriter OutputStreamWriter 用于向PipedReader写 用于写字符流 CharArrayWriter BufferedWriter 用于向字符数组写 用于缓冲其他Writers类 StringWriter PrintWriter 用于向字符串写 用于写格式化数据 FilterWriter 用于写过滤后的流

34 9.3 字符流 OutputStreamWriter类将字符写入基本二进制流中,它有一个子类FileWriter,FileWriter将字符写入封装文件的流。 PrintWriter类与打印没有什么联系。PrintWriter类定义了用于将二进制数格式化为字符,并且把它写入数据流的方法。 StringWriter类与CharArrayWriter类是用于将字符数据写入StringBuffer对象或char[]型数组。通常这些类用来执行数据转换,使得转换结果可以从基础数组或字符串中得到。

35 9.3 字符流 StringWriter strWriter = new StringWriter(); PrintWriter writer = new PrintWriter(strWriter); double value = ; writer.println(value); StringBuffer str = strWriter.getBuffer(); 注意:PrintWriter对象所作的格式化无助于让输出行中的各项内容按列对齐排列。如果希望产生特定的格式输出,必须自己去编写代码。

36 9.4 File类 File类功能: 得到文件或目录的描述信息,包括文件名称、所在目录、可读性、可写性、长度和文件的最后修改时间等
可以生成新的目录 改变文件名 删除文件 列出一个目录中所有的文件或与某个模式相匹配的文件等。

37 9.4 File类 File类的构造方法: (1)public File (String path)
参数path是包含目录和文件名的字符串,Java把目录看作一种特殊的文件,因此该字符串可以没有文件名,这时若调用方法isFile()将返回false,说明File对象是目录而不是文件。 (2)public File (String path,String name) path是目录路径(父目录),name可包含目录和文件名(相对于父目录)。 (3)public File (File dir,String name) dir是一个文件对象(父目录),child可包含目录和文件名(相对于父目录)。

38 9.4 File类 File类的构造方法: (1)public File (String path)
参数path是包含目录和文件名的字符串,Java把目录看作一种特殊的文件,因此该字符串可以没有文件名,这时若调用方法isFile()将返回false,说明File对象是目录而不是文件。 (2)public File (String path,String name) path是目录路径(父目录),name可包含目录和文件名(相对于父目录)。 (3)public File (File dir,String name) dir是一个文件对象(父目录),child可包含目录和文件名(相对于父目录)。

39 9.4 File类 例如: File f1 = new File("D:/Java");
File f2 = new File("D:/Java","test.txt"); File f3 = new File(f1,"test.txt"); File f4 = new File("file:///D:/Java/test.txt")

40 9.4 File类 方 法 说 明 public String getName() 返回文件名。
方 法 说 明 public String getName() 返回文件名。 public String getPath() 返回文件路径。 public String getAbsolutePath() 返回文件绝对路径。 public String getParent() 返回文件的父目录。 public boolean exists() 判断文件是否存在。 public boolean canWrite() 判断文件是否可写。 public boolean canRead() 判断文件是否可读。 public boolean isFile() 判断对象是否是文件。 public boolean isDirectory() 判断对象是否是目录。 public native boolean isAbsolute() 如果文件名为绝对名,则返回真。

41 9.4 File类 方 法 说 明 public long lastModified() 返回文件最后修改时间。
方 法 说 明 public long lastModified() 返回文件最后修改时间。 public long length() 返回文件长度。 public boolean mkdir() 创建目录。 public boolean renameTo(File dest) 重命名文件。 public boolean mkdirs() 创建目录及子目录。 public String[] list() 列出目录下的所有文件和目录。 public String[] list(FilenameFilter filter) 列出目录下的指定文件。 public boolean delete() 删除文件对象。 public int hashCode() 为文件创建散列代码。 public boolean equals(Object obj) 判断是否同对象obj相等。 public String toString() 返回文件对象的字符串描述。

42 9.4 File类 【例9-1】输入一个文件名,显示该文件的相关属性信息。 import java.io.*;
public class FileClass { public static void main(String[] args) { System.out.println("enter file name:"); char c; StringBuffer buf=new StringBuffer() ; try { while( (c = (char)System.in.read() ) != '\n') buf.append(c); //将输入的字符加到buf中,以回车符结尾 } catch(java.io.IOException e) { System.out.println("Error:"+e.toString( ) ); } File file = new File(buf.toString( ).trim( ) ); //创建File类的file对象 if ( file.exists( ) ) { //如果文件在当前目录存在 System.out.println("File Name:"+file.getName( ) ); //显示文件的文件名 System.out.println("path:"+file.getPath( ) ); //显示文件的路径 System.out.println("Abs.path:"+file.getAbsolutePath( ) ); //显示文件的绝对路径 System.out.println("Writeable:"+file.canWrite( ) ); //显示文件是否可写 System.out.println("Readlable:"+file.canRead( ) ); // 显示文件是否可读 System.out.println("Length:"+(file.length())+"B"); //显示文件的大小 else //如果文件不在当前目录 System.out.println("Sorry,file not found."); //显示文件没有找到的提示消息

43 9.5 System.in和System.out对象
标准输入输出指在字符方式下程序与系统进行交互的方式,分为以下3 种: (1)标准输入stdin ,对象是键盘。 (2)标准输出stdout ,对象是屏幕。 (3)标准错误输出stderr ,对象也是屏幕。 Java 通过系统类System 实现标准输入输出的功能,定义了3 个流变量,分别为in、out 和err。 可以直接通过System 类进行调用。

44 9.5 System.in和System.out对象
1.标准输入 read()方法: 这个方法在InputStream类中是抽象的,因此它必须定义在子类中。 此方法以int型返回流的下一个可读字节。 如果到达流的末尾,则方法的返回值为-1。 如果I/O发生错误,将抛出IOException类型的异常。

45 9.5 System.in和System.out对象
2. 标准输出 Java 的标准输出System . out 是打印输出流PrintStream 类的对象。PrintStrearn类定义了在屏幕上显示不同类型数据的方法print ( )和println( )。 (1)println( )方法 println ( )方法可输出多种不同类型的变量或对象,包括boolean 、double 、float 、int 、long 、char 、字符数组以及Object 类型的对象。 (2)print( )方法 print ( )方法输出后不换行

46 9.5 System.in和System.out对象
【例9-2】输入一个字符,在屏幕上显示该字符。 import java.io.*; public class CharInput1{ public static void main(String[] args)throws IOException{ //必须做异常处理 int a; try{ System.out.print("请输入一个字符:"); a=System.in.read(); System.out.println("你输入的字符是"+(char)a); }catch(IOException e){ System.out.println("错误信息为:"+e.toString()); } 9.5 System.in和System.out对象

47 9.5 System.in和System.out对象
【例9-3】输入一行字符,在屏幕上显示该行字符。 import java.io.*; public class CharInput2 { public static void main(String[] args){ byte buffer[]=new byte[255]; System.out.println("请在下面输入一行字符:"); try{ System.in.read(buffer,0,255); // System.in.read抛出异常 }catch(Exception e) { //捕获异常并处理 System.out.println("读取输入字符出错,错误信息为:"+e.toString()); } System.out.println("您刚才输入的一行字符为:"); String inputStr=new String(buffer); System.out.println(inputStr); 9.5 System.in和System.out对象

48 9.6 FileInputStream类和FileOutputStream类
1.FilelnputStream FilelnputStream 用于顺序访问本地文件,从超类继承read ( )、close( ) 等方法对文件进行操作,不支持mark( ) 方法和reset( )方法。 构造方法: (1)FilelnputStream(String filepath ) (2)FilelnputStream(File fileobj) 例: FilelnputStream f1 = new FilelnputStream("aa.Java") File f=new File("aa.Java") FilelnputStream f2 = new FilelnputStream ( f ) ;

49 9.6 FileInputStream类和FileOutputStream类
方 法 说 明 int available() 返回可读入的字节数。 void close() 关闭输入流,并释放任何与该流有关的资源。 protected void finalize() 当读到无用信息时,关闭该流。 FileDescriptor get FD() 返回与该流有关的文件描述符(即文件的完整路径)。 int read() 从输入流中读取一个字节的数据。 int read(byte[ ]b) 将数据读入到一个字节数组b[ ]中。 int read(byte[ ]b,int off,int len) 将len个字节的数据读入到一个字节型数组b[ ]中,从下标off开始存放,并返回实际读入的字节数。 long skip(long n) 跳过输入流上的n个字节。

50 9.6 FileInputStream类和FileOutputStream类
Fileoutputstream 用于向一个文本文件写数据。它从超类中继承write( )、close( ) 等方法。 构造方法: (1)FileOutputStream (String filepath) (2)FileOutputStream (File fileobj) (3)FileOutputStream(String filepath , boolean append ) (4)FileOutputStream (File fileobj , boolean append )

51 9.6 FileInputStream类和FileOutputStream类
方 法 说 明 void close() 关闭输出流,并释放任何与该流有关的资源。 void finalize() 当写到无用信息时,关闭该流。 void write(int b) 将字节数据b[ ]写到输出流中。 void write(byte[ ]b) 将一个字节数组b[ ]中的数据写到输出流中。 long skip(long n) 跳过输出流上的n个字节。

52 【例9-4】建立两个文件file1. txt和file2. txt,对文件file1
【例9-4】建立两个文件file1.txt和file2.txt,对文件file1.txt输入内容“Hello World!”,并将其内容复制给file2.txt。 import java.io.*; class FilesCopy { public static void main(String[] args) { try{ FileOutputStream fos1 = new FileOutputStream("file1.txt"); //创建FileOutputStream对象 int b; System.out.println("请输入字符串:"); while((b =System.in.read())!= '\n') fos1.write(b); //将字符写入到输出流中 fos1.close(); //关闭输出流 FileInputStream fis = new FileInputStream("file1.txt"); //创建FileInputStream对象 FileOutputStream fos = new FileOutputStream("file2.txt"); int c; while((c = fis.read())!= -1) fos.write(c); //将一个字节写入到输出流中 fis.close(); //关闭输入流 fos.close(); //关闭输出流 System.out.println("成功保存并复制!"); } catch(FileNotFoundException e){ System.out.println("FileStreamsTest: "+e); } catch(IOException e) { } 文件字节流

53 9.7 FileReader类和FileWriter类
FileReader 类是一个以字符方式读取文件内容的Reader 类的子类,最常用构造方法: FileReader ( String filePath ) FileReader ( File fileobj) FileWriter 类是一个以字符方式写文件内容的Writer类的子类,最常用构造方法如下: FileWriter ( String filePath ) FileWriter ( String filePath , boolean append ) FileWriter ( File fileobj )

54 9.8 过滤流 Java对I/O访问还提供了同步处理机制,这就是过滤流。保证某时刻只有一个线程访问一个I/O流。
9.8 过滤流 Java对I/O访问还提供了同步处理机制,这就是过滤流。保证某时刻只有一个线程访问一个I/O流。 过滤流主要是由FilterInputStream和FilterOutputStream抽象类实现,由这两个抽象类可以派生出一些过滤子类,重写父类FilterInputStream和FilterOutputStream的所有方法。

55 9.8 过滤流 例如,BufferedInputStream可以对任何种类的输入流进行带缓冲区的封装以达到性能的改善(可减少程序I/O操作次数,提高程序执行效率)。 过滤流与节点流的连接是通过在过滤流的构造方法中指定入口参数,即节点流来实现的。 例如: FileInputStream in=new FileInputStream( “text”); BufferedInputStream bufin=new BufferedInputStream(in); 首先把过滤流连接到某个I/O上,再通过构造方法的参数去指定连接的I/O流。

56 9.8 过滤流 BufferedInputStream类/BufferedOutputStream类
9.8 过滤流 BufferedInputStream类/BufferedOutputStream类 为了提供数据的传输效率,为一个流配备缓冲区(buffer),成为缓冲流。缓冲流输入输出是一个非常普通的性能优化。 BufferedInputStream类构造方法: (1)public BufferedInputStream(InputStream in) (2)public BufferedInputStream(InputStream in,int size) BufferedOutputStream类构造方法: (1)public BufferedOutputStream(OutputStream out) (2)public BufferedOutputStream(OutputStream out,int size)

57 9.8 过滤流 DataInputStream类和DataOutputStream类
9.8 过滤流 DataInputStream类和DataOutputStream类 DataInputStream:从已定义的节点输入流中读取Java基本数据类型的数据,如布尔型数、整型数、浮点数等,再生成一个数据输入流。 DataOutputStream:将Java基本数据类型数据写到一个数据输出流中。 构造方法如下: (1)pubilc DataInputStream(InputStream in):创建一个新的DataInputStream,该流从输入流in读取数据。 (2)pubilc DataOutputStream(OutputStream out):在输出流out上创建一个新的DataOutputStream,使DataOutputStream的输出数据能够输出到输出流out中。

58 9.8 过滤流 DataInputStream类提供的读取数据的部分方法如下: byte readByte( )
9.8 过滤流 DataInputStream类提供的读取数据的部分方法如下: byte readByte( ) boolean readBoolean( ) double readDouble( ) float readFloat( ) char readChar( ) short readshort( ) long readLong( ) int readInt( )

59 9.8 过滤流 DataOutputStream类包含与DataInputStream类读方法相对应的写方法,部分方法如下:
9.8 过滤流 DataOutputStream类包含与DataInputStream类读方法相对应的写方法,部分方法如下: void writeByte(byte) void writeBoolean(boolean) void writeLong( long ) void writeChar(char) void writeDouble(double) void writeFloat( float) void writeshort(short) void writeInt ( int) void writeBytes(String) void writeChars(String )

60 9.8 过滤流 【例9-5】使用过滤缓冲输出流提高输出效率。 import java.io.*;
public class BufferDemo{ public static void main (String[] args){ try{ byte b[]={49,50,51,52,53,,5,66,67,68,69,97,98,99,100,101}; FileOutputStream fos=new FileOutputStream("one.dat",true); BufferedOutputStream bos=new bufferedOutputStream(fos); //定义一个数据缓冲输出流 DataOutputStream dos=new DataOutputStream(bos); //将字节数组的数据输出到缓冲区 dos.write(b,0,b.length); dos.flush(); } Catch(IOException e) { System.out.println(e.toString()); 9.8 过滤流

61 9.9 文件的随机访问 RandomAccessFile类 可实现对文件的随机读写操作。
9.9 文件的随机访问 RandomAccessFile类 可实现对文件的随机读写操作。 在Java. io 包中,但与包中的输入/输出流类不相关,它不是从InputStream 类或OutputStream 类派生的。 实现了Datalnput 和Dataoutput 接口,支持这两个接口的过滤器将适用于RandomAccessFile

62 9.9 文件的随机访问 1.构造方法 RandomAccessFile 类提供两个构造方法:
9.9 文件的随机访问 1.构造方法 RandomAccessFile 类提供两个构造方法: (1)public RandomAccessFile ( String name, String mode ) throws FileNotFoundException (2)public RandomAccessFile ( File file, String mode ) throws FileNotFoundException

63 9.9 文件的随机访问 参数mode 有四种取值: ①" r " ― 以只读方式打开文件;
9.9 文件的随机访问 参数mode 有四种取值: ①" r " ― 以只读方式打开文件; ②" rw " ― 以读写方式打开文件,则用一个RandomAccessFile 对象就可以同时进行读、写两种操作; ③" rwd " ― 以读写方式打开文件,并且要求对文件内容的更新要同步地写到底层存储设备; ④" rws " - 与“rwd ”基本相同,只是还可以更新文件的元数据(MetaData )。

64 9.9 文件的随机访问 2.随机存取文件的操作 (1)文件引用的操作
9.9 文件的随机访问 2.随机存取文件的操作 (1)文件引用的操作 文件引用的运行规律:一是新建RandomAccessFile 对象的文件引用位于文件的开头处; 另外,每次读写操作后,文件位置引用都相应后移读写的字节数。

65 9.9 文件的随机访问 2.随机存取文件的操作 (1)文件引用的操作 方 法 说 明 long getFilePointer ( )
9.9 文件的随机访问 2.随机存取文件的操作 (1)文件引用的操作 方 法 说 明 long getFilePointer ( ) 返回当前文件引用,即从文件开头算起的绝对位置。void seek ( long pos)将文件引用定位到指定位置。参数pos是相对于文件开头的绝对偏移量。 longlength ( ) 返回文件长度。可以通过将文件长度与文件引用相比较,判断是否读到了文件尾。 int skipBytes ( int n ) 从当前位置开始跳过n 个字节,返回值表示实际跳过的字节数。

66 9.9 文件的随机访问 2.随机存取文件的操作 (2)文件读操作
9.9 文件的随机访问 2.随机存取文件的操作 (2)文件读操作 readBoolean(),readChar(),readInt(), readLong(),readFloat(),readDouble(),readLine(),readUTF()等。 这些方法的功能与DatalnputStream 类中的同名方法相同。 其中,readLine()从当前位置开始,到第1 个‘\n’为止,读取一行文本,它将返回一个String 对象。

67 9.9 文件的随机访问 2.随机存取文件的操作 (3)写操作
9.9 文件的随机访问 2.随机存取文件的操作 (3)写操作 RandomAccessFile 类同时还实现了Dataoutput 接口,因此具有与Dataoutput 类同样强大的具有类型转换功能的写操作方法。 RandomAccessFile 类包含的写方法主要包括:WriteBoolean(),WriteChar(),WriteUTF (), WriteInt(),WriteLong(),WriteFloat(), WriteDouble()等。

68 9.9 文件的随机访问 【例9-6】随机文件的读和写。 import java.io.*;
9.9 文件的随机访问 【例9-6】随机文件的读和写。 import java.io.*; public class RandomFile { public static void main(String[] args) throws IOException{ RandomAccessFile aFile; String s = "That is an apple."; aFile = new RandomAccessFile("test.txt", "rw"); aFile.seek(aFile.length()); aFile.writeBytes(s); aFile.close(); }

69 9.10 案例分析:多种流的实现 1.案例描述 编写一个类,要求能够实现从已知文件中读取文件内容并向屏幕输出、从键盘读取输入并向文件输出以及实现读写随机访问文件。 2.案例分析 (1)利用缓冲功能的输入文件处理 (2)输出至屏幕 (3)交互式输入应用 (4)输出至文件 (5)访问随机文件

70 9.10 案例分析:多种流的实现 3.案例实现:见IOStreamDemo.java 4.归纳与提高:
文件输入输出流构造方法的参数是文件对象 缓冲流构造方法的参数是其他流对象。 标准输入输出在main方法运行时自动生成对象,而不需要在程序中实例化。

71 小结 本章主要介绍了Java输入输出系统中流的概念,流的分类
重点介绍了字节流与字符流的使用。字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,还有其他不同点。 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。

72 小结 使用字节流好还是字符流好?所有文件在硬盘或在传输时都是以字节方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。 对于文件访问主要有顺序和随机两种,可以用File类及RandomAccessFile类实现。


Download ppt "第九章 Java输入输出系统."

Similar presentations


Ads by Google