收藏 分享(赏)

输入输出字符流PPT课件.ppt

上传人:微传9988 文档编号:2174426 上传时间:2018-09-04 格式:PPT 页数:81 大小:301.50KB
下载 相关 举报
输入输出字符流PPT课件.ppt_第1页
第1页 / 共81页
输入输出字符流PPT课件.ppt_第2页
第2页 / 共81页
输入输出字符流PPT课件.ppt_第3页
第3页 / 共81页
输入输出字符流PPT课件.ppt_第4页
第4页 / 共81页
输入输出字符流PPT课件.ppt_第5页
第5页 / 共81页
点击查看更多>>
资源描述

1、1,输入/输出流和文件,2,什么是数据流 ?,数据流是指所有的数据通信通道 在java中有关流的操作使用java.io.* 出于安全的考虑,Applet应用对客户端限制文件操作。,3,1 输入/输出流,通常程序需要从外部获取/输出信息 这个“外部”范围很广,包括诸如键盘、显示器、文件、磁盘、网络、另外一个程序等 “信息”也可以是任何类型的,例如一个对象、串字符、图像、声音等 通过使用java.io包中的输入/输出流类就可以达到输入输出信息的目的,4,I/O流的概念,I/O流(Input/Output) 在Java中将信息的输入与输出过程抽象为I/O流 输入是指数据流入程序 输出是指数据从程序流

2、出 一个流就是一个从源流向目的地的数据序列 IO流类一旦被创建就会自动打开 通过调用close方法,可以显式关闭任何一个流,如果流对象不再被引用,Java的垃圾回收机制也会隐式地关闭它,5,输入流 为了从信息源获取信息,程序打开一个输入流,程序可从输入流读取信息,I/O流的概念,输出流 当程序需要向目标位置写信息时,便需要打开一个输出流,程序通过输出流向这个目标位置写信息,6,I/O流的概念源和目标的类型,7,不论数据从哪来,到哪去,也不论数据本身是何类型,读写数据的方法大体上都是一样的:,I/O流的概念 读写数据的方法,8,2 预定义的I/O流类概述,输入/输出流可以从以下几个方面进行分类

3、从流的方向划分 输入流 输出流 从流的分工划分 节点流 处理流 从流的内容划分 面向字符的流 面向字节的流,9,面向字符的流:专门用于字符数据 面向字节的流:用于一般目的,java.io包的顶级层次结构,10,面向字符的流,面向字符的流 针对字符数据的特点进行过优化,提供一些面向字符的有用特性 源或目标通常是文本文件,11,实现内部格式和文本文件中的外部格式之间转换 内部格式:16-bit char 数据类型 外部格式: UTF(Universal character set Transformation Format):很多人称之为“Universal Text Format“ 包括ASCI

4、I 码及非ASCII 码字符,比如: 斯拉夫(Cyrillic)字符, 希腊字符,亚洲字符等,面向字符的流,12,面向字符的抽象类Reader和Writer java.io包中所有字符流的抽象基类 Reader提供了输入字符的API Writer提供了输出字符的API 它们的子类又可分为两大类 节点流:从数据源读入数据或往目的地写出数据 处理流:对数据执行某种处理 多数程序使用这两个抽象类的一系列子类来读入/写出文本信息 例如FileReader/FileWriter用来读/写文本文件,面向字符的流,13,面向字符的流,阴影部分为节点流,14,数据源或目标中含有非字符数据,必须用字节流来输入/

5、输出 通常被用来读写诸如图片、声音之类的二进制数据 绝大多数数据是被存储为二进制文件的,世界上的文本文件大约只能占到2,通常二进制文件要比含有相同数据量的文本文件小得多,面向字节的流,15,InputStream和OutputStream 是用来处理8位字节流的抽象基类,程序使用这两个类的子类来读写8位的字节信息 分为两部分 节点流 处理流,面向字节的流,16,面向字节的流,阴影部分为节点流,17,标准输入输出流对象 System类的静态成员变量 包括 System.in: InputStream类型的,代表标准输入流,这个流是已经打开了的,默认状态对应于键盘输入。 System.out:Pr

