1 / 38

第三部分 Java 语言编程应用篇

第三部分 Java 语言编程应用篇. 第 07 章 Java 语言的 IO 操作与线程处理技术. (之一). 学习目的. 学习把不同类型的输入、输出源抽象为流 (Stream) 来统一表示。 学习 Java 程序输入、输出的实现和文件与目录管理。 学习多线程知识,通过学习充分认识和掌握系统同时运行多个执行体,加快程序的响应时间,从而达到合理高效的利用计算机资源的目的。. 主要内容. Java 语言的输入输出操作 目录和文件管理 ——File 类 字节流类 字符流类 文件的访问 线程的概述 线程的创建 线程的生命周期

karlyn
Download Presentation

第三部分 Java 语言编程应用篇

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第三部分Java语言编程应用篇 第07章 Java语言的IO操作与线程处理技术 (之一)

  2. 学习目的 • 学习把不同类型的输入、输出源抽象为流(Stream)来统一表示。 • 学习Java程序输入、输出的实现和文件与目录管理。 • 学习多线程知识,通过学习充分认识和掌握系统同时运行多个执行体,加快程序的响应时间,从而达到合理高效的利用计算机资源的目的。

  3. 主要内容 • Java语言的输入输出操作 • 目录和文件管理——File类 • 字节流类 • 字符流类 • 文件的访问 • 线程的概述 • 线程的创建 • 线程的生命周期 • 线程的调度与优先级 • 线程的同步

  4. 7.1 Java语言的输入输出操作 • 对于程序设计者来说,创建一个好的输入/输出(I/O)系统是一项艰难的任务,这不仅存在各种I/O源端和想要通信的接收端(文件、控制台、网络链接等),而且还需要以多种不同的方式与它们进行通信(顺序、随机存取,缓冲、二进制、按字符、按行、按字等),Java类库的设计者通过创建大量的类能较为理想的解决这个难题。

  5. 输入/输出流概念 • 数据流(Stream): 是所有数据通信通道之中数据的起点和终点。 • 输入数据流: 表示从外部设备到计算机的数据流动。 • 输出数据流: 表示从计算机到外部设备的数据流动。 • 缓冲流: 使用缓冲区为一个流配备的一个缓冲区。

  6. Java标准数据流 • System类是继承Object类终极类,有三个表示标准输入、标准输出和标准错误的类变量。 • 标准输入:in public static final InputStream in //对应键盘输入 • 标准输出:out public static final PrintStream out //对应显示器输出 • 标准错误:err public static final PrintStream err //对应显示器输出

  7. 【综合案例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); } }

  8. 程序运行结果: 输入小于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字符元素: 这是键盘输入字符的练习程序!

  9. Java.io包中数据流类文件 • 在Java.io包中提供的输入输出流,支持两种类型的数据流: • 字节流 InputStream,OutputStream • 字符流 Reader,Writer • 在Java.io包中,字节流和字符流分别由多层类的结构定义,其中InputStream和OutputStream作为字节输入输出流的父类,Reader和Writer作为字符输入输出流的父类,它们都是抽象类。

  10. 7.2 目录和文件管理——File类 • File类是专门用来管理磁盘文件和目录的。 java.io.File类是java.lang.Object的子类。 • 每个File类的对象表示一个磁盘文件或目录,其对象属性中包含了文件或目录的相关信息,如文件或目录的名称、文件的长度、目录中所含文件的个数等。 • 调用File类的方法则可以完成对文件或目录的常用管理操作,如创建文件或目录、删除文件或目录、查看文件的有关信息等。

  11. 创建File类对象的构造方法 • public File(String path): 使用指定路径构造一个对象。 • public File(String path, String name): 使用指定路径和字符串构造一个对象。 • public File(File dir, String name): 使用指定文件目录和字符串构造一个对象。

  12. File类的常用方法1 • getName() 获取对象所代表的文件名 • getParent() 获取文件对象的路径的父类 • getPath() 获取对象所代表文件的路径名 • canRead() 测试能否从指定的文件中读数据 • canWrite() 测试能否对指定的文件写入数据 • exists() 测试文件是否存在 • length() 获取文件对象所代表的文件长度 • list() 获取文件对象指定的目录中文件列表

  13. File类的常用方法2 (9) getAbsolutePath() 获取文件的绝对路径 (10) getCanonicalPath() 获取文件对象路径名的标准格式 (11) isAbsolute() 测试此文件对象代表的文件是否是绝对路径 (12) isDirectory() 测试此文件对象代表的文件是否是一个目录 (13) isFile() 测试此对象所代表的是否是一个文件 (14) delete() 删除此对象指定的文件 (15) makdir() 创建一个目录,其路径名由此文件对象指定 (16) makdirs() 创建一个目录,其路径名由此文件对象指定 并包括必要的父目录

  14. 【综合案例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(); } } }

  15. 程序运行结果: public class ProgramFile { public static void main(String[] args) { System.out.println("This is a ProgramFile!"); } } 对文件操作主要有以下几步: (1)创建文件输入输出对象; (2)打开文件; (3)用文件读写方式读取数据; (4)关闭数据流。

  16. 7.3 字节流类 • 字节流类由两个层次结构定义。在顶层有两个抽象类:InputStream和OutputStream。 • 每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件,网络链接,甚至是内存缓冲区。

  17. 字节流类(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()

  18. 字节流类( 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()关闭输出流

  19. 数据介质 数 据 介 质 InputStream对象 OnputStream对象 读入 1B 1B 1B 1B 写出 字节输入流与字节输出流

  20. 7.4 字符流类 • 字符流类由两个类层次结构定义。 • 顶层由两个抽象类:Reader和Writer。这些抽象类处理统一编码的字符流。Java语言中这些类含有多个具体的子类。

  21. 字符流类(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

  22. 字符流类(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

  23. 数据介质 数 据 介 质 若干字节 若干字节 Reader 对象 读入 1个字符 Writer 对象 1个字符 写出 字符输入流与字符输出流

  24. Object InputStream OutputStream RandomAccessFile FilterInputStream FilterOutputStream DataInputStream DataOutputStream DataInput DataOutput 输入和输出接口的使用

  25. 7.5 文件的访问 • 文件字节流包含FileInputStream和FileOutputStream类。FileInputStream类是用于读取文件中字节数据的字节文件输入流类。FileOutputStream类是用于将字节流信息写入指定文件的。我们将学习它们各自的构造方法和常用方法。

  26. 文件的顺序访问—文件字符流 FileReader类和FileWriter类 FileReader类用于读取文件字符数据。 1 FileReader类的构造方法 (1)FileReader(String fileName) 使用指定的文件名创建一个FileReader对象。 (2)FileReader(File file) 使用指定的文件对象创建一个FileReader对象。 (3)FileReader(FileDescriptor fd) 使用指定的文件描述符创建一个FileReader对象。

  27. 文件的顺序访问—文件字符流 FileReader类和FileWriter类 FileReader类用于读取文件字符数据。 1 FileWriter类的构造方法 (1)FileWriter(String fileName) 使用指定的文件名创建一个FileWriter对象。 (2)FileWriter(File file) 使用指定的文件对象创建一个FileWriter对象。 (3)FileWriter(FileDescriptor fd) 使用指定的文件描述符创建一个FileWriter对象。

  28. 文件的顺序访问—文件字符流 FileReader类和FileWriter类 FileReader类和FileWriter类的成员方法 这两个类没有自己独特的成员方法,它 们的成员方法都直接继承自父类的。

  29. 文件的顺序访问—文件字节流 FileInputStream类: 用于读取文件中字节数据的字节文件输入流类。 1 FileInputStream类构造方法 (1)使用指定的字符串创建一个FileInputStream对象。 FileInputStream(String name) (2)使用指定的文件对象创建一个FileInputStream对象。 FileInputStream(File file) (3)使用指定的FileDescriptor创建一FileInputStream对象。 FileInputStream(FileDescriptor fdObj)

  30. 文件的顺序访问—文件字节流 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个字节。

  31. 文件的顺序访问—文件字节流 FileOutputStream类: 用于向文件写入字节数据的字节文件输出流。 1 FileOutputStream类构造方法 (1)使用指定的字符串创建一个FileOutputStream对象。 FileOutputStream(String name) (2)使用指定的文件对象创建一个FileOutputStream对象。 FileOutputStream(File file) (3)使用指定的FileDescriptor创建一个FileOutputStream对象。 FileOutputStream(FileDescriptor fdObj)

  32. 文件的顺序访问—文件字节流 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):关闭输入/输出流,释放占用的所有资源。

  33. 【综合案例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(); } } 简单字符文件的读取与建立

  34. 7.5.3 文件的随机访问 1 建立随机访问文件流对象 RandomAccessFile类的构造方法 (1)RandomAccessFile(File file, String mode) 使用指定字符串和存取模式创建其类对象。 (2)RandomAccessFile(String name, String mode) 使用指定字符串和存取模式创建其类对象。 存取模式: r__代表以只读方式打开文件; (mode) rw__代表以读写方式打开文件。

  35. 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)

  36. 3 对文件指针的操作——操作遵循的原则 (1)新建RandomAccessFile对象文件位置指针位于文件开头处。 (2)每次读写操作后,文件位置指针都后移所读写的字节数。 (3)利用seek()方法可以移动文件指针到一个新的位置。 (4)利用getPointer()方法可以获得本文件当前的文件位置指针。 (5)利用length()方法可以得到文件的字节长度。 利用getPointer()方法和length()方法可以判断读取的文件是 否到文件尾部。

  37. ——随机文件操作应用 【综合案例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

  38. 阶段复习要点 • 重点掌握知识内容 • Java语言的输入输出操作 • 目录和文件管理——File类 • 字节流类 • 字符流类 • 文件的访问

More Related