JAVA程序设计(1).ppt_第1页
JAVA程序设计(1).ppt_第2页
JAVA程序设计(1).ppt_第3页
JAVA程序设计(1).ppt_第4页
JAVA程序设计(1).ppt_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java程序设计,Java Programming Spring,2010 计算机应用(专),2/81,Java的输入输出与文件处理,第10章,3/81,通过本章的学习,主要掌握以下知识点: 流的概念 基本的输入输出流 标准输入输出 Reader和Writer流类 对文件的随机访问 本章的重点: 流的应用 本章的难点: 流的应用,4/81,I/O,输入(Input)/输出(Output)系统,简称为I/O系统, 对于输入/输出问题,Java将之抽象化为流(Stream)对象来解决,对不同的输入/输出问题,提供了相应的流对象解决的方案。 流式输入输出的特点是数据的获取和发送沿数据序列的顺序进行,

2、即每一个数据都必须等待排在它前面的数据,等前面的数据读入或送出之后才能被读写。,5/81,10.1 Java的输入输出类库,利用java.io类库中所提供的输入输出类,Java程序不但可以很方便地实现多种输入输出操作,而且还可实现对复杂的文件与目录的管理。,6/81,java.io 包,java.io包中定义与输入、输出流相关的类和接口,构成了Java语言的I/O框架。 java.io包中定义的各种各样的输入输出流类,它们都是Object类的直接或间接子类,每一个流类代表一种特定的输入或输出流。 import java.io.*;,7/81,流的类结构,流的实现是在java.io包的类层次结构

3、上。 以四个顶层抽象类为基础,衍生出系列具体的类,来完成各种输入/输出。 InputStream,OutputStream:用于字节的读/写。 Reader,Writer:用于文本(字符)的读/写。 实际使用的是它们的子类的对象。,8/81,10.1.1 流的概念,流(Stream)是指计算机各部件之间的数据流动。 按照数据的传输方向,流可分为输入流与输出流。 Java里的流序列中的数据既可以是未经加工的原始二进制数据,也可以是经过一定编码处理后符合某种格式规定的特定数据。,9/81,什么是流,流是数据的有序序列。 流可分为输入流和输出流: 输入流指从某个数据来源输入的数据序列, InputS

4、tream和Reader处理输入 输出流指将向某个数据目的地输出的数据序列, OutputStream和Writer处理输出,10/81,输入流、输出流,输入流、输出流分别如下图所示。,输入流示意图,输出流示意图,11/81,10.1.2 输入输出流类库,Java的流类都封装在java.io包中,在该类库中的每一个类都代表了一种特定的输入或输出流。,12/81,字符流和字节流,java.io包中类和接口从功能上主要分为字符流类型和字节流类型 字符(character)流是指数据序列的基本构成单位是16位的Unicode字符数据,如各类基于字符编码的文本文件。 字节(byte)流是指数据序列的基

5、本构成单位是8位的字节数据,如各类基于二进制数据的文件。,13/81,文本文件(Text Files) vs. 二进制文件(Binary Files),文本文件: Three bytes: “1”, “2”, “7” ASCII (binary): 00110001, 00110010, 00110111 二进制文件: 非字符文件,如:图片、声音、word文档。,14/81,10.2 使用InputStream和OutputStream流类,字节流可分为输入字节流和输出字节流 抽象类 InputStream 用于表示所有输入字节流 抽象类 OutputStream 用于表示所有输出字节流 In

6、putStream和OutputStream类是Java里用来处理以位(bit)为主的流,也就是说,除了纯文本文件之外,它们也可用来处理二进制文件(binary file)的数据。,15/81,InputStream和OuputStream两个抽象类的子类,16/81,10.2.1 基本的输入输出流,1InputStream流类,InputStream流类中包含一套所有输入都需要的方法,可以完成最基本的从输入流读入数据的功能。,17/81,InputStream类,该抽象类作为所有输入字节流类的基类,声明用于读取字节流数据的通用方法。 public abstract int read() th

