




已阅读5页,还剩75页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java的输入 输出流 熟悉使用File类操作文件属性熟悉使用流读 写文件熟悉使用随机访问类读 写文件 本章目标 Java的输入 输出类库 流的概念流 是同一台计算机或网络中不同计算机之间有序运动的数据序列 数据序列 可以是原始的二进制字节数据 也可以是经过特定编码处理的有格式的数据 输入 输出流类用于实现I O操作的流类和接口在java io包中 Object InputStream OutputStream Reader Writer File RandomAccessFile Java的输入 输出类库 什么是File类 数据流类实现文件的顺序读写 RandomAccessFile类实现文件的随机读写 他们都不能对文件的属性进行访问 使用File类 可以访问文件属性信息 但是 它不提供读写文件的方法 下面列出File类的构造方法和实例方法 1 File类有三个构造方法File Stringfilename File StringdirectoryPath Stringfilename File Filef Stringfilename 其中 filename指文件名 directoryPath指文件所在的目录 f指文件的目录对象 2 实用方法 1 属性操作pubicStringgetName 获取文件名publicStringgetPath 获取文件路径publicStringgetAbsolutePath 获取文件绝对路径publiclonglength 获取文件的长度 单位是字节 publicStringgetParent 获取文件的父目录publicFilegetParentFile 获取文件的父目录publiclonglastModified 获取文件最后修改时间 时间是从1970年午夜至文件最后修改时刻的毫秒数 publicbooleancanRead 判断文件是否是可读的publicbooleancanWrite 判断文件是否可被写入publicbooleanexits 判断文件是否存在publicbooleanisFile 判断是不是一个正常文件publicbooleanisDirectroy 判断是不是一个目录publicbooleanisHidden 判断文件是不是隐藏文件 2 文件操作publicbooleanrenameTo Filedest 给文件换名publicbooleandelete 删除文件 3 目录操作publicbooleanmkdir 创建目录publicString list 以字符串形式列出目录publicFile listFiles 以File对象形式列出目录 要求 在e test 6目录下 创建一个文件 new txt 然后测试该文件的属性 练习一获得文件信息 importjava io publicclassfirst publicstaticvoidmain String args Filef1 newFile E test 6 new txt f1 createNewFile 创建文件new txtSystem out println 文件new txt存在吗 f1 exists System out println new txt的父目录是 f1 getParent System out println 文件new txt是可读的吗 f1 canRead System out println 文件new txt的长度 f1 length 练习二创建目录和文件 要求 在e test目录下创建一个子目录Students 在Students目录下创建文件new doc 程序算法 1 以e test和Students为参数 创建一个File对象 dir2 调用mkdir 方法 创建目录Students 3 调用createNewFile 方法 创建文件 new doc importjava io File importjava io IOException publicclassf1 publicstaticvoidmain String args Filef1 newFile d 1 2 f1 mkdir Filef2 newFile f1 new doc f2 createNewFile 现场编程 要求 列出c盘根目录下的所有子目录和文件 程序算法 1 以 c 为参数 创建对象 dir2 获取对象dir所包含的对象数组 文件和目录构成的对象 file 3 输出所包含的子目录4 输出所包含的文件 练习三删除文件和目录 要求 删除e test Students目录下的文件 new doc 然后删除目录 Students 程序结构 1 以文件名 E test Students new doc 为参数创建File对象 f2 以目录名 E test Students 为参数创建File对象 dir3 删除文件 f delete 4 删除目录 dir delete Importjava io publicclassf2 publicstaticvoidmain String args Filef newFile E test Students new doc Filedir newFile E test Students booleanb1 f delete 删除文件new docbooleanb2 dir delete 删除目录StudentsSystem out println 文件new doc成功删除了吗 b1 System out println 目录Students成功删除了吗 b2 什么是数据流 数据流是对各种流的总称 每个流本身是一个类 我们可以使用数据流读文件或写文件 输入流只能读文件不能写文件 输出流只能写文件不能读文件 1 数据流概念我们把数据的输入流和数据输出流统称为数据流 这里说的输入 输出是以程序为参考点而言 2 数据流分类按照数据流动方向分为 输入流和输出流按照数据流动成分分为 字节流 字符流 缓冲流 数据流 对象流等等 数据流模型为了便于理解数据流工作方式 对数据流进行抽象 得到数据流模型如图所示 在程序中 使用输入流 可从键盘或文件中读取数据 使用输出流 可向显示器 打印机或文件中传输数据 数据流 字节流 字节流有两个超类 也是两个抽象类 它们是字节输入流 InputStream 和字节输出流 OutputStream InputStream类是所有字节输入流的超类 OutputStream类是所有字节输出流的超类 1 InputStream类下面是对InputStream类的描述 1 InputStream的类层次图InputStream的类层次图如图所示 2 InputStream类的常用方法intread 输入流调用该方法从数据源中读取单个字节的数据 该方法返回字节值 0 255之间的一个整数 如果未读出字节就返回 1 intread byteb 输入流调用该方法从数据源中试图读取b length个字节到b中 返回实际读取的字节数目 如果到达文件的末尾 则返回 1 intread byteb intoff intlen 输入流调用该方法从数据源中试图读取len个字节到b中 并返回实际读取的字节数目 如果到达文件的末尾 则返回 1 参数off指定从字节数组的某个位置开始存放读取的数据 voidclose 输入流调用该方法关闭输入流 longskip longnumBytes 输入流调用该方法跳过numBytes个字节 并返回实际跳过的字节数目 2 OutputStream类下面是对OutputStream类的描述 1 OutputStream类层次图 2 OutputStream类的常用方法voidwrite intn 输出流调用该方法向输出流写入单个字节 voidwrite byteb 输出流调用该方法向输出流写入一个字节数组voidwrite byteb intoff intlen 从给定字节数组中 起始于偏移量off处 取len个字节写到输出流voidclose 关闭输出流字节流有多个子类 能直接对文件进行读或写的子类有FileInputStream和FileOutputStream 下面是它们的构造方法 1 FileInputStream类的构造方法 publicFileInputStream Stringname throwsFileNotFoundExceptionpublicFiIeInputStream Filefile throwsFileNotFoundException其中 name为文件名 file为文件类File对象 即可以以文件名或File对象构造文件输入流对象 通过文件输入流对象读文件 FileOutputStream类的构造方法 publicFileOutputStream Stringname throwsFileNotFoundExceptionpublicFileOutputStrearm Filefile throwsFileNotFoundExceptionpublicFileOutputStrearm Stringname booleanappend throwsFileNotFoundException其中 name为文件名 file为File对象 append表示文件的写入方式 append的值为false时 为重写方式 即要写入的内容从文件开头写入 覆盖以前的文件内容 当append的值为true时 为添加方式 即要写入的内容添加到文件的尾部 append的默认值是false 可以以文件名或File对象构造文件输出流对象 通过文件输出流对象写文件 练习四用类FileInputStream读文件 要求 读文件e read txt的内容 并输出到客户端 程序算法 1 以文件名 e read txt 为参数 构造文件对象 f2 以文件对象f为参数 构造输入流 in3 每次从in中读取n个字节 保存在数组b中4 n等于 1时结束循环 否则 把数组b以字符串的方式输出到客户端 重复步骤3 publicclassf1 publicstaticvoidmain String args Filef newFile d 1 new txt try byteb newbyte 5 每次读取数据保存在该字节数组中intn 0 实际读取的字节数FileInputStreamin newFileInputStream f while n in read b 1 Stringtemp newString b 0 n System out print n System out print temp in close catch IOExceptione e printStackTrace 练习五用类FileOutputStream写文件 要求 把e read txt中的内容 添加到服务器的e write txt文件中 程序设计 1 以文件名 e read txt 为参数 构造文件对象 f2 以文件对象f为参数 构造输入流 in4 以 e write txt 为参数 创建一个输出流 wf5 每次从in中读取n个字节 保存在数组b中6 n等于 1时结束循环 否则 把数组b以字符串的方式写到输出流wf中去 重复步骤3 packagechap1 importjava io File importjava io FileInputStream importjava io FileOutputStream importjava io IOException publicclassf2 publicstaticvoidmain String args Filef newFile e read txt try FileInputStreamin newFileInputStream f byteb newbyte 10 intn 0 FileOutputStreamwf newFileOutputStream e write txt while n in read b 1 wf write b 0 n System out println n wf close in close catch IOExceptione e printStackTrace 练习六用类FileOutputStream写文件 要求 从控制台输入一个数据 然后把这个数据保存到e盘下的test dat文件中 程序设计 1 从控制台读取一个输入流2 以 e test dat 为参数 创建一个输出流对象fos4 把接收到的输入流写入到输出流文件中去 5 关闭输出流 importjava io publicclassTestFileOutputStream publicstaticvoidmain Stringargs try System out print 请输入数据 intcount n 128 bytebuffer newbyte n count System in read buffer 读取标准输入流FileOutputStreamfos newFileOutputStream test dat 创建文件输出流对象fos write buffer 0 count 写入输出流fos close 关闭输出流System out println 已将上述输入数据输出保存为test dat文件 catch IOExceptionioe System out println ioe catch Exceptione System out println e 字节缓存流 由于使用文件字节流读 写文件效率不高 在实际应用中 常常使用字节缓存流来读 写文件 字节缓存流有 字节缓存输入流 BufferedInputStream 和字节缓存输出流 BufferedOutputStream 常用构造方法 BufferedInputStream类的构造方法BufferedInputStream InputStreamin BufferedInputStream InputStreamin intsize BufferedOutputStream类的构造方法BufferedOutputStream OutputStreamout BufferedOutputStream OutputStreamout intsize 其中 in是字节输入流对象 out是字节输出流对象 size是缓冲区大小 实际应用中 为了提高文件读写的效率 FileInputStream流经常和BufferedInputStream流配合使用 FileOutputStream流经常和BufferedOutputStream流配合使用 下面是构造字节缓存流的方法 1 构造字节缓存输入流的步骤假设需要使用字节缓存流读文件A txt 则需要对文件A txt进行两次封装 第一步 构造文件字节输入流FileInputStreamin newFileInputStream A txt 第二步 构造缓存输入流BufferedInputStreaminbuffer newBufferedInputStream in 这时 我们就可以让inbuffer调用read 方法读取文件 A txt 的内容 Inbuffer读取文件的过程中 会进行缓存处理 提高读取的效率 构造字节缓存输出流的步骤假设需要使用字节缓存流写文件B txt 则需要对文件B txt进行两次封装 第一步 构造文件字节输出流FileOutputStreamout newFileOutputStream B txt 第二步 构造缓存输出流BufferedOutputStreamoutbuffer newBufferedOutputStream out 这时 outbuffer调用write 方法向文件 B txt 写入内容时会进行缓存处理 提高写入的效率 需要注意的是 写入完毕后 须调用flush 方法将缓存中的数据存入文件 练习六用类BufferedInputStream读文件 要求 用字节缓存读文件e read txt的内容 并输出到客户端 程序算法 1 以文件名 e read txt 为参数 构造文件对象 f2 以文件对象f为参数 构造文件字节输入流 in3 以文件字节输入流in为参数 构造缓存输入流 bufferin4 每次从bufferin中读取n个字节 保存在数组c中5 n等于 1时结束循环 否则 把数组c以字符串的方式输出到客户端 重复步骤4 publicclassf2 publicstaticvoidmain String args Filef newFile e read txt try FileInputStreamin newFileInputStream f BufferedInputStreambufferin newBufferedInputStream in bytec newbyte 90 intn 0 while n bufferin read c 1 Stringtemp newString c 0 n System out print temp bufferin close in close catch IOExceptione e printStackTrace BufferedInputStream类只是在FilterInputStream类 或者说InputStream类 的基础上添加了一个读取缓冲功能 因此 也有人说它本来应该合并到InputStream中去才对 不过 我们更关心的是 到底缓冲能带来多大的性能提高呢 练习七就是一个测试程序 读者有兴趣的话可以亲自上机验证一下 我们在自己的计算机上对输入流的缓冲与否做了一个测试 测试读取的为一图片文件 大小约为2 52M 结果表明 它们二者之间的速度差别还是非常明显的 对于小输入流的读取况且如此 那么对于大输入流情况 则缓冲带来的效果就可想而知了 importjava io publicclassTestBufferedInputStream publicstaticvoidmain Stringargs throwsIOException try 创建文件输入流对象fis 为了取得明显效果 Big dat文件中编辑了大量数据InputStreamfis newBufferedInputStream newFileInputStream Big dat System out println 测试开始 while fis read 1 从文件输入流fis中读取字节数据 读取整个文件输入流 System out println 测试结束 fis close 关闭fis输入流 catch IOExceptionioe System out println I O异常 现场编程用类BufferedOutputStream写文件要求 改编练习六中的例题 用BufferedOutputStream来实现写文件的操作 字符流 前面我们学习了使用字节流读 写文件 但是字节流不能直接操作Unicode字符 所以java提供了字符流 由于汉字在文件中占用2个字节 如果使用字节流读写文件会出现乱码现象 采用字符流就可以避免乱码 在Unicode字符集中 一个汉字被看作一个字符 字符流有两个超类 也是两个抽象类 字符输入流 Reader 和字符输出流 Writer Reader类是所有字符输入流的父类 Writer类是所有字符输出流的父类 1 Reader类下面是对Reader类的描述 1 Reader的常用方法intread 输入流调用该方法从源中读取一个字符 该方法返回一个参数 0 65535之间的一个整数 Unicode字符值 如果未读出字符就返回 1 intread charb 输入流调用该方法从源中读取b length个字符到字符数组b中 返回实际读取的字符数目 如果到达文件的末尾 则返回 1 intread charb intoff intlen 输入流调用该方法从源中读取len个字符并存放到字符数组b中 返回实际读取的字符数目 如果到达文件的末尾 则返回 1 其中 off参数表明 从数组b的off位移处开始存放数据 voidclose 输入流调用该方法关闭输入流longskip longnumBytes 输入流调用该方法跳过numBytes个字符 并返回实际跳过的字符数目 2 Reader的类层次Reader类的层次结构图如图6 4所示 Reader类层次 2 Writer类下面是对Writer类的描述 1 Writer的常用方法voidwrite intn 向输出流写入一个Unicode字符值 数字 voidwrite charb 向输出流写入一个字符数组voidwrite charb intoff intlength 从给定字符数组中其实与偏移量off处取len个字符写到输出流 voidwrite Stringstr 向输出流写入一个字符串voidclose 关闭输出流 2 Writer的类层次Writer类的层次结构图如图所示 Writer类层次 字符流有多个子类 能直接对文件进行读或写的子类有 文件字符输入流 FileReader 和文件字符输出流 FileWriter 下面是它们的构造方法 FileReader类的构造方法 publicFileReader Filefile throwsIOExceptionpublicFileReader Stringname throwsIOException其中 name为文件名 file为File对象 即可以用文件名或File对象构造文件输入流对象 通过文件输入流对象读文件 FileWriter类的构造方法 publicFileWriter Filefile throwsIOExceptionpublicFileWriter Stringname throwsIOExceptionpublicFileWriter Filefile booleanappend throwsIOExceptionpublicFileWriter Stringname booleanappend throwsIOException其中 name为文件名 file为File对象 append表示文件的写入方式 append的值为false时 为重写方式 即要写入的内容从文件开头写入 覆盖以前的文件内容 当append的值为true时 为添加方式 即要写入的内容添加到文件的尾部 append的默认值是false 可以以文件名或File对象构造文件输出流对象 通过文件输出流对象写文件 练习八用类FileReader读文件 要求 在客户端显示文件e read txt的内容 程序算法 1 以文件名 e read txt 为参数 构造文件对象 f2 以文件对象f为参数 构造字符输入流 in3 每次从in中读取n个字符 保存在字符数组b中4 n等于 1时 结束循环 否则 把数组b以字符串的方式输出到客户端 重复步骤3 修改P38页的练习题 要求使用FileWriter写文件 字符缓存流 由于使用FileReader类和FileWriter类读写文件效率不高 在实际应用中 常常使用字符缓存流来读写文件 字符缓存流有 字符缓存输入流 BufferedReader 和字符缓存输出流 BufferedWriter 常用构造方法 1 BufferedReader类的构造方法BufferedReader Readerin BufferedReader Readerinintsize 2 BufferedWriter类的构造方法BufferedWriter Writerout BufferedWriter Writeroutintsize 其中 in是字符输入流对象 out是字符输出流对象 size是缓冲区大小 实际应用中 为了提高文件读写的效率 FileReader流经常和BufferedReader流配合使用 FileWriter流经常和BufferedWriter流配合使用 下面是构造字符缓存流的方法 1 构造字符缓存输入流的步骤 假设需要使用字符缓存流读文件A txt 则需要对文件A txt进行两次封装 第一步 构造文件字符输入流FileReaderin newFileReader A txt 第二步 构造字符缓存输入流BufferedReaderinbuffer BufferedReader in 这样 我们就可以让inbuffer调用readLine 方法读取文件内容 inbuffer读取文件的过程中 会进行缓存处理 提高读取的效率 2 构造字符缓存输出流的步骤 假设需要使用字符缓存流写文件B txt 则需要对文件B txt进行两次封装 第一步 构造文件字符输出流FileWriterout newFileWriter B txt 第二步 构造缓存输出流BufferedWriteroutbuffer BufferedWriter out 这样 我们就可以让outbuffer调用write 方法向文件写入内容时会进行缓存处理 提高写入的效率 需要注意的是 写入完毕后 须调用flush 方法将缓存中的数据存入文件 练习八用类BufferedRdader读文件要求 用字符缓存读文件e read txt的内容 并输出到客户端 程序算法 1 以文件名 e read txt 为参数 构造文件对象 f2 以文件对象f为参数 构造输入流 in3 以输入流in为参数 构造缓存输入流 bufferin4 每次从bufferin中读取一行数据 保存在字符串str中5 str等于null时结束循环 否则 把字符串str输出到客户端 重复步骤4 特色 Java输入输出的一个特色就是可以组成使用 包装 各种输入输出流为功能更强的流 因此 才设计定义了这么多各具功能的输入输出流类 下面请看一个程序例子 FileReader和BufferedReader的组合使用 importjava io publicclassTestFileReader publicstaticvoidmain Stringargs try FileReaderfr newFileReader fuwa dat BufferedReaderbfr newBufferedReader fr Stringstr bfr readLine while str null System out println str str bfr readLine catch IOExceptionioe System out println ioe catch Exceptione System out println e 练习九用类BufferedWriter写文件要求 把 e read txt 文件内容复制到e write txt 文件中 程序算法 1 创建输入 输出文件对象fread fwrite2 对fread进行两次封装 得到缓存输入流 bufferin3 对fwrite进行两次封装 得到缓存输出流 bufferout4 从bufferin读入一行数据 保存到字符串str中5 str等于null时 循环结束 否则 把str写入输出流 bufferout str输出到客户端 重复步骤4 FileWriter和BufferedWriter的组合使用 importjava io publicclassTestFileWriter publicstaticvoidmain String args try InputStreamReaderisr newInputStreamReader System in BufferedReaderbr newBufferedReader isr FileWriterfw newFileWriter out dat BufferedWriterbw newBufferedWriter fw Stringstr br readLine while str equals bw write str 0 str length bw newLine str br readLine br close bw close catch IOExceptione e printStackTrace 注意 bw newLine 语句在不同系统下实际输出的行分隔符是不同的 在Windows下是 r 回车 和 n 换行 在Unix Linux下只有 n 而在MacOS下则是 r 因此 如果在Windows下用记事本程序打开Unix Linux下编辑的文本文件 就会看不到分行的效果 要想恢复原来的分行效果 可以通过将每一个 n 转换为 r 和 n 这样 就可以恢复Unix Linux下分行的效果了 下面请看实现这一转换过程的一个程序示例 Unix文本文件转换为Windows文本文件 importjava io publicclassUnix 2 Win publicstaticvoidmain String args try FileReaderfileReader newFileReader unix dat FileWriterfileWriter newFileWriter win dat char line r n intch fileReader read while ch 1 直到文件结束 if ch n fileWriter write line 实施转换elsefileWriter write ch 不变ch fileReader read 读取下一个字符 fileReader close 关闭输入流fileWriter close 关闭输出流 catch IOExceptione e printStackTrace Unix下编辑的文本文件unix dat在Windows下用记事本打开 如下图所示 当执行上述程序 对Unix dat文件进行读取并转换保存为win dat后 再用记事本打开 显示效果如下图所示 数据流 前面的字符流只能对文件进行字符类型的数据读写 字节流只能对文件进行字节类型的数据读写 只有数据流才能对文件进行各种数据类型 java基本类型数据 进行读写 数据流包括数据输入流 DataInputStream 和数据输出流 DataOutputStream 数据流的构造方法1 数据输入流 DataInputStream 的构造方法是DataInputStream InputStreamin 2 数据输出流 DataOutputStream 的构造方法是DataOutputStream OutputStreamin 2 数据流的常用方法 数据输入流常用方法如表所示 数据输出流常用方法如表所示 练习十要求 使用DataOutputStream类把一组数据写入到一个E盘下面中的invoic txt文件中去 程序结构 要求写的数据是三个数组 内容如下 Stringdescs 衬衫 背包 doubleprices 150 24 100 3 intunits 12 8 步骤 1 用 e invoic txt 为参数创建一个文件输出流对象wf 2 以wf作为参数创建一个数据输出流对象dw 3 循环写入每个数组中每个元素的值到文件中去 这里要根据数组类型的不同调用不同的写入方法 importjava io DataOutputStream importjava io FileOutputStream importjava io IOException publicclassdd publicstaticvoidmain String args try FileOutputStreamou newFileOutputStream e invoice dat DataOutputStreamwf newDataOutputStream ou Stringdescs 衬衫 背包 doubleprices 150 24 100 3 intunits 12 8 for inti 0 i descs length i wf writeUTF descs i wf writeChar t wf writeDouble prices i wf writeChar t wf writeInt units i wf close ou close catch IOExceptione e printStackTrace 练习十一要求 使用DataInputStream类读取上述程序所生成的invoice dat文件程序结构 在控制台输出invoice txt的内容 并且计算出总金额步骤 1 用 e invoic txt 为参数创建一个文件输入流对象f 2 以f作为参数创建一个数据输出流对象in 3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年实验室卫生员考试试题及答案
- 2025年内科医学考试题目及答案
- DB15-T 4055-2025 河套枸杞病虫草害防治技术规程
- 承包土地种植观赏花卉合同书6篇
- 广西安全员证考试试题及答案
- 指南专业考试试题及答案
- 2025年北京网约车资格证试题及答案
- 公路专业综合试题及答案
- 育种专业面试题及答案
- 体育专业理论试题及答案
- 2024年铝材购销的合同范本
- 2022年内分泌医疗质量控制评价体系与考核标准
- T-CACM 1560.1-2023 中医养生保健服务(非医疗)技术操作规范推拿
- 护理美学-第三章 护士审美修养
- 篮球教学活动设计方案
- (高清版)JTG 5211-2024 农村公路技术状况评定标准
- 大学生生涯发展展示 (修改版)
- DB32T4062-2021城市轨道交通工程质量验收统一标准
- (正式版)JBT 14897-2024 起重磁铁安全技术规范
- 三D打印公开课
- 西方节日-英文介绍
评论
0/150
提交评论