380 likes | 562 Vues
第三部分 Java 语言编程应用篇. 第 07 章 Java 语言的 IO 操作与线程处理技术. (之一). 学习目的. 学习把不同类型的输入、输出源抽象为流 (Stream) 来统一表示。 学习 Java 程序输入、输出的实现和文件与目录管理。 学习多线程知识,通过学习充分认识和掌握系统同时运行多个执行体,加快程序的响应时间,从而达到合理高效的利用计算机资源的目的。. 主要内容. Java 语言的输入输出操作 目录和文件管理 ——File 类 字节流类 字符流类 文件的访问 线程的概述 线程的创建 线程的生命周期
E N D
第三部分Java语言编程应用篇 第07章 Java语言的IO操作与线程处理技术 (之一)
学习目的 • 学习把不同类型的输入、输出源抽象为流(Stream)来统一表示。 • 学习Java程序输入、输出的实现和文件与目录管理。 • 学习多线程知识,通过学习充分认识和掌握系统同时运行多个执行体,加快程序的响应时间,从而达到合理高效的利用计算机资源的目的。
主要内容 • Java语言的输入输出操作 • 目录和文件管理——File类 • 字节流类 • 字符流类 • 文件的访问 • 线程的概述 • 线程的创建 • 线程的生命周期 • 线程的调度与优先级 • 线程的同步
7.1 Java语言的输入输出操作 • 对于程序设计者来说,创建一个好的输入/输出(I/O)系统是一项艰难的任务,这不仅存在各种I/O源端和想要通信的接收端(文件、控制台、网络链接等),而且还需要以多种不同的方式与它们进行通信(顺序、随机存取,缓冲、二进制、按字符、按行、按字等),Java类库的设计者通过创建大量的类能较为理想的解决这个难题。
输入/输出流概念 • 数据流(Stream): 是所有数据通信通道之中数据的起点和终点。 • 输入数据流: 表示从外部设备到计算机的数据流动。 • 输出数据流: 表示从计算机到外部设备的数据流动。 • 缓冲流: 使用缓冲区为一个流配备的一个缓冲区。
Java标准数据流 • System类是继承Object类终极类,有三个表示标准输入、标准输出和标准错误的类变量。 • 标准输入:in public static final InputStream in //对应键盘输入 • 标准输出:out public static final PrintStream out //对应显示器输出 • 标准错误:err public static final PrintStream err //对应显示器输出
【综合案例7-1 】 数据的读取和输出应用 class IO_1 { public static void main(String[] args) throws java.io.IOException { byte buffer[]=new byte[40]; System.out.println(“输入小于40个字符,按回车键结束输入:"); int count=System.in.read(buffer); System.out.println("保存在缓冲区的元素个数为"+count); System.out.println("输出buffer元素值:"); for(int i=0;i<count;i++) { System.out.print(" "+ buffer[i]); } System.out.println(); System.out.println("输出buffer字符元素:"); System.out.write(buffer,0,buffer.length); } }
程序运行结果: 输入小于40个字符,按回车键结束输入: 这是键盘输入字符的练习程序! 保存在缓冲区的元素个数为30 输出buffer元素值: -43 -30 -54 -57 -68 -4 -59 -52 -54 -28 -56 -21 -41 -42 -73 -5 -75 -60 -63 -73 -49 -80 -77 -52 -48 -14 -93 -95 13 10 输出buffer字符元素: 这是键盘输入字符的练习程序!
Java.io包中数据流类文件 • 在Java.io包中提供的输入输出流,支持两种类型的数据流: • 字节流 InputStream,OutputStream • 字符流 Reader,Writer • 在Java.io包中,字节流和字符流分别由多层类的结构定义,其中InputStream和OutputStream作为字节输入输出流的父类,Reader和Writer作为字符输入输出流的父类,它们都是抽象类。
7.2 目录和文件管理——File类 • File类是专门用来管理磁盘文件和目录的。 java.io.File类是java.lang.Object的子类。 • 每个File类的对象表示一个磁盘文件或目录,其对象属性中包含了文件或目录的相关信息,如文件或目录的名称、文件的长度、目录中所含文件的个数等。 • 调用File类的方法则可以完成对文件或目录的常用管理操作,如创建文件或目录、删除文件或目录、查看文件的有关信息等。
创建File类对象的构造方法 • public File(String path): 使用指定路径构造一个对象。 • public File(String path, String name): 使用指定路径和字符串构造一个对象。 • public File(File dir, String name): 使用指定文件目录和字符串构造一个对象。
File类的常用方法1 • getName() 获取对象所代表的文件名 • getParent() 获取文件对象的路径的父类 • getPath() 获取对象所代表文件的路径名 • canRead() 测试能否从指定的文件中读数据 • canWrite() 测试能否对指定的文件写入数据 • exists() 测试文件是否存在 • length() 获取文件对象所代表的文件长度 • list() 获取文件对象指定的目录中文件列表
File类的常用方法2 (9) getAbsolutePath() 获取文件的绝对路径 (10) getCanonicalPath() 获取文件对象路径名的标准格式 (11) isAbsolute() 测试此文件对象代表的文件是否是绝对路径 (12) isDirectory() 测试此文件对象代表的文件是否是一个目录 (13) isFile() 测试此对象所代表的是否是一个文件 (14) delete() 删除此对象指定的文件 (15) makdir() 创建一个目录,其路径名由此文件对象指定 (16) makdirs() 创建一个目录,其路径名由此文件对象指定 并包括必要的父目录
【综合案例7-2】 文件操作应用 • 从磁盘上读一个Java程序,将源程序代码显示在屏幕上 import java.io.*; class IO_2 { public static void main(String args[]) { byte buf[]=new byte[2056]; try { FileInputStream fileIn=newFileInputStream("D:/eclipse/ProgramFile/ProgramFile.java" ); int bytes=fileIn.read(buf, 0, 2056); String str=new String(buf, 0, bytes); System.out.println(str); }catch(Exception e) { e.printStackTrace(); } } }
程序运行结果: public class ProgramFile { public static void main(String[] args) { System.out.println("This is a ProgramFile!"); } } 对文件操作主要有以下几步: (1)创建文件输入输出对象; (2)打开文件; (3)用文件读写方式读取数据; (4)关闭数据流。
7.3 字节流类 • 字节流类由两个层次结构定义。在顶层有两个抽象类:InputStream和OutputStream。 • 每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件,网络链接,甚至是内存缓冲区。
字节流类(InputStream类及其继承派生关系) java .lang.Object java.io.InputStream java.io.ByteArrayInputStream java.io.PipedInputStream java.io.SequenceInputStream java.io. StringBufferInputStream java.io.FileInputStream java.io. DataInputStream java.io.LineNumberInputStream java.io.BufferedInputStream java.io.PushbackInputStream 常用方法: read()读数据; available() 获取输入流字节数; skip() reset() 指针定位 mark()
字节流类( OutputStream类及其继承派生关系) java .lang.Object java.io.OutputStream java.io.ByteArrayOutputStream java.io.PipedOutputStream java.io.ObjectOutputStream java.io.FileOutputStream java.io.PrintStream java.io.DataOutputStream java.io.BufferedOutputStream 常用方法: write()写数据; flush()写缓冲区内 的所有数据 close()关闭输出流
数据介质 数 据 介 质 InputStream对象 OnputStream对象 读入 1B 1B 1B 1B 写出 字节输入流与字节输出流
7.4 字符流类 • 字符流类由两个类层次结构定义。 • 顶层由两个抽象类:Reader和Writer。这些抽象类处理统一编码的字符流。Java语言中这些类含有多个具体的子类。
字符流类(Reader类及其继承派生关系) java .lang.Object java.io.Reader java.io.BufferedReader java.io.LineNumberReader java.io.CharArryReader java.io.FilerReader java.io.PushbackReader java.io.InputStreamReader java.io.FileReader java.io. PipedReader java.io.StringReader
字符流类(Witer类及其继承派生关系) java .lang.Object java.io.Witer java.io.BufferedWiter java.io.CharArryWiter java.io.FilerWiter java.io.OutputStreamWiter java.io.FileWiter java.io. PipedWiter java.io.StringWiter java.io.PrintWiter
数据介质 数 据 介 质 若干字节 若干字节 Reader 对象 读入 1个字符 Writer 对象 1个字符 写出 字符输入流与字符输出流
Object InputStream OutputStream RandomAccessFile FilterInputStream FilterOutputStream DataInputStream DataOutputStream DataInput DataOutput 输入和输出接口的使用
7.5 文件的访问 • 文件字节流包含FileInputStream和FileOutputStream类。FileInputStream类是用于读取文件中字节数据的字节文件输入流类。FileOutputStream类是用于将字节流信息写入指定文件的。我们将学习它们各自的构造方法和常用方法。
文件的顺序访问—文件字符流 FileReader类和FileWriter类 FileReader类用于读取文件字符数据。 1 FileReader类的构造方法 (1)FileReader(String fileName) 使用指定的文件名创建一个FileReader对象。 (2)FileReader(File file) 使用指定的文件对象创建一个FileReader对象。 (3)FileReader(FileDescriptor fd) 使用指定的文件描述符创建一个FileReader对象。
文件的顺序访问—文件字符流 FileReader类和FileWriter类 FileReader类用于读取文件字符数据。 1 FileWriter类的构造方法 (1)FileWriter(String fileName) 使用指定的文件名创建一个FileWriter对象。 (2)FileWriter(File file) 使用指定的文件对象创建一个FileWriter对象。 (3)FileWriter(FileDescriptor fd) 使用指定的文件描述符创建一个FileWriter对象。
文件的顺序访问—文件字符流 FileReader类和FileWriter类 FileReader类和FileWriter类的成员方法 这两个类没有自己独特的成员方法,它 们的成员方法都直接继承自父类的。
文件的顺序访问—文件字节流 FileInputStream类: 用于读取文件中字节数据的字节文件输入流类。 1 FileInputStream类构造方法 (1)使用指定的字符串创建一个FileInputStream对象。 FileInputStream(String name) (2)使用指定的文件对象创建一个FileInputStream对象。 FileInputStream(File file) (3)使用指定的FileDescriptor创建一FileInputStream对象。 FileInputStream(FileDescriptor fdObj)
文件的顺序访问—文件字节流 FileInputStream类: 用于读取文件中字节数据的字节文件输入流类。 2 FileInputStream类的常用成员方法 (1)read(): 自输入流中读取一个字节。 (2)read(byte b[]):将输入数据存放在指定的字节数组b中 (3)read(byte b[],int offset, int len):自输入流中的offset位 置开始读取len个字节并存放在指定的数组b中。 (4)available():返回输入流中的可用字节个数。 (5)skip(long n):从输入流中跳过n个字节。
文件的顺序访问—文件字节流 FileOutputStream类: 用于向文件写入字节数据的字节文件输出流。 1 FileOutputStream类构造方法 (1)使用指定的字符串创建一个FileOutputStream对象。 FileOutputStream(String name) (2)使用指定的文件对象创建一个FileOutputStream对象。 FileOutputStream(File file) (3)使用指定的FileDescriptor创建一个FileOutputStream对象。 FileOutputStream(FileDescriptor fdObj)
文件的顺序访问—文件字节流 FileOutputStream类: 用于向文件写入字节数据的字节文件输出流。 2 FileOutputStream类的常用成员方法 (1)write(int b): 写入一个字节到文件输入流。 (2)write(byte b[]):写一个字节数组。 (3)write(byte b[],int offset, int len):将字节数组b从offset位 置开始的len个字节数组的数据写到输出流中。 (4)getFD():获取与此流关联的文件描述符。 (5)close(long n):关闭输入/输出流,释放占用的所有资源。
【综合案例7-3】 import java.io.*; public class IO_3 { public static void main(String[ ] args) throws IOException { FileReader in=new FileReader("ProgramFile.java"); //建立文件输入流 BufferedReader bin=new BufferedReader(in); //建立缓冲输入流 FileWriter out=new FileWriter("ProgramFile.txt",true); //建立文件输出流 String str; while ((str=bin.readLine())!=null) { System.out.println(str); out.write(str+"\n"); } in.close(); out.close(); } } 简单字符文件的读取与建立
7.5.3 文件的随机访问 1 建立随机访问文件流对象 RandomAccessFile类的构造方法 (1)RandomAccessFile(File file, String mode) 使用指定字符串和存取模式创建其类对象。 (2)RandomAccessFile(String name, String mode) 使用指定字符串和存取模式创建其类对象。 存取模式: r__代表以只读方式打开文件; (mode) rw__代表以读写方式打开文件。
2 访问随机文件 RandomAccessFile对象的读写操作和DataInput/DataOutput对象操作方式一样,可以使用在DataInputStream和DataOutputStream里出现的所有read()和write()方法。 RandomAccessFile类中的常用成员方法: (1)read() (2)read(byte b[]) (7)getFilePointer() //取文件的指针 (3)read(byte b[],int offset,int len) (8)length() (4)write(int b) (9)seek(long pos)//指针放pos处 (5)write(byte b[]) (10) close() (6)write(byte b[],int offset,int len)
3 对文件指针的操作——操作遵循的原则 (1)新建RandomAccessFile对象文件位置指针位于文件开头处。 (2)每次读写操作后,文件位置指针都后移所读写的字节数。 (3)利用seek()方法可以移动文件指针到一个新的位置。 (4)利用getPointer()方法可以获得本文件当前的文件位置指针。 (5)利用length()方法可以得到文件的字节长度。 利用getPointer()方法和length()方法可以判断读取的文件是 否到文件尾部。
——随机文件操作应用 【综合案例7-4】 import java.io.*; class IO_4{ public static void main(String[] args){ String str[]={"First line\n","Second line\n","Last line\n"}; try{ RandomAccessFile rf=newRandomAccessFile("demo.txt","rw"); System.out.println("\n文件指针位置为:"+rf.getFilePointer()); System.out.println("文件的长度为:"+rf.length()); rf.seek(rf.length()); System.out.println("文件指针现在的位置为:"+rf.getFilePointer()); for (int i=0; i<3; i++ ) rf.writeBytes(str[i]); //字符串转换为字节串添加到文件末尾 rf.seek(0); System.out.println("\n文件现在内容:"); String s; while ((s=rf.readLine())!=null) System.out.println(s); rf.close(); } catch (FileNotFoundException fnoe){} catch (IOException ioe){} } } 程序运行结果: 文件指针位置为:0 文件的长度为:0 文件指针现在的位置为:0 文件现在内容: First line Second line Last line
阶段复习要点 • 重点掌握知识内容 • Java语言的输入输出操作 • 目录和文件管理——File类 • 字节流类 • 字符流类 • 文件的访问