6、intStream类型的,代表标准输出流,默认状态对应于屏幕输出 System.err:PrintStream类型的,代表标准错误信息输出流,默认状态对应于屏幕输出,标准输入输出,每当main方法被执行时,就自动生成上述三个对象,18,标准输入输出,标准I/O重新导向 setIn(InputStream): 设置标准输入流 setOut(PrintStream):设置标准输出流 setErr(PrintStream):设置标准错误输出流,19,从键盘读入信息并在显示器上显示 import java.io.*; public class Echo public static void main(

7、String args) throws IOException BufferedReader in = new BufferedReader(new InputStreamReader(System.in);String s;while(s = in.readLine().length() != 0)System.out.println(s);,例1,运行结果 Hello! Hello!,20,System.in 程序启动时由Java系统自动创建的流对象,它是原始的字节流,不能直接从中读取字符,需要对其进行进一步的处理 InputStreamReader(System.in) 以System.

8、in为参数创建一个InputStreamReader流对象,相当于字节流和字符流之间的一座桥梁,读取字节并将其转换为字符 BufferedReader in 对InputStreamReader处理后的信息进行缓冲,以提高效率,说明,21,Java SE 5.0新特性,Java 5.0终于也有了自己的printf! out.printf(“%-12s is %2d long”, name, l); out.printf(“value = %2.2F”, value); %n 是平台无关的换行标志 一个方便的扫描API: 把文本转化成基本类型或者String Scanner s = new Sc

9、anner(System.in); int n = s.nextInt(); 还有下列方法:next.Byte(),nextDouble(),nextFloat,nextInt(), nextLine(),nextLong(),nextShort(),22,重导向标准输入System.in和标准输出System.outimport java.io.*; public class Redirecting public static void main(String args) throws IOException BufferedInputStream in = new BufferedInpu

10、tStream(new FileInputStream( “Redirecting.java“);PrintStream out = new PrintStream( new BufferedOutputStream( new FileOutputStream(“test.out“);System.setIn(in);System.setOut(out);System.setErr(out);BufferedReader br = new BufferedReader(new InputStreamReader(System.in);String s;while(s = br.readLine

11、() != null) System.out.println(s);out.close(); / Remember this! ,23,处理流 不直接与数据源或目标相连,而是基于另一个流来构造 从流读写数据的同时对数据进行处理 例1中的InputStreamReader和BufferedReader都属于处理流 InputStreamReader读取字节并转换为字符 BufferedReader对另一个流产生的数据进行缓冲,处理流,24,用一行表达式实现: BufferedReader stdin = new BufferedReader( new InputStreamReader(Syst

12、em.in) );,处理流,25,IO异常 多数IO方法在遇到错误时会抛出异常,因此调用这些方法时必须 在方法头声明抛出IOException异常 或者在try块中执行IO,然后捕获IOException,I/O异常,26,3. 写文本文件,知识点 FileWriter类 创建一个磁盘文件 关闭一个磁盘文件 write() 方法 捕获I/O异常 BufferedWriter 类,27,在C盘根目录创建文本文件Hello.txt,并往里写入若干行文本 import java.io.*; class Test public static void main ( String args ) thro

13、ws IOException /main方法中声明抛出IO异常String fileName = “C:Hello.txt“; FileWriter writer = new FileWriter( fileName ); writer.write( “Hello!n“); writer.write( “This is my first text file,n“ ); writer.write( “You can see how this is done.n“ ); writer.write(“输入一行中文也可以n“);writer.close(); ,28,打开C盘根目录下的Hello.tx

14、t文件换行有些问题,后例中将解决这个问题,运行结果,29,说明,每次运行这个程序,都将删除已经存在的”Hello.txt”文件,创建一个新的同名文件 FileWriter的构造方法有五个,本例是通过一个字符串指定文件名来创建 FileWriter类的write方法向文件中写入字符,30,Writer类的流可实现内部格式到外部磁盘文件格式的转换 “Hello.txt”是一个普通的ASCII码文本文件,每个英文字符占一个字节,中文字符占两个字节 Java程序中的字符串则是每个字符占两个字节的,采用Unicode编码close方法清空流里的内容并关闭它。如果不调用该方法,可能系统还没有完成所有数据的

15、写操作,程序就结束了,31,加入处理IO异常 import java.io.*; class Test public static void main ( String args ) String fileName = “c:Hello.txt“ ;try /将所有IO操作放入try块中FileWriter writer = new FileWriter( fileName ,true );writer.write( “Hello!n“); writer.write( “This is my first text file,n“ ); writer.write( “You can see ho

16、w this is done. n“ );writer.write(“输入一行中文也可以n“);writer.close();catch ( IOException iox) System.out.println(“Problem writing“ + fileName ); ,32,运行此程序,会发现在原文件内容后面又追加了重复的内容,这就是将构造方法的第二个参数设为true的效果 如果将文件属性改为只读属性,再运行本程序,就会出现IO错误,程序将转入catch块中,给出出错信息,说明,33,BufferedWriter类 如果需要写入的内容很多,就应该使用更为高效的缓冲器流类Buffere

17、dWriter FileWriter和BufferedWriter类都用于输出字符流,包含的方法几乎完全一样,但BufferedWriter多提供了一个newLine()方法用于换行 不同厂家生产的计算机 (IBM, Apple, VAX, Sun) 对文字的换行方法不同。newLine()方法可以输出在当前计算机上正确的换行符,BufferedWriter类,34,使用BufferedWriter完成上例实现的功能 import java.io.*; class Test public static void main ( String args ) throws IOException S

18、tring fileName = “C:/newHello.txt“ ;BufferedWriter out = new BufferedWriter( new FileWriter( fileName ) );out.write( “Hello!“ );out.newLine() ; out.write( “This is another text file using BufferedWriter,“ ); out.newLine(); ;out.write( “So I can use a common way to start a newline“ ); out.close(); ,3

19、5,用任何文本编辑器打开newHello.txt都会出现正确的换行效果,运行结果,36,只有缓冲区满时,才会将数据送到输出流. Java在输出数据流中,当对方尚未将数据取走时,程序就会被阻塞. 有时要人为地将尚未填满的缓冲区中的数据送出,使用flush()方法.,文件,37,4 读文本文件,知识点 Reader FileReader BufferedReader和readLine() 文本文件复制,38,FileReader类 从文本文件中读取字符 继承自Reader抽象类的子类InputStreamReader BufferedReader 读文本文件的缓冲器类 具有readLine()方法

20、,可以对换行符进行鉴别,一行一行地读取输入流中的内容 继承自Reader,39,文件输入方法: BufferedReader in = new BufferedReader(new FileReader( fileName) );,40,从Hello.txt中读取文本并显示在屏幕上 import java.io.*; class Test public static void main ( String args ) String fileName = “C:/Hello.txt“ , line;try BufferedReader in = new BufferedReader(new Fi

21、leReader( fileName ) );line = in.readLine(); /读取一行内容while ( line != null ) System.out.println( line );line = in.readLine();in.close(); catch ( IOException iox ) System.out.println(“Problem reading “ + fileName ); ,41,运行该程序,屏幕上将逐行显示出Hello.txt文件中的内容 FileReader对象:创建后将打开文件,如果文件不存在,会抛出一个IOException Buffe

22、redReader类的readLine()方法:从一个面向字符的输入流中读取一行文本。如果其中不再有数据,返回null Reader类的read()方法:也可用来判别文件结束。该方法返回的一个表示某个字符的int型整数,如果读到文件末尾,返回 -1。据此,可修改本例中的读文件部分: int c; while(c=in.read()!= -1) System.out.print(char)c); close()方法:为了操作系统可以更为有效地利用有限的资源,应该在读取完毕后,调用该方法,说明,42,指定源文件和目标文件名,将源文件的内容拷贝至目标文件。调用方式为: java copy sourc

23、eFile destinationFile,43,共包括两个类 CopyMaker private boolean openFiles() private boolean copyFiles() private boolean closeFiles() public boolean copy(String src, String dst ) Ex main(),44,import java.io.*; class CopyMaker String sourceName, destName;BufferedReader source;BufferedWriter dest;String line

24、;,45,private boolean openFiles() try source = new BufferedReader(new FileReader( sourceName );catch ( IOException iox ) System.out.println(“Problem opening “ + sourceName ); return false;try dest = new BufferedWriter(new FileWriter( destName ); catch ( IOException iox )System.out.println(“Problem op

25、ening “ + destName );return false;return true;,46,private boolean copyFiles() try line = source.readLine(); while ( line != null ) dest.write(line); dest.newLine(); line = source.readLine(); catch ( IOException iox ) System.out.println(“Problem reading or writing“ );return false;return true;,47,priv

26、ate boolean closeFiles() boolean retVal=true;try source.close(); catch ( IOException iox ) System.out.println(“Problem closing “ + sourceName );retVal = false;try dest.close(); catch ( IOException iox ) System.out.println(“Problem closing “ + destName );retVal = false;return retVal; ,48,public boole

27、an copy(String src, String dst ) sourceName = src ;destName = dst ;return openFiles() ,49,Ex.java编译后生成Ex.class和CopyMaker.class两个字节码文件 运行结果 在命令行方式下执行如下命令 java Ex c:/Hello.txt c:/CopyHello.txt 则在C盘根目录下会出现CopyHello.txt文件,内容与Hello.txt完全相同,运行结果,50,5 写二进制文件,知识点 二进制文件 OutputStream FileOutputStream Buffered

28、OutputStream DataOutputStream writeInt() writeDouble() writeBytes(),51,二进制文件 原则上讲,所有文件都是由8位的字节组成的 如果文件字节中的内容应被解释为字符,则文件被称为文本文件;如果被解释为其它含义,则文件被称为二进制文件 例如文字处理程序,例如字处理软件Word产生的doc文件中,数据要被解释为字体、格式、图形和其他非字符信息。因此,这样的文件是二进制文件,不能用Reader流正确读取,二进制文件,52,为什么需要二进制文件 输入输出更快 比文本文件小很多 有些数据不容易被表示为字符,53,抽象类OutputStre

29、am 派生类FileOutputStream 用于一般目的输出(非字符输出) 用于成组字节输出 派生类DataOutputStream 具有写各种基本数据类型的方法 将数据写到另一个输出流 它在所有的计算机平台上使用同样的数据格式 其常用的一些方法见下表 其中size方法,可作为计数器,统计写入的字节数,OutputStream类,54,55,56,将三个int型数字255/0/1写入数据文件data1.dat import java.io.*; class Testpublic static void main ( String args ) String fileName = “c:/da

30、ta1.dat“ ;int value0 = 255, value1 = 0, value2 = -1;try DataOutputStream out = new DataOutputStream(new FileOutputStream( fileName ) );out.writeInt( value0 );out.writeInt( value1 );out.writeInt( value2 );out.close();catch ( IOException iox )System.out.println(“Problem writing “ + fileName ); ,57,运行结

31、果 运行程序后,在C盘生成数据文件data1.dat 用写字板打开没有任何显示 用ultraEdit打开查看其二进制信息,内容为00 00 00 FF 00 00 00 00 FF FF FF FF,每个int数字都是32个bit的 说明 FileOutputStream类的构造方法负责打开文件“data1.dat”用于写数据 FileOutputStream类的对象与DataOutputStream对象连接,写基本类型的数据,运行结果,58,BufferedOutputStream 写二进制文件的缓冲流类 类似于文本文件中的BufferedWriter 对于大量数据的写入,可提高效率 用法示

32、例: DataOutputStream out = new DataOutputStream( new BufferedOutputStream( new FileOutputStream( fileName ) ) );,BufferedOutputStream类,59,向文件中写入各种数据类型的数,并统计写入的字节数 import java.io.*; class Testpublic static void main ( String args ) throws IOException String fileName = “mixedTypes.dat“ ;DataOutputStrea

33、m dataOut = new DataOutputStream(new BufferedOutputStream(new FileOutputStream( fileName ) ) );dataOut.writeInt( 0 );System.out.println( dataOut.size() + “ bytes have been written.“);dataOut.writeDouble( 31.2 );System.out.println( dataOut.size() + “ bytes have been written.“);dataOut.writeBytes(“JAV

34、A“);System.out.println( dataOut.size() + “ bytes have been written.“);dataOut.close(); ,60,运行结果 4 bytes have been written 12 bytes have been written 16 bytes have been written 说明 这个程序可作为字节计数器,运行结果,61,向文件中写入内容为-1的一个字节,并读出。 import java.io.*; public class Ex6_9 public static void main(String args) thro

35、ws Exception DataOutputStream out=new DataOutputStream(new FileOutputStream(“c:/trytry.dat“);out.writeByte(-1); out.close();DataInputStream in=new DataInputStream(new FileInputStream(“c:/trytry.dat“);int a=in.readByte();System.out.println(Integer.toHexString (a);System.out.println(a);in.skip (-1); /

36、往后一个位置,以便下面重新读出a=in.readUnsignedByte();System.out.println(Integer.toHexString (a);System.out.println(a); in.close(); ,62,运行结果 ffffffff -1 ff 255 说明 用ultraEdit打开c:/trytry.dat文件,其内容为FF 如果用readByte读入,其高24位都将补1,所以结果还是-1 如果用readUnsignedByte读入,其高24位都将补0,结果就变成了255 写的字节是连续的,中间没有分隔符,所以应该记住写的数据类型、个数等情况,以便将来利用

37、,63,6读二进制文件,知识点 FileInputStream DataInputStream BufferedInputSteam 读写整数 读写单字节,64,过滤流 读或写的同时对数据进行处理 通过另外一个流来构造一个过滤流 大部分java.io 包所提供过滤流都是FilterInputStream和FilterOutputStream的子类 DataInputStream 和 DataOutputStream BufferedInputStream 和 BufferedOutputStream LineNumberInputStream PushbackInputStream Print

38、Stream,过滤流,65,读取前例创建的数据文件中的3个int型数字,显示相加结果 import java.io.*; class Test public static void main ( String args ) String fileName = “c:data1.dat“;int sum = 0;try DataInputStream instr = new DataInputStream(new BufferedInputStream(new FileInputStream( fileName );sum += instr.readInt();sum += instr.read

39、Int(); sum += instr.readInt();System.out.println( “The sum is: “ + sum );instr.close();catch ( IOException iox ) System.out.println(“Problem reading “ + fileName ); ,66,该程序显示结果是254 分析 readInt方法可以从输入流中读入4个字节并将其当作int型数据 由于知道文件中存储的是3个int型数据,所以使用了3个读入语句 如果不知道数据的个数该怎么办呢?因为DataInputStream的读入操作如遇到文件结尾就会抛出E

40、OFException异常,所以我们可以将读操作放入try块中,67,将读操作放入try块中,使遇到文件结尾就会抛出EOFException异常,进入到相应的catch块中 try while ( true ) sum += instr.readInt(); catch ( EOFException eof ) System.out.println( “The sum is: “ + sum );instr.close(); ,68,如果没有读到结尾,在读取过程中发生的异常属于IOException,这样就需要我们再加一个catch块处理这种异常 一个try块后面可以跟不止一个catch块,用

41、于处理各种可能发生的异常 我们可以在上段代码后再加上用于捕捉IOException的代码段如下 catch ( IOException eof ) System.out.println( “Problem reading input“ );instr.close();,69,如果catch块中的close方法也发生异常,现在就没法捕获了。解决方法可以有 在main方法中抛出异常 比较简单 缺点是没有catch块,因而无法对异常进行进一步处理,例如给出提示信息 使用嵌套的try块,70,import java.io.*; class Testpublic static void main ( S

42、tring args ) String fileName = “c:/data1.dat“ ; long sum = 0;try DataInputStream instr = new DataInputStream(new BufferedInputStream(new ileInputStream(fileName);try while ( true )sum += instr.readInt();catch ( EOFException eof ) System.out.println( “The sum is: “ + sum );instr.close();catch ( IOExc

43、eption iox ) System.out.println(“IO Problems with “ + fileName ); ,71,由于文本文件的存储方式其实也是二进制代码,因此也可使用InputStream类的方法读取 用InputStream类读取文本文件并打印在屏幕上 import java.io.*; public class Test public static void main(String args) throws IOException FileInputStream s=new FileInputStream(“c:/Hello.txt“);int c;while

44、(c = s.read() != -1) /读取1字节,结束返回-1System.out.write(c); s.close(); ,72,DataOutputStream的writeByte方法 public final void writeByte(int b) throws IOException 将int的最不重要字节写入输出流 DataInputStream的readUnsignedByte方法 public final int readUnsignedByte() throws IOException 从输入流中读取1字节存入int的最不重要字节,读写字节,73,从命令行输入源文件

45、名和目标文件名,将源文件复制为目标文件。 import java.io.*; class CopyBytes public static void main ( String args ) DataInputStream instr;DataOutputStream outstr;if ( args.length != 2 ) System.out.println(“Please enter file names“);return;try instr = new DataInputStream(new BufferedInputStream(new FileInputStream( args0

46、 );outstr = new DataOutputStream(new BufferedOutputStream(new FileOutputStream( args1 );,文件复制程序,74,try int data;while ( true ) data = instr.readUnsignedByte() ;outstr.writeByte( data ) ;catch ( EOFException eof ) outstr.close(); instr.close(); return; catch ( FileNotFoundException nfx ) System.out.p

47、rintln(“Problem opening files“ ); catch ( IOException iox ) System.out.println(“IO Problems“ ); ,75,7 File 类,表示磁盘文件信息 定义了一些与平台无关的方法来操纵文件 创建、删除文件 重命名文件 判断文件的读写权限及是否存在 设置和查询文件的最近修改时间等 构造文件流可以使用File类的对象作为参数,76,File类 构造方法,77,常用方法,78,例:在C盘创建文件Hello.txt,如果存在则删除旧文件,不存在则直接创建新的 import java.io.*; public class

48、 Test public static void main(String args) File f=new File(“c:“+File.separator+“Hello.txt“); if (f.exists() f.delete();elsetryf.createNewFile();catch(Exception e) System.out.println(e.getMessage(); ,79,运行结果 假设已经创建了c:Hello.txt,第一次运行将删除这个文件 第二次运行则又创建了一个此名的空文件 分析 在试图打开文件之前,可以使用File类的isFile方法来确定File对象是否

49、代表一个文件而非目录) 还可通过exists方法判断同名文件或路径是否存在,进而采取正确的方法,以免造成误操作,80,import java.io.*; class NewCopyBytes public static void main ( String args ) DataInputStream instr;DataOutputStream outstr;if ( args.length != 2 ) System.out.println(“Please Enter file names!“);return;File inFile = new File( args0 );File outFile = new File( args1 );if ( outFile.exists() ) System.out.println( args1 + “ already exists“); return; if ( !inFile.exists() ) System.out.println( args0 + “ does not exist“); return; ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报