版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第9章 输入/输出操作,本章导读,Java应用不是一潭死水,经常需要和外界通信。 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件、内存或是网络连接。当程序需要写入数据的时候,就会开启一个通向目的地的流。 Java语言中输入/输出功能是通过流类来实现的,通过流,可以让数据以与设备无关的方式流动,提高程序的通用性。,本章要点, Java输入输出流分类 Java字节流、字符流、过滤流 Java文件操作类 Java标准输入输出流 Java对象序列化机制,9.1 基础知识,9.1.1 Java输入/输出概述 Java流分很多种。按照流中数据流动的方向,可
2、分为输入流和输出流,若数据是从程序外部流入程序内部,则称为输入流,若从程序内部流到程序外部,则称为输出流;按照流数据处理的基本单位,可分为字节流和字符流,若流中数据的基本单位是字节,则称为字节流,若基本单位是字符,则称为字符流;按照流功能的不同,可分为节点流和处理流,若流是直接从特定设备读出的,例如从磁盘或者内存读出,那么叫做节点流,使用节点流作为输入或者输出的流叫做处理流,也叫过滤流,或者转换流。 下面介绍几种重要的输入输出流和Java提供的输入输出类。,9.1.2 字节流,InputStram和OutputStream是java.io包中定义的两个抽象类,是所有字节流的父类。 InputS
3、tream类 InputStream是基本的输入流类,它是一个抽象类,它定义了输入流类共同的特性,是所有字节输入流的父类,字节输入流类的继承关系如图9.1所示。,InputStream类常用方法, OutputStream类,OutputStream是所有表示输出流的父类,它是一个抽象类,它定义了输出流类共同的特性,是锁有字节输出流的父类,OutputStream类常用方法, FileInputStream类,Java提供了专门的类对文件进行输入输出操作。例如FileInputStream和FileOutputStream,这两个类都属于字节流,它们对数据进行读写的基本单位是字节。 FileI
4、nputStream类是InputStream的子类,它实现了对文件的读取,是文件字节输入流。,FileInputStream类常用构造方法, FileOutputStream类,FileOutputStream类是OnputStream的子类,它实现了对文件的写入,是文件字节输出流。,import java.io.*; class ReadWriteFile public static void main(String args) String file1,file2 ; int ch = 0 ; file1 =readme.txt ; file2=readme.bak; try FileI
5、nputStream fis = new FileInputStream(file1); FileOutputStream fos=new FileOutputStream(file2); int size=fis.available(); System.out.println(字节有效数:+size); while (ch=fis.read()!=-1) System.out.write(ch); fos.write(ch); fis.close(); fos.close(); catch (IOException e) System.out.println(e.toString(); ,9
6、.1.3 字符流, Reader类 Reader类是所有字符输入流的父类,提供了字符输入流所有的基本功能,是所有字符输入流的父类。,Reader类常用方法, Writer类,Writer是所有字符输出流的父类,提供了字符输出流的所有基本功能,是所有字符输出流的父类 。,Writer类常用方法, InputStreamReader类,InputStreamReader类是字节流到字符流的转换桥类,它可以根据指定的编码方式,将字节输入流转换为字符输入流。, OnputStreamWriter类,OnputStreamWriter类是字节流到字符流的转换桥类,它可以根据指定的编码方式,将字节输出流转
7、换为字符输出流。,import java.io.*; public class StreamReaderWriterDemo public static void main(String args) try File file = new File(args0); FileInputStream fileInputStream = new FileInputStream(file); /为FileInputStream加上字符处理功能 InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); Fi
8、leOutputStream fileOutputStream = new FileOutputStream(backup_+args0); /为FileOutputStream加上字条处理功能 OutputStreamWriter outputStreamWriter= new OutputStreamWriter(fileOutputStream); int ch = 0; /以字符方式显示文件内容 while(ch = inputStreamReader.read() != -1) System.out.print(char) ch); outputStreamWriter.write(
9、ch); System.out.println(); inputStreamReader.close(); outputStreamWriter.close(); catch(ArrayIndexOutOfBoundsException e) System.out.println(没有指定文件); catch(IOException e) e.printStackTrace(); , FileReader类,FileReader类是Reader类的子类,它实现了从文件中读出字符数据,是文件的字符输入流。, FileWriter类,FileWriter类是Writer类的子类,它实现了将字符数据
10、写入文件中,是文件的字符输出流。,import java.io.*; class FileWriterDemo public static void main(String args) throws Exception String source = Now is the time for all good menn + to come to the aid of their countryn + and pay their due taxes.; char buffer = new charsource.length(); source.getChars(0, source.length()
11、, buffer, 0); FileWriter f0 = new FileWriter(file1.txt); for (int i=0; i buffer.length; i += 2) f0.write(bufferi); f0.close(); FileWriter f1 = new FileWriter(file2.txt); f1.write(buffer); f1.close(); FileWriter f2 = new FileWriter(file3.txt); f2.write(buffer,buffer.length-buffer.length/4,buffer.leng
12、th/4); f2.close(); , BufferedReader类,BufferedReader类是Reader类的子类,使用该类可以以行为单位读取数据。, BufferedWriter类,BufferedWriter类是Writer类的子类,使用该类可以以行为单位写入数据。,import java.util.*; import java.io.*; public class BufferedReaderWriterDemo public static void main(String args) try /缓冲System.in输入流 /System.in是位流,可以通过InputSt
13、reamReader将其转换为字符流 BufferedReader bufReader = new BufferedReader(new InputStreamReader(System.in); /缓冲FileWriter BufferedWriter bufWriter = new BufferedWriter(new FileWriter(args0); String input = null; /每读一行进行一次写入动作 while(!(input = bufReader.readLine().equals(quit) bufWriter.write(input); /newLine(
14、)方法写入与操作系统相依的换行字符,依执行环境当时的OS来决定该输出那种换行字符 bufWriter.newLine(); bufReader.close(); bufWriter.close(); catch(ArrayIndexOutOfBoundsException e) System.out.println(没有指定文件); catch(IOException e) e.printStackTrace(); , PrintWriter类,PrintWriter类是打印输出流,该流把Java语言的内构类型以字符形式输出到相应的输出流中,可以以文本方式浏览。,import java.io.
15、*; public class PrintWriterDemo public static void main(String args) throws FileNotFoundException String s; try BufferedReader in=new BufferedReader( new StringReader(ttt.txt); PrintWriter out=new PrintWriter( new BufferedWriter(new FileWriter(IODemo.out); int lineCount=1; while(s=in.readLine()!=nul
16、l ) out.println(lineCount+ + : + s); out.close(); catch(EOFException e) System.err.println(End of stream); catch(IOException e) e.printStackTrace(); ,9.1.4 过滤流,过滤器流是为某种目的过滤字节或字符的数据流。基本输入流提供的读取方法只能用来读取字节或字符,而过滤器流能够读取整型、双精度值和字符串,但需要一个过滤流类来包装输入流。 Java中定义了很多过滤流,例如BufferedOutputStream和BufferedInputStream
17、、 DataOutputStream和DataInputStream及PrintStream等。每一种过滤流都有自己适合使用的场所。, DataInputStream类,DataInputStream类是InputStream子类FilterInputStream的子类,实现DataInput接口,可以使一个应用程序以与机器无关的方式从基本输入流中读取 Java 的基本数据类型。,DataInputStream类常用方法, DataOutputStream类,DataOutputStream类是OutputStream子类FilterOutputStream的子类,实现DataOnput接口,
18、可以使一个应用程序以与机器无关的方式从基本输入流中读取 Java 的基本数据类型。,DataOutputStream类常用方法,import java.io.*; public class DataStreamDemo public static void main(String args) Member members = new Member(Justin,90), new Member(momor,95), new Member(Bush,88); try DataOutputStream dataOutputStream = new DataOutputStream(new FileO
19、utputStream(args0); for(Member member:members) dataOutputStream.writeUTF(member.getName();/写入UTF字符串 dataOutputStream.writeInt(member.getAge(); /写入int数据 dataOutputStream.flush(); /所有数据至目的地 dataOutputStream.close(); /关闭流 DataInputStream dataInputStream = new DataInputStream(new FileInputStream(args0);
20、 /读出数据并还原为对象 for(int i=0;imembers.length;i+) String name = dataInputStream.readUTF(); /读出UTF字符串 int score = dataInputStream.readInt();/读出int数据 membersi = new Member(name,score); dataInputStream.close(); /关闭流 /显示还原后的数据 for(Member member : members) System.out.printf(%st%d%n,member.getName(),member.get
21、Age(); catch(IOException e) e.printStackTrace(); ,class Member private String name; private int age; public Member(String name, int age) = name; this.age = age; public void setName(String name) = name; public void setAge(int age) this.age = age; public String getName() return nam
22、e; public int getAge() return age; , BufferedInputStream类,BufferedInputStream类是InputStream子类FilterInputStream的子类,实现Closeable接口。作为另一种输入流,创建 BufferedInputStream 时即创建了一个内部缓冲区数组,可以在此缓冲区进行数据操作。,BufferedInputStream类常用方法, BufferedOutputStream类,BufferedOutputStream类是OutputStream子类FilterOutputStream的子类,实现Clo
23、seable和Flushable接口。该类实现缓冲的输出流。,BufferedOutputStream类常用方法,import java.io.*; public class BufferedStreamDemo public static void main(String args) try byte data = new byte1; File srcFile = new File(args0); File desFile = new File(args1); BufferedInputStream bufferedInputStream= new BufferedInputStream(
24、new FileInputStream(srcFile); BufferedOutputStream bufferedOutputStream= new BufferedOutputStream(new FileOutputStream(desFile); System.out.println(复制文件:+srcFile.length()+字节); while(bufferedInputStream.read(data)!=-1) bufferedOutputStream.write(data); /将缓冲区中的数据全部写出 bufferedOutputStream.flush(); /关闭流
25、 bufferedInputStream.close(); bufferedOutputStream.close(); System.out.println(复制完成); catch(ArrayIndexOutOfBoundsException e) System.out.println(using:java UseFileStream src des); e.printStackTrace(); catch(IOException e) e.printStackTrace(); , PrintStream类,PrintStream类是打印输出流,它可以直接输出各种类型的数据。,import
26、java.io.*; public class PrintStreamDemo public static void main(String args) throws FileNotFoundException PrintStream printStream = new PrintStream(new FileOutputStream(new File(test.txt); printStream.println(1); printStream.close(); ,9.1.5 Java对文件的操作,Java提供File类、FileFilter接口、FilenameFilter接口和Random
27、AccessFile类对文件进行操作。, File类,File类提供了对文件和文件夹进行创建、删除等基本操作。,File类的常用方法,import java.io.*; import java.util.Date; public class filetest public static void main(String args) String filename=e:javabook第1题.txt; File myfile=new File(filename); if(!myfile.exists() System.err.println(filename+未找到!); return; if(
28、 myfile.isDirectory() System.err.println(文件对象+myfile.getName()+是目录!); File ds=new File(mydata); if(!ds.exists() ds.mkdir(); System.out.println(目录+ds.getAbsolutePath()+创建结束!); return; if(myfile.isFile() System.out.println(文件对象:+myfile.getAbsolutePath(); System.out.println(文件字节数:+myfile.length(); Syst
29、em.out.println(文件是否能读:+myfile.canRead(); if(myfile.canWrite() System.out.println(设置文件为只读:+myfile.setReadOnly(); System.out.println(文件是否可写:+myfile.canWrite(); Date fd=new Date(myfile.lastModified(); System.out.println(文件上次修改时间:+fd.toString(); , FileFilter接口,FileFilter接口用于过滤抽象路径名,此接口的实例可传递给File类的listF
30、iles(FileFilter)方法。, FilenameFilter接口,FilenameFilter接口用于过滤器抽象文件名。就像Windows经常使用的打开文件窗口,可以通过其“文件类型”下拉列表查看当前目录下特定类型的文件。这种功能就是使用文件过滤器实现的。, RandomAccessFile类,使用RandomAccessFile类可以读取文件任意位置的数据,RandomAccessFile类有一个指针,用于确定文件读写的位置。RandomAccessFile类既不是输入流的子类,也不是输出流的子类,该类既可以进行文件的输入操作,也可以进行文件的输出操作。,RandomAccessF
31、ile类常用方法,import java.io.IOException; import java.io.File; import java.io.RandomAccessFile; public class RandomFileTest public static void main(String args) throws Exception Student s1=new Student(1, zhangsan, 90.5); Student s2=new Student(2, lisi, 98.5); Student s3=new Student(3, wangwu, 96.5); File
32、 userDir=new File(System.getProperties().getProperty(user.dir); File tempFile=File.createTempFile(student, .tmp, userDir); tempFile.deleteOnExit(); RandomAccessFile raf=new RandomAccessFile(tempFile, rw); s1.write(raf); s2.write(raf); s3.write(raf); raf.seek(0); Student s=new Student(); for(long i=0
33、;iraf.length();i=raf.getFilePointer() s.read(raf); System.out.println(lenth:+raf.length()+,i=+i+ + s); raf.close(); Thread.sleep(5000); ,class Student int num; String name; double score; public Student() public Student(int num, String name, double score) this.num=num; =name; this.score=score; public void write(RandomAccessFile raf) throws IOException raf.writeInt(num); raf.writeUTF(name); raf.writeDouble(score); public void
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年液质联用技术在海洋天然产物鉴定中的应用
- 2026年基于AI定制化生物合成海洋活性肽技术突破
- 江苏省苏州市实验中学2026年初三下学期5月考化学试题试卷含解析
- 2026年新就业形态劳动者基本权益保障办法深度解析
- 安徽省滁州市定远县重点名校2025-2026学年初三下学期第一次阶段性评估检测试题化学试题含解析
- 辽宁省朝阳市名校2026届初三教学质量检测试题(一)化学试题文试题含解析
- 2026届江苏省盐城市东台市七校中考实战模拟考试生物试题理试卷含解析
- 2026届山西省右玉教育集团达标名校普通高中毕业班质量检查生物试题文试题含解析
- 北京师大附中市级名校2025-2026学年三月调考化学试题含解析
- 2026届陕西省榆林市榆阳区重点名校初三3月阶段测试化学试题含解析
- 2025统编版道德与法治小学六年级下册每课教学反思(附教材目录)
- 高中主题班会 安全第一课护航开学季!高中开学第一课主题班会安全教育课件
- 《经络与腧穴》课件-手厥阴心包经
- 后厨安全培训
- 零红蝶全地图超详细攻略
- 东风风神AX7使用手册201410
- 医生护士家长进课堂助教儿童医学小常识课件
- DLT 572-2021 电力变压器运行规程
- 主题二第2课我给学校提建议(教学设计)教科版六年级下册综合实践活动
- 材料成形工艺基础智慧树知到期末考试答案章节答案2024年华东交通大学
- 房屋验收授权委托书样本模板
评论
0/150
提交评论