7、rows IOException; public int read(byte buf, int offset, int count) throws IOException; public int read(byte buf) throws IOException; public long skip(long count) throws IOException; public int available() throws IOException; public void close() throws IOException;,18/81,表10.1 InputStream类的常用方法,19/81

8、,InputStream类,当创建InputStream类对象时,便自动打开了对象所表示的输入流 InputStream所有与输入相关的方法声明抛出异常类IOException InputStream类的对象在完成数据输入后,除标准输入流类对象System.in外,必须调用close方法关闭输入流,通常可将该方法的调用放入finally语句块中。,20/81,2OutputStream流类,OutputStream类中包含一套所有输出都需要的方法,可以完成最基本的向输出流写入数据的功能,其中常用的方法及功能见表10.2。,21/81,OutputStream类,该抽象类作为所有输出字节流类的基

9、类,声明用于输出字节流数据的通用方法: void write(int b) throws IOException; public void write(byte buf, int offset, int count) throws IOException; void write(byteb) throws IOException; void flush() throws IOException; void close() throws IOException;,22/81,表10.2 OutputStream类的常用方法,23/81,由于InputStream、OutputStream是抽象类

10、,所以在具体应用时使用的都由它们所派生的子类; 不同的子类,用于不同情况的数据输入输出操作。,10.2.2 输入输出流的应用,24/81,1文件输入输出流 文件输入流FileInputStream 文件输出流FileOutputStream 主要负责完成对本地磁盘文件的顺序输入输出操作。,25/81,InputStream和OuputStream两个抽象类的子类,26/81,文件的读写,FileOutputStream/FileInputStream 是抽象类InputStream/OutputStream的子类. 它们生成与文件链接的字节流。 为打开文件,只需创建FileOutputStre

11、am/FileInputStream类的一个对象,在构造函数中以参数形式指定文件的名称。 FileInputStream不支持mark/reset操作,27/81,文件的读写,FileInputStream类和FileOutputStream类的构造函数是创建一个输入输出的对象,通过引用该对象的读写方法,来完成对文件的输入输出操作。 在构造函数中,需要指定与所创建的输入输出对象相连接的文件。 要构造一个FileInputStream对象,所连接的文件必须存在而且是可读的; 构造一个FileOutputStream对象如果输出文件已经存在且可写,该文件内容会被新的输出所覆盖。,28/81,Jav

12、a文件路径的表示: Java约定是用UNIX和URL风格的斜线(/)来作路径分隔符; “c:/java/test.java” 如果用Windows/DOS所使用的反斜线( )的约定,则需要在字符串内使用它的转义序列( )。 “c:javatest.java”,29/81,FileInputStream类,从InputStream中派生出来,其所有方法都从InputStream类继承而来。 基本操作步骤:1建立文件的输入流对象 2从输入流中读取字节 3关闭流 常用构造方法 public FileInputStream(String name) throws FileNotFoundExcepti

13、on public FileInputStream(File file) throws FileNotFoundException 均会抛出FileNotFoundException异常 构造方法参数指定的文件称作输入流的源 FileInputStream fin = new FileInputStream(“c:javatest.java”);,30/81,FileInputStream:文件字节流的读取,read方法给程序提供从输入流中读取数据的基本方法。 read方法将顺序读取流,直到流的末尾或流被关闭(close()方法)。 read方法的格式 public int read() th

14、rows IOException 从输入流中顺序读取单个字节的数据,以int类型返回;如果已到达文件末尾,则返回 -1 。 public int read(byte b) throws IOException; public int read(byte b, int off, int len); throws IOException 把多个字节读到一个字节数组中,返回实际所读的字节数。,31/81,FileInputStream例1,/* class example FileIn.java */ import java.io.*; public class FileIn public stat

