




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java语言概述,1,第十六讲输入输出系统和文件处理,西亚斯学院计算机系姜斌2014年,Java语言概述,2,主要内容,Java输入输出的类库,流的概念基于标准输入输出的IO操作文件读写及随机访问Java的文件管理,一、Java输入输出的类库,流的概念,流的概念(Stream),流(Stream)是指计算机各部件之间的数据流动。按照数据的传输方向,流可分为输入流与输出流,从流的内容上划分,流分为字符流和字节流。输入输出流数据流分为输入流和输出流两大类。数据流是Java程序发送和接收数据的一个通道,通常应用程序中使用输入流读出数据,输出流写入数据,就好像数据流入到程序或从程序中流出。,Java语言概述,4,流输入输出的图示,以“程序”为参照,进行输入输出,程序,输入(input),输出(output),文件/键盘/显示器等,Java语言概述,6,流式输入输出的应用,在Java中,应用程序所需要读入的数据和写出的数据是通过I/O操作实现的。这些读写数据的源或目的包括文件、内存、网络连接等,其中,最常用的是文件。关于处理流式输入输出的类放置在Java.io包下的。,Java语言概述,7,输入输出流的类别,Java中的输入输出流可以分为两大类:输入流和输出流。输入流是能够读取字节的对象,而输出流是能够写字节序列的对象。最初设计的输入输出类是面向字节流的,即能够支持8位的字节流,分别由派生自抽象类InputStream和OutputStream的类层次来表示。但是随着对国际化支持的需求出现,面向字节的流不能很好地处理使用Unicode(每个字符使用两个字节)的数据,因此引入了派生自抽象类Reader和Writer的类层次,用于读写双字节的Unicode字符,而不是单字节字符。,Java语言概述,8,Java输入输出类库继承关系,面向字节流的输入输出类层次关系图,Java语言概述,9,处理Unicode字符的输入输出类层次关系图,Java语言概述,10,三种类型的输入输出类,1字节流:从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。InputStream、OutputStreamFileInputStream、FileOutputStreamPipedInputStream、PipedOutputStreamByteArrayInputStream、ByteArrayOutputStreamFilterInputStream、FilterOutputStreamDataInputStream、DataOutputStreamBufferedInputStream、BufferedOutputStream,Java语言概述,11,2字符流:从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。Reader、WriterInputStreamReader、OutputStreamWriterFileReader、FileWriterCharArrayReader、CharArrayWriterPipedReader、PipedWriterFilterReader、FilterWriterBufferedReader、BufferedWriterStringReader、StringWriter,Java语言概述,12,3对象流ObjectInputStream、ObjectOutputStream4其它帮助类文件处理:File、RandomAccessFile;接口DataInput、DataOutput、ObjectInput、ObjectOutput;,Java语言概述,13,InputStream-字节输入流的主要方法,从流中读取数据:intread();/读取一个字节,返回值为所读的字节intread(byteb);/读取多个字节,放置到字节数组b中,通常读取的字节数量为b的长度,返回值为实际读取的字节的数量intread(byteb,intoff,intlen);/读取len个字节,放置到以下标off开始字节数组b中,返回值为实际读取的字节的数量intavailable();/返回值为流中尚未读取的字节的数量longskip(longn);/读指针跳过n个字节不读,返回值为实际跳过的字节数量,Java语言概述,14,InputStream,关闭流:close();/流操作完毕后必须关闭使用输入流中的标记:voidmark(intreadlimit);/记录当前读指针所在位置,readlimit表示读指针读出readlimit个字节后所标记的指针位置才失效voidreset();/把读指针重新指向用mark方法所记录的位置booleanmarkSupported();/当前的流是否支持读指针的记录功能,Java语言概述,15,OutputStream-字节输出流的主要方法,输出数据:voidwrite(intb);/往流中写一个字节bvoidwrite(byteb);/往流中写n个字节数组bvoidwrite(byteb,intoff,intlen);/把字节数组b中从下标off开始,长度为len的字节写入流中flush()/刷空输出流,并输出所有被缓存的字节由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。关闭流:close();/流操作完毕后必须关闭,FileInputStream和FileOutputStream的实例,主要负责完成对本地磁盘文件的顺序输入和输出的InputStream和OutputStream子类;见附书例子10.1和10.2注意对于汉字数据的处理问题!,二、基于标准输入输出的IO操作,Java语言概述,18,回顾:标准输入输出对象,在Java里,还提供了“标准输入流”和“标准错误输出流”,分别对应于System.in和System.err。System.out和System.err已经被封装成PrintStream对象,因此具有强大的输出功能;但是System.in是InputStream的一个子类对象,输入操作功能有限,最好在使用的时候通过其他处理流进行封装处理。见附书例子:例10.4注意:system.in对象不能很好处理中文数据,流的封装处理,为了便于流的处理,Java定义了用于处理功能的处理流,如转换流和缓冲流,它们可以通过封装其他流,来进行流的处理。(类似于现实中大管套小管),程序,标准输入(System.in),键盘,字节字符转换,输入缓冲,字节到字符转换流,InputStreamReader,OutputStreamWriter是字符流通向字节流的桥梁,可以在输入和输出时进行字节流到字符流的转换InputStreamReader(InputStreamin)创建使用默认字符集的InputStreamReaderOutputStreamWriter(OutputStreamout)创建使用默认字符编码的OutputStreamWriter,缓冲字符流BufferedReader,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。BufferedReader(Readerin)创建一个默认大小输入缓冲区的缓冲字符输入流。BufferedReader(Readerin,intsz)创建一个使用指定大小输入缓冲区的缓冲字符输入流。,Java语言概述,23,BufferedReader缓冲流的使用通过建立一个缓冲输入流BufferedReader,就不会每次从流中读取一个字符,而是读取数据块,从而提供读写效率。优势:优化读写,一些方法提供了手动的输入控制。形式上,可以封装不同的流,如:1.BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in);2.BufferedReaderin=newBufferedReader(newFileReader(“file.txt”);,Java语言概述,24,BufferedWriter类publicvoidnewLine();/可以输出一个新行publicvoidflush();publicvoidclose();,【例9.9】标准输入输出。程序代码见StandardIO.java。运行结果如下:EnterString:abcdeAbcdeEnteranInteger:-12345-12345EnteraDouble:-12345-12345.0,Java语言概述,26,PrintStream,voidprint(Strings)Printastring.打印一个字符串voidprintln()Terminatethecurrentlinebywritingthelineseparatorstring.打印字符串并且输出一个换行符,Java语言概述,27,【例9.10】结构化数据输入输出和数据分隔。程序代码见TokenStandardIO.java。运行结果如下:Thenumber1personEntername,age,salary,married(optional),pleaseseparatefieldsby:张三:25:3000Thenumber2personEntername,age,salary,married(optional),pleaseseparatefieldsby:李四:35:10000:YThenumber3personEntername,age,salary,married(optional),pleaseseparatefieldsby:王大五:30:4000:F,Java语言概述,28,Outputthedataofpeople:Thenumber1personname:张三;age:25;salary:3000.0;married:FThenumber2personname:李四;age:35;salary:10000.0;married:YThenumber3personname:王大五;age:30;salary:4000.0;married:F,Java语言概述,29,三、文件读写类(字符流),文件是保存在磁盘等二级存储设备上的数据,由记录组成,文件中的一行可以看作是一条记录。对文件的读写和标准输入输出是十分类似的,需要注意的是要采用专门对文件操作的流,并应该在合适的时候关闭流,否则系统资源无法得到释放。对于输出流,如果不执行关闭流的操作,则缓冲区的数据将有可能没有写入文件,造成文件损坏。FileReader文件读入见附书例子10.5,Java语言概述,30,FileWriter文件写出,见附书例子10.6PublicFileWriter(StringfileName);PublicFileWriter(StringfileName,booleanappend);voidwrite(charcbuf)写入字符数组。abstractvoidwrite(charcbuf,intoff,intlen)写入字符数组的某一部分。voidwrite(intc)写入单个字符。voidwrite(Stringstr)写入字符串。,Java语言概述,31,四、Java的文件管理,对于文件或目录的操作,如创建,重命名、删除、列表显示等,需要使用Java的文件管理File类。文件或目录的生成publicFile(Stringpath);/*如果path是实际存在的路径,则该File对象表示的是目录;如果path是文件名,则该File对象表示的是文件。*/publicFile(Stringpath,Stringname);/path是路径名,name是文件名publicFile(Filedir,Stringname);/dir是路径名,name是文件名,Java语言概述,32,文件属性测试booleanexists();/测试当前File对象所指示的文件是否存在booleancanWrite();/测试当前文件是否可写booleancanRead();/测试当前文件是否可读booleanisFile();/测试当前文件是否是文件(不是目录)booleanisDirectory();/测试当前文件是否是目录,Java语言概述,33,文件或目录操作普通文件信息和工具booleancreateNewFile();/根据当前对象生成一个由该对象指定的文件longlastModified();/得到文件最近一次修改的时间longlength();/得到文件的长度,以字节为单位booleandelete();/删除当前文件目录操作booleanmkdir();/根据当前对象生成一个由该对象指定的路径Stringlist();/列出当前目录下的文件,Java语言概述,34,【例9.13】文件管理。先在指定目录下创建名为“temp”的子目录,在“temp”目录下创建两个文件:“temp1.txt”、“temp2.txt”,然后列表显示指定目录;重命名“temp1.txt”为“temp.txt”,然后列表显示“temp”目录;删除文件“temp2.txt”,然后列表显示“temp”目录。程序代码见FileDirectory.java。运行命令:E:demojavaFileDirectory,Java语言概述,35,运行结果如下:显示指定目录的内容1.Ppt2.Xls3.DocFileDirectory.javaFileDirectory.classE:demotemptemp1.txttemp2.txt更改文件名后,显示temp子目录的内容temp.txttemp2.txt删除文件后,显示temp子目录的内容temp.txt,Java语言概述,36,File实际上Java抽象数据类型,可以代表一个目录或文件,系统中可能并不存在此文件或路径(exist方法)对实际中不存在的文件和路径无法操作,所以要在之前创建它(createnewFile方法)文件操作和信息是和操作系统相关联的,如果操作系统不同,显示的信息可能也不同对文件的操作可能要抛出IOException异常,Java语言概述,37,小结:,流的概念,输入输出类的分类标准输入输出的IO操作流的封装使用,文件字符流读写Java的文件管理,StringTokenizer类使用参考,Java语言概述,39,StringTokenizer类,另外一个很有用的和字符串相关的类是java.util.StringTokenizer类。这个类用来把一个字符串按照特殊字符分为子串来进行查询和处理。例如,去处理一个字符串”IamlearningJavanow,你可以创建一个stringTokenizer对象把字符值封装,然后返回若干单独的单词来查询和处理。如何使StringTokenizer去识别单独的单词,你可以在创建对象时指定一系列的字符作为分隔符。每一个分隔符是一个字符。分隔符
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-湖南-湖南垃圾清扫与处理工一级(高级技师)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-湖南-湖南不动产测绘员三级(高级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-湖北-湖北热处理工四级(中级工)历年参考题库含答案解析
- 主题公园沉浸式体验项目开发中的虚拟现实与增强现实技术应用研究报告
- 2025年全民健身设施与社区体育健身设施智能化升级报告
- 2025年事业单位工勤技能-海南-海南假肢制作装配工三级(高级工)历年参考题库含答案解析
- 2025-2030中国篮球鞋行业竞争态势及消费趋势预测报告
- 2025-2030中国空调冲压拉深行业市场运营模式及未来发展动向预测报告
- 2024版股权代持协议和股权转让协议
- 2025年事业单位工勤技能-广西-广西农业技术员五级(初级工)历年参考题库典型考点含答案解析
- 数学家华罗庚课件
- 2024年样板注塑机转让合同范本
- 施工现场安全技术交底全集
- 医院耗材供货服务方案
- 丹江口事业单位笔试真题2024
- 云南大学附属中学数学2023-2024学年七年级上学期开学分班考试数学试题
- 2024年施工承包合同电子版(5篇)
- GB/T 3648-2024钨铁
- ISO28000:2022供应链安全管理体系
- 自来水厂处理工艺流程图
- 食品安全基础
评论
0/150
提交评论