15、ic void main(String args) try FileInputStream fin = new FileInputStream(“c:javatest.java”); int input; while (input = fin.read() != -1) System.out.print(char)input); fin.close(); catch(IOException ie) System.out.println(e); ,32/81,FileInputStream例2,/* class example FileIn_Out.java */ /* assumes each

16、 char is a single byte */ import java.io.*; public class FileIn_Out public static void main(String args) try FileInputStream fin=new FileInputStream(“c:javafile1.java”); FileOutputStream fout=new FileOutputStream(“c:javafile1.java”); byte b= new byte512; while(fin.read(b,0,512)!=-1) fout.write(b); f

17、in.close(); fout.close(); catch(IOException ie) System.out.println(ie); catch(Exception e) System.out.println(e); ,33/81,FileOutputStream类,从OutputStream中派生出来,其所有方法都从OutputStream类继承来的。 基本操作步骤: 1建立文件的输出流对象 2向输出流中写字节 3关闭流 常用构造方法 public FileOutputStream(String name) throws IOException 创建一个文件输出流,向指定名称的文件

18、输出数据。如果文件不能为写操作打开,抛出异常。 public FileOutputStream(File file) throws IOException 创建一个文件输出流,向指定的 File 对象输出数据。如果文件不能为写打开 ,抛出异常。 如果输出流要写入数据的文件已经存在,该文件中的数据内容就会被刷新;如果要写入数据的文件不存在,该文件就会被建立。 FileOutputStream fout = new FileOutputStream(“c:javatest.java”);,34/81,FileOutputStream类: 文件字节流的输出,write方法把字节发送给输出流。 wri

19、te方法将顺序地写文件,直到流的末尾或流被关闭(close()方法) write方法的格式: public void write(byte b) throws IOException; public void write(byte b, int off, int len) throws IOException;,35/81,/*例:编写程序,接收用户从键盘输入的数据,回车后保存到 文件test.txt中。若用户输入符号#,则退出程序。*/ import java.io.*; public class WriteFile public static void main(String args)

20、byte buffer=new byte128; System.out.println(请输入数据,回车后保存到文件test.txt); System.out.println(输入 # 则退出!); try FileOutputStream f=new FileOutputStream(test.txt); while(true) int n = System.in.read(buffer); if(buffer0=# ) break; f.write(buffer,0,n); f.write(n); f.close(); catch(IOException e) System.out.pri

21、ntln(e.toString(); ,36/81,上例程序运行结果如图所示,37/81,【例10.2】用FileInputStream和FileOutputStream来实现对二进制图形文件.gif的拷贝。,/app10_2.java 读写二进制文件 import java.io.*; public class app10_2 public static void main(String args) throws IOException FileInputStream fi=new FileInputStream(d:cgjgificon.gif); FileOutputStream fo=

22、new FileOutputStream(d:cgjmy_icon.gif); System.out.println(文件的大小=+ fi.available() ); /输出文件的大小 byte b =new byte fi.available() ; /创建byte类型的数组b fi.read(b); /将图形文件读入b数组 fo.write(b); /将b数组里的数据写入新文件my_icon.gif System.out.println(文件已被拷贝并被更名); fi.close(); fo.close(); ,38/81,该程序的运行结果为:,【例10.2】续,文件的大小=557 文件

23、已被拷贝并被更名,39/81,offset 等同于 index,length,40/81,offset 等同于 index,import java.io.*; public class FileInOut public static void main(String args) try for(int offset = 0; offset 5; offset+) byte b= new byte5; FileInputStream fin=new FileInputStream(E:file1.txt); if( fin.read(b, offset, b.length-offset) !=-

24、1) System.out.println(new String(b); fin.close(); catch(IOException ie) System.out.println(ie); ,offset=0: offset=1: offset=2: offset=3: offset=4:,*1234 *123 *12 *1 *,41/81,2顺序输入流 3管道输入输出流 4过滤输入输出流 5标准输入输出,略过,42/81,标准输入输出流,System类的这3个静态字段就是系统的三个标准流: System.in:表示系统的标准输入流,通常的环境下标准输入流指向键盘输入; System.out

25、:表示系统的标准输出流,通常环境下指向屏幕输出; System.err:表示系统的标准错误输出流,通常环境下也指向屏幕输出。 上述三个标准流由系统负责打开关闭,使用时不需要显式地打开或关闭。 System.out和System.err都用于输出,通常情况下,Syetem.out用于程序输出一般信息,而System.err用于输出错误信息和其他需要引起用户立即注意的信息。在系统中,System.out具有缓冲机制,而System.err是没有缓冲的,这是两者之间的一个重要区别。,43/81,System.in:是字节流对象inputstream的常量对象,因此具有字节流对象的特点和方法行为。 S

26、ystem.out是PrintStream(打印字节流 )的常量对象,用于向控制台输出数据,有System.out的各种方法,可以输出特定类型的数据,println与print的区别是,前者输出后自动换行。,44/81,标准输入输出示例。,import java.io.*; public class StandardIO1 public static void main(String args) int ch; System.out.println(请输入一行字符); try while(ch = System.in.read() )!=r) System.out.write(ch); /Sy

27、setm.out.write(int a)是将a转换成字符,然后输出 catch(IOException e) System.out.println(e.toString(); System.out.write(n); ,45/81,10.3 使用Reader和Writer流类,字符流(Character Streams),分为输入字符流(Reader)和输出字符流(Writer ). 抽象类 Reader 用于表示所有输入字符流 抽象类 Writer 用于表示所有输出字符流,46/81,Reader和Writer的主要子类如下:,47/81,Reader抽象类作为所有输入字符流类的基类,声明

28、用于读取输入字符文本数据的通用方法:,48/81,Writer抽象类作为所有输出字符流类的基类,声明用于输出字符文本数据的通用方法。,49/81,10.3.1 使用FileReader类读取文件,从InputStreamReader中派生出来,其所有方法都从InputStreamReader类和Reader类继承而来。 基本操作步骤: 1建立文件的输出流对象 2向输出流中写字符 3关闭字符流 常用构造方法 public FileReader(String name) throws FileNotFoundException public FileReader (File file) throw

29、s FileNotFoundException 均会抛出FileNotFoundException异常 构造方法参数指定的文件称作输入流的源,50/81,FileReader类文件字符流的读取,read方法给程序提供从输入流中读取数据的基本方法。 read方法的格式: public int read() throws IOException 从源中顺序读取一个字符 public int read(char ch) throws IOException public int read(char ch, int off, int len) throws IOException 把多个字符读到一个字

30、符数组中,返回实际所读的字符数。,51/81,/FileIn.java import java.io.*; class FileIn public static void main(String args) throws IOException int i; FileReader fr; try fr = new FileReader(D:workspacetestFileIn.java); while(i = fr.read()!= -1) System.out.print(char)i); fr.close(); catch(FileNotFoundException e) System.

31、out.println(File Not Found); catch(ArrayIndexOutOfBoundsException e) System.out.println(Usage: ShowFile File); ,52/81,【例10.6】利用FileReader类读取纯文本文件“d:javatext.txt” 。,/app10_6.java FileReader类的使用 import java.io.*; public class app10_6 public static void main(String args) throws IOException char c=new c

32、har500; /创建可容纳500个字符的数组 /创建对象fr FileReader fr=new FileReader(“d:javatest.txt”); int num=fr.read(c); /将数据读入字符数组c内,并返回读取的字符数 String str=new String(c,0,num); /将字符串数组转换成字符串 System.out.println(“读取的字符个数为:”+num+”,其内容如下:”); System.out.println(str); fr.close();/关闭流 ,53/81,该程序的运行结果为: 读取的字符个数为:30,其内容如下: 我喜欢Jav

33、a!,因为它功能强大 安全性好 可靠性高,【例10.6】续,54/81,FileWriter类,从OutputStreamReader中派生出来,其所有方法都从OutputStreamReader类和Writer类继承而来。 基本操作步骤: 1建立文件的输出流对象 2向输出流中写字符 3关闭字符流 常用构造方法 public FileWriter(String name) public FileWriter(File file) 均会抛出FileNotFoundException异常,10.3.2 使用FileWriter类写入文件,55/81,FileWriter类:文件字符流的输出,wri

34、te方法给程序提供把字符数据写入到输出流的基本方法。 write方法的格式 public void write(char b ) throws IOException public int write(char b , int off, int len) throws IOException public int write(String str) throws IOException public int write(String str, int off, int len) throws IOException,56/81,【例10.7】利用FileWriter类将字符数组与字符串写到文件

35、里。,/app10_7.java FileReader类的使用 import java.io.*; public class app10_7 public static void main(String args) throws IOException FileWriter fw=new FileWriter(“d:javatest.txt”); char c=H,e,l,l,o,r,n; String str=”欢迎使用Java!”; fw.write(c); /将字符数组写到文件里 fw.write(str); /将字符串写到文件里 fw.close(); ,57/81,字符缓冲流,字符缓

36、冲流BufferedReader类和BufferedWriter类 FileReader和FileWriter类以字符为单位进行输入输出,无法进行整行输入与输出,数据的传输效率很低。 Java提供BufferedReader和BufferedWriter类以缓冲区方式进行输入输出。,58/81,字符缓冲流,BufferedReader和BufferedWriter类被用来从基于字符的输入和输出流中读取和写入文本。 BufferdReader类缓存字符以更高效的读取字符串,数组和文本行。 BufferedWriter类缓存字符以更高效的写入字符串,数组和文本行,59/81,60/81,10.3.

37、3 使用BufferedReader类读取文件,BufferedReader类是用来读取缓冲区里的数据。 使用BufferedReader类来读取缓冲区中的数据之前,必须先创建FileReader类对象,再以该对象为参数来创建BufferedReader类的对象,然后才可以利用此对象来读取缓冲区中的数据。,61/81,缓冲流-BufferedReader类,Reader类的直接子类 构造方法 public BufferedReader(Reader in,int sz) public BufferedReader(Reader in) BufferedReader对象的创建 先创建一个Read

38、er子类的对象,然后使用这个对象来创建缓冲流对象。,FileReader inOne = new FileReader(Student.txt); BufferedReader inTwo = new BufferedReader(inOne);,任何Reader流都可以用来包装成缓冲流,62/81,缓冲流的读取 public int read() throws IOException 读取一个字符 public int readLine() throws IOException 读取一行文本,读取完毕后,最好调用close()方法关闭流。,从缓冲区读取,缓冲流-BufferedReader类

39、,63/81,BufferedReader类,通过向BufferedReader传递一个Reader对象或者Reader子类对象来创建一个BufferedReader对象,如: BufferedReader br = BufferedReader (new FileReader(java11.txt); 然后再从流br中读取java11.txt中的内容。 应用见教材例10.8。,64/81,10.3.4使用BufferedWriter类写入文件,使用BufferedWriter类将数据写入缓冲区的过程与使用BufferedReader类从缓冲区里读出数据的过程相似。首先必须先创建FileWri

40、ter类对象,再以该对象为参数来创建BufferedWriter类的对象,然后就可以利用此对象来将数据写入缓冲区中。,65/81,BufferedWriter类,Writer类的直接子类 构造方法 public BufferedWriter (Writer in,int sz) public BufferedWriter(Reader in) BufferedWriter对象的创建 先创建一个Writer子类的对象,然后使用这个对象来创建缓冲流对象。,FileWriter outOne = new FileWriter(Student.txt); BufferedWriter outTwo =

41、 new BufferedWriter(outOne);,66/81,BufferedWriter类,缓冲流的写入 public void write(String str) throws IOException 向缓冲区写入一个字符串。 public int writeLn(String str,int off,int len) throws IOException 向缓冲区写入一个字符串的一部分。 输出完毕后,最好调用close()方法关闭流。,67/81,BufferedWriter类,类似的,可以将BufferedWriter流与FileWriter流连接起来,然后通过Buffered

42、Writer流将数据写到目的地,例如: FileWriter fw=new FileWriter(java11.in); BufferedWriter bw=new BufferedWriter(fw); 然后使用BufferedWriter类的成员方法write(String s, int off,int len)把字符串s写到java11.in中,参数off是字符串s开始处的偏移量,len是写入的字符长度。 应用见教材例10.9.,68/81,/*ReadWriteFile.java-读出1.txt中的内容,写入2.txt中*/ importjava.io.*; publicclassRe

43、adWriteFile publicstaticvoidmain(Stringargs) try Fileread=newFile(“c:1.txt”); BufferedReaderbr=newBufferedReader(newFileReader(read); Filewrite=newFile(“c:2.txt”); BufferedWriterbw=newBufferedWriter(newFileWriter(write); Stringtemp=null; temp=br.readLine(); while(temp!=null) /写文件 bw.write(temp+“rn”)

44、;/只适用Windows系统 temp=br.readLine(); /继续读文件 bw.close(); br.close(); catch(FileNotFoundExceptione)/文件未找到 System.out.println(e); catch(IOExceptione) System.out.println(e); ,69/81,/BufferedStream.java import java.io.*; public class BufferedStream public static void main(String args) try BufferedWriter ou

45、t = new BufferedWriter(new FileWriter(D:test.txt); BufferedReader in = new BufferedReader(new FileReader(D:test.txt); out.write(Hello,World); out.close(); String s; s = in.readLine(); System.out.println(s); in.close(); catch(Exception e) System.out.println(error); ,70/81,10.4 文件的处理与随机访问,计算机程序运行时,数据都

46、保存在系统的内存中,由于关机时内存中的数据全部丢失,所以必须把那些需要长期保存的数据存放在磁盘文件里,需要时再从文件里读出。,71/81,10.4.1 Java对文件与文件夹的管理,文件夹是管理文件的特殊机制,同类文件保存在同一个目录下不仅可以简化文件管理,而且还可以提高工作效率。 Java语言不仅支持文件管理,还支持目录管理。在java.io包中定义了一个File类专门用来管理磁盘文件和目录。 应用见教材例10.10。,72/81,File类,java.io包中的File类提供了获得文件基本信息及文件操作的方法。 通过File类,可以建立与磁盘文件的联系;可以用来获取或设置文件或目录的属性,

47、但不支持从文件里读取数据或者往文件里写数据。 File类的构造方法: File(String filename); File(String directoryPath,String filename); File(File f, String filename);,73/81,Example:,File file1 = new File(“test.txt”); /文件 File file2 = new File(“e:/java“,”test.txt”); File file3 = new File(“e:/java”); /文件夹 File file4 = new File(file2,t

48、est.txt);,74/81,File类的常用方法,文件的属性 public boolean canRead():判断文件是否是可读的。 public boolean canWrite():判断文件是否可被写入。 public boolean exits():判断文件是否存在。 public boolean isFile():判断文件是否是一个正常文件,而不是目录。 public boolean isDirectroy():判断文件是否是一个目录。,75/81,File类的常用方法,获取文件处理信息 public long length(): 获取文件的长度(单位是字节)。 public l

49、ong lastModified():获取文件最后修改时间。 public boolean delete():删除文件。,76/81,File类的常用方法,目录操作 创建一个名为File的目录: public boolean mkdir() 列出目录中的文件 public String list() public File listFiles() 在目录中创建文件 public boolean createNewFile(),77/81,File file2 = new File(e:/java); File file1 = new File(file2,test.txt); file2.mkdir(); file1.createNewFile();,File files = file2.listFiles(); for(int i = 0;ifiles.length;i+) System.out.println(filesi.getName()+t+ filesi.length();,String files = file2.list(); for(int i = 0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论