欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    第10章输入输出流.ppt

    • 资源ID:3122501       资源大小:2.46MB        全文页数:82页
    • 资源格式: PPT        下载积分:8
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要8
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第10章输入输出流.ppt

    第10章 输入、输出流,输入/输出类库,Java的输入/输出是以流的方式来处理的。 按流的方向可以分为输入流和输出流 Java中流有字节流和字符流之分,说明,只能从输入流读取数据,不能写入数据 只能向输出流写入数据,不能读取数据 对输入流,不必关心其源端是什么文件或设备,只要从流中读取数据即可 对输出流,不必关心其目标具体情况,只要向流中写入数据即可,创建一个File对象的构造方法有3个: File(String filename); File(String directoryPath,String filename); File(File f, String filename); 说明:File类在io包里,所以使用之前要导入该包: import java.io.*; 本章使用的类基本上都在这个包里,10.1 File类,public String getName() 获取文件的名字。 public boolean canRead() 判断文件是否是可读的。 public boolean canWrite() 判断文件是否可被写入。 public boolean exits() 判断文件是否存在。 public long length() 获取文件的长度(单位是字节)。 public String getAbsolutePath() 获取文件的绝对路径。 public String getParent() 获取文件的父目录。 public boolean isFile() 判断文件是否是一个普通文件,而不是目录。 public boolean isDirectroy() 判断文件是否是一个目录。 public boolean isHidden() 判断文件是否是隐藏文件。 public long lastModified() 获取文件最后修改的时间(时间是从1970年午夜至文件最后修改时刻的毫秒数)。,10.1.1 文件的属性,import java.io.*; public class Example10_1 public static void main(String args) File f = new File(“C:ch10“,“Example10_1.java“); System.out.println(f.getName()+“是可读的吗:“+f.canRead(); System.out.println(f.getName()+“的长度:“+f.length(); System.out.println(f.getName()+“的绝对路径:“+f.getAbsolutePath(); File file = new File(“new.txt“); System.out.println(“在当前目录下创建新文件“+file.getName(); if(!file.exists() try file.createNewFile();/调用该方法会引起IOException System.out.println(“创建成功“); catch(IOException exp) ,1创建目录 File对象调用方法:public boolean mkdir()创建一个目录,如果创建成功返回true,否则返回false(如果该目录已经存在将返回false),10.1.2 目录,如果File对象是一个目录,那么该对象可以调用下述方法列出该目录下的文件和子目录。 public String list() 用字符串形式返回目录下的全部文件。 public File listFiles() 用File对象形式返回目录下的全部文件。,2列出目录中的文件,有时需要列出目录下指定类型的文件。可以使用File类的下述两个方法,列出指定类型的文件: public String list(FilenameFilter obj) 该方法用字符串形式返回目录下的指定类型的所有文件。 public File listFiles(FilenameFilter obj) 该方法用File对象形式返回目录下的指定类型所有文件。,FilenameFilter,上述两个方法的参数FilenameFilter是一个接口,该接口有一个方法: Public boolean accept(File dir,String name) 使用list方法时,需要向该方法传递一个实现FilenameFilter接口的对象,list执行时,不断回调接口方法accept,当接口方法返回true时,list方法就将名字为name的文件保存在返回的数组中,import java.io.*; public class Example10_2 public static void main(String args) File dir=new File(“.“); FileAccept fileAccept=new FileAccept(); fileAccept.setExtendName(“java“); String fileName=dir.list(fileAccept); for(String name:fileName) System.out.println(name); ,import java.io.*; public class FileAccept implements FilenameFilter private String extendName; public void setExtendName(String s) extendName=“.“+s; public boolean accept(File dir,String name) /重写接口中的方法 return name.endsWith(extendName); ,当使用File类创建一个文件对象后,例如 File file=new File(“c:myletter“,“letter.txt“); 如果c:myletter目录中没有名字为letter.txt文件,文件对象file调用方法: public boolean createNewFile(); 可以在c:myletter目录中建立一个名字为letter.txt的文件。文件对象调用方法 public boolean delete() 可以删除当前文件,例如: file.delete();,10.1.3 文件的创建与删除,当要执行一个本地机上的可执行文件时,可以使用java.lang包中的Runtime类。首先使用Runtime 类声明一个对象,如: Runtime ec; 然后使用该类的getRuntime()静态方法创建这个对象: ec=Runtime.getRuntime(); ec可以调用exec(String command)方法打开本地机的可执行文件或执行一个操作,10.1.4 运行可执行文件,import java.io.*; public class Example10_3 public static void main(String args ) try Runtime ce=Runtime.getRuntime(); File file=new File(“c:windows“,“Notepad.exe“); ce.exec(file.getAbsolutePath(); file=new File(“C:Program FilesInternet Explorer“,“IEXPLORE www.sohu.com “); ce.exec(file.getAbsolutePath(); catch(Exception e) System.out.println(e); 打开本机上的记事本和浏览器,java.io包提供了大量的流类 InputStream 抽象的字节输入流类 OuputStream 抽象的字节输出流类 Reader 抽象的字符输入流类 Writer 抽象的字符输出流类,10.2 字节流与字符流,输入输出流类,字节流 从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位(声音图像)。 public abstract class InputStream extends Object public abstract class OutputStream extends Object 字符流 从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位(文本文件)。 public abstract class Reader extends Object public abstract class Writer extends Object,字节流:InputStream,字节流:InputStream,InputStream类包含了一套所有输入流都需要的方法,可以完成最基本的从输入流中读取数据 InputStream的子类中: FileInputStream:文件输入流 DataInputStream:数据输入流,从输入流中读取数 据时,可以实现对二进制字节数据的理解和编码 BufferedInputStream:缓冲输入流,具备缓冲功能的输入字节类,标准输入:System.in,Java 的标准输入设备键盘用System.in表示, System.in属于InputStream类对象。 public final class System extends Object public static final InputStream in /标准输入常量 public static final PrintStream out /标准输出常量 public final static PrintStream err /标准错误输出常量 ,说明,System.out是一个已经预先处理过的,被包装成PrintStream的对象。和System.out一样,System.err也是一个PrintStream,但是System.in就不对了,它是一个未经处理的InputStream。也就是说,虽然你可以直接往System.out和System.err上写,但是要想读System.in的话,就必须先做处理了。,InputStream类提供的read方法以字节为单位顺序地读取源中的数据,只要不关闭流,每次调用read方法就顺序地读取源中的其余内容,直到源的末尾或输入流被关闭,10.2.1 InputStream类与OutputSream类,int read() int read(byte b ) int read(byte b , int off, int len) 关于read: 输入流调用该方法从源中读取单个字节的数据,该方法返回字节值(即ASCII字符值),如果未读出字符就返回-1 void close()/关闭流 long skip(long numBytes),InputStream类有如下常用的方法,字节流:OutputStream,OutputStream流以字节为单位顺序地写文件,只要不关闭流,每次调用write方法就顺序地向目的地写入内容,直到流被关闭。,OutputStream类有如下的常用的方法 void write(int n) void write(byte b ) void write(byte b ,int off,int len) void close(),Reader类提供的read方法以字符为单位顺序地读取源中的数据,只要不关闭流,每次调用read方法就顺序地读取源中的其余内容,直到源的末尾或输入流被关闭,10.2.2 Reader类与Writer类,字符流:Reader,字符流:Reader,Reader类是处理所有字符流输入类的父类。 Reader类具有与InputStream类相似的方法。 子类: BufferedReader类:具备缓冲功能的字符 输入类 InputStreamReader是字节输入流和字符输入流之间的一座桥梁,它从字节数据流读入数据,然后根据字符编码规则将它们转成字符。 FileReader类用于从文件中读入字符流,Reader类有如下常用的方法 int read() int read(char b ) int read(char b , int off, int len) 关于read: 输入流调用该方法从源中读取一个字符,该方法返回一个整数(即Unicode字符值),如果未读出字符就返回-1 void close() long skip(long numBytes),Writer流以字符为单位顺序地写文件,只要不关闭流,每次调用write方法就顺序地向目的地写入内容,直到流被关闭。,字符流:Writer,Writer类有如下常用的方法 void write(int n) void write(char b ) void write(char b ,int off,int length) void close(),流都提供了关闭方法close(),尽管程序结束时会自动关闭所有打开的流,但是当程序使用完流后,显式地关闭任何打开的流仍是一个良好的习惯。如果没有关闭那些被打开的流,那么就可能不允许另一个程序操作这些流所用的资源,10.2.3 关闭流,由于应用程序经常需要和文件打交道,所以InputStream专门提供了读写文件的子类:FileInputStream和FileOutputSream类。 如果程序对文件的操作比较简单,比如只是顺序地读写文件,那么就可以使用FileInputStream和FileOutputSream类创建的流对文件进行读写操作。,10.3 文件字节流,如果需要以字节为单位读取文件,就可以使用FileInputStream类来创建指向该文件的文件字节输入流。下面是FileInputStream类的两个构造方法: FileInputStream(String name); FileInputStream(File file); 文件字节流可以调用从父类继承read方法顺序地读取文件,只要不关闭流,每次调用read方法就顺序地读取文件中的其余内容,直到文件的末尾或文件字节输入流被关闭,10.3.1 文件字节输入流,说明,FileInputStream输入流打开一个到达文件的输入流,当使用文件输入流构造方法建立通往文件的输入流时,可能会出现IOException异常。 因此要有捕获异常的操作,import java.io.*; public class Example10_4 public static void main(String args) int n=-1; byte a=new byte100; try File f=new File(“Example10_4.java“); FileInputStream in = new FileInputStream(f); while(n=in.read(a,0,100)!=-1) String s=new String (a,0,n); System.out.print(s); in.close(); catch(IOException e) System.out.println(“File read Error“+e); ,当程序需要把信息以字节为单位写入到文件时,可以使用FileOutputStream类来创建指向该文件的文件字节输出流。下面是FileOutputStream类的两个构造方法: FileOutputStream(String name) FileOutputStream(File file),10.3.2 文件字节输出流,import java.io.*; public class Example10_5 public static void main(String args ) byte a = “国庆60周年“.getBytes(); byte b = “十一快乐“.getBytes(); try FileOutputStream out=new FileOutputStream(“happy.txt“); out.write(a); out.write(b,0,b.length); out.close(); catch(IOException e) System.out.println(“Error “+e); ,字节输入流和输出流的read和write方法使用字节数组读写数据,即以字节为基本单位处理数据。因此,字节流不能很好地操作Unicode字符 与FileInputStream、FileOutputStream字节流相对应的是FileReader、FileWriter字符流,FileReader和FileWriter分别是Reader和Writer的子类,其构造方法分别是: FileReader(String filename); FileReader(File filename); FileWriter (String filename); FileWriter (File filename);,10.4 文件字符流,10-6,import java.io.*; public class Example10_6 public static void main(String args) String content = “broadsword 勇者无敌“; try File f=new File(“c:hello.txt“); char a = content.toCharArray(); FileWriter out=new FileWriter(f); out.write(a,0,a.length); out.close(); FileReader in=new FileReader(f); StringBuffer s=new StringBuffer(); char tom=new char10; int n=-1; while(n=in.read(tom,0,10)!=-1) String temp=new String (tom,0,n); s.append(temp); in.close(); System.out.println(new String(s); catch(IOException e) System.out.println(e.toString(); ,BufferedReader和BufferedWriter类创建的对象称作缓冲输入、输出流,二者增强了读写文件的能力 为什么需要缓冲流? 如果文件中有一行字符,每次要求读取一行的话,使用FileReader很难实现这样的任务。 而BufferedReader类就可以实现这样的读取一行的功能!,10.5 缓冲流,BufferedReader类和BufferedWriter的构造方法分别是: BufferedReader(Reader in); BufferedWriter (Writer out); BufferedReader流能够读取文本行,方法是readLine() BufferedWriter流有一个自己独特的向文件写入一个回行符的方法: newLine();,说明,可以把BufferedReader和BufferedWriter称作上层流,把它们指向的字符流称作底层流。Java采用缓存技术将上层流和底层流连接。底层字符输入流首先将数据读入缓存,BufferedReader流再从缓存读取数据;,说明,BufferedWriter流将数据写入缓存,底层字符输出流会不断地将缓存中的数据写入到目的地。当BufferedWriter流调用flush()刷新缓存或调用close()方法关闭时,即使缓存没有益满,底层流也会立刻将缓存的内容写入目的地,使用方法,先针对某个文件建立一个文件File对象 其次根据该File对象建立FileReader 或FileWriter对象(底层流) 最后在建立缓冲流BufferedReader或BufferedWriter流(上层流),例10-7,BufferedWriter流把字符串按行写入文件,然后再使用BufferedReader流按行读取文件。,10.6 随机流,RandomAccessFile类创建的流称作随机流,与前面的输入、输出流不同的是,RandomAccessFile类既不是InputStream类的子类,也不是OutputStram类的子类。但是RandomAccessFile类创建的流的指向既可以作为流的源、也可以作为流的目的地,换句话说,当准备对一个文件进行读写操作时,可以创建一个指向该文件的随机流即可,这样既可以从这个流中读取文件的数据,也可以通过这个流写入数据到文件。,以下是RandomAccessFile类的两个构造方法。 RandomAccessFile(String name,String mode) RandomAccessFile(File file,String mode) mode取r(只读)或rw(可读写),RandomAccessFile类中有一个方法:seek(long a),用来定位RandomAccessFile流的读写位置 其中参数a确定读写位置距离文件开头的字节个数 getFilePointer()方法获取流的当前读写位置,10-8:,把几个int型整数写入到一个名字为tom.dat文件中,然后按相反顺序读出这些数据,RondomAccessFile流的readLine()方法在读取含有非ASCII字符的文件时(比如含有汉字的文件)会出现“乱码”现象,因此,需要把readLine()读取的字符串用“iso-8859-1”重新编码存放到byte数组中,然后再用当前机器的默认编码将该数组转化为字符串,操作过程,操作如下: 1读取 String str=in.readLine(); 2用“iso-8859-1”重新编码 byte b =str.getBytes(“iso-8859-1“); 3使用当前机器的默认编码将字节数组转化为字符串 String content=new String(b); 如果机器的默认编码是“GB2312”,那么 String content=new String(b); 等同于: String content=new String(b, “GB2312“);,import java.io.*; public class Example10_9 public static void main(String args) RandomAccessFile in=null; try in=new RandomAccessFile(“Example10_9.java“,“rw“); long length=in.length(); /获取文件的长度 long position=0; in.seek(position); /将读取位置定位到文件的起始 while(positionlength) String str=in.readLine(); /byte b=str.getBytes(“iso-8859-1“); /str=new String(b); position=in.getFilePointer(); System.out.println(str); catch(IOException e) ,10.7 数组流,流的源和目标除了可以是文件外,还可以是计算机内存 1字节数组流 字节数组输入流ByteArrayInputStream和字节数组输出流ByteArrayOutputStream分别使用字节数组作为流的源和目标。ByteArrayInputStream的构造方法如下: ByteArrayInputStream(byte buf); ByteArrayInputStream(byte buf,int offset,int length);,字节数组输入流调用 public int read(); 方法可以顺序地从源中读出一个字节,该方法返回读出的字节值;调用 public int read(byte b,int off,int len); 方法可以顺序地从源中读出参数len指定的字节数,并将读出的字节存放到参数b指定的数组中,参数off指定数组b存放读出字节的起始位置,该方法返回实际读出的字节个数。如果未读出字节read方法返回1。,ByteArrayOutputStream流的构造方法如下: ByteArrayOutputStream(); ByteArrayOutputStream(int size);,字节数组输出流调用 public void write(int b); 方法可以顺序地向缓冲区写入一个字节;调用 public void write(byte b,int off,int len); 方法可以将参数b中指定的len个字节顺序地写入缓冲区,参数off指定从b中写出的字节的起始位置;调用 public byte toByteArray(); 方法可以返回输出流写入到缓冲区的全部字节,2字符数组流,与数组字节流对应的是字符数组流CharArrayReader和CharArrayWriter类,字符数组流分别使用字符数组作为流的源和目标。 public char toCharArray( ) 方法可以返回输出流写入到缓冲区的全部字符,例10-10,import java.io.*; public class Example10_10 public static void main(String args) try ByteArrayOutputStream outByte=new ByteArrayOutputStream(); byte byteContent=“国庆60周年“.getBytes(); outByte.write(byteContent); ByteArrayInputStream inByte=new ByteArrayInputStream(outByte.toByteArray(); byte backByte =new byteoutByte.toByteArray().length; inByte.read(backByte); System.out.println(new String(backByte); CharArrayWriter outChar=new CharArrayWriter(); char charContent=“中秋快乐“.toCharArray(); outChar.write(charContent); CharArrayReader inChar=new CharArrayReader(outChar.toCharArray(); char backChar =new charoutChar.toCharArray().length; inChar.read(backChar); System.out.println(new String(backChar); catch(IOException exp) ,10.8 数据流,DataInputStream和DataOutputStream类创建的对象称为数据输入流和数据输出流。这两个流是很有用的两个流,它们允许程序按着机器无关的风格读取Java原始数据。也就是说,当读取一个数值时,不必再关心这个数值应当是多少个字节。,以下是DataInputStream和DataOutputStream的构造方法。 DataInputStream(InputStream in) DataOutputStream(OutnputStream out),10-11,写了几个java 类型的数据到一个文件,然后再读出来 用到的方法: readChar():读取一个字符 writeChars(String s):写入字符串,10-12,将字符串加密后写入文件,然后读取该文件 writeUTF(String s) 把一个字符串以UTF编码的格式写入到输出流中 readUTF() 读取一个UTF字符串,10.9 对象流,ObjectInputStream和ObjectOutputStream类分别是InputStream和OutputStream类的子类。ObjectInputStream和ObjectOutputStream类创建的对象称为对象输入流和对象输出流。对象输出流使用writeObject(Object obj)方法将一个对象obj写入到一个文件,对象输入流使用readObject()读取一个对象到程序中,ObjectInputStream和ObjectOutputStream类的构造方法如下。 ObjectInputStream(InputStream in) ObjectOutputStream(OutputStream out),ObjectOutputStream的指向应当是一个输出流对象,因此当准备将一个对象写入到文件时,首先用OutputStream的子类创建一个输出流 如: FileOutputStream fileout=new FileOutputStream (“ c:tom.txt“); ObjectOutputStream objectOut=new ObjectOutputStream (fileout); 同样ObjectInputStream的指向应当是一个输入流对象,因此当准备从文件中读入一个对象到程序中时,首先用InputStream的子类创建一个输入流,序列化的对象,当使用对象流写入或读入对象时,要保证对象是序列化的 一个类如果实现了Serializable接口(java.io包中的接口),那么这个类创建的对象就是所谓序列化的对象 注意:(1)Serializable接口中没有方法 (2)使用对象流把一个对象写入到文件时不仅要保证该对象是序列化的,而且该对象的成员对象也必须是序列化的。,10.10 序列化与对象克隆,一个类的两个对象如果具有相同的引用,那么他们就具有相同的实体和功能 有时想得到对象的一个“复制品”,复制品实体的变化不会引起原对象实体发生变化,反之亦然。这样的复制品称为原对象的一个克隆对象或简称克隆,使用对象流很容易获取一个序列化对象的克隆,只需将该对象写入对象输出流指向的目的地,然后将该目的地作为一个对象输入流的源,那么该对象输入流从源中读回的对象一定是原对象的一个克隆,即对象输入流通过对象的序列化信息来得到当前对象的一个克隆,当程序想以较快的速度得到一个对象的克隆时,可以用对象流将对象的序列化信息写入内存,而不是写入到磁盘的文件中。对象流将数组流作为地层流就可以将对象的序列化信息写入内存,10.11 文件锁,RondomAccessFile创建的流在读写文件时可以使用文件锁,那么只要不解除该锁,其它程序无法操作被锁定的文件 使用文件锁的步骤如下: 1.先使用RondomAccessFile流建立指向文件的流对象,该对象的读写属性必须是rw 2. Input流调用方法getChannel()获得一个连接到地层文件的FileChannel对象(信道) 3.信道调用tryLock()或lock()方法获得一个FileLock(文件锁)对象,这一过程也称作对文件加锁,文件锁对象产生后,将禁止任何程序对文件进行操作或再进行加锁。对一个文件加锁之后,如果想读、写文件必须让FileLock对象调用release()释放文件锁,10.12 使用Scanner解析文件,应用程序可能需要解析文件中的特殊数据,此时,应用程序可以把文件的内容全部读入内存后,再使用第9章的有关知识(见9.1.6、9.3和9.9)解析所需要的内容,其优点是处理速度快,但如果读入的内容较大将消耗较多的内存,即以空间换取时间,使用Scanner解析文件,本节介绍怎样借助Scanner类和正则表达式来解析文件,比如,要解析出文件中的特殊单词,数字等信息。使用Scanner类和正则表达式来解析文件的特点是以时间换取空间,即解析的速度相对较慢,但节省内存,1使用默认分隔标记解析文件,创建Scanner对象,并指向要解析的文件,例如: File file = new File(“hello.java“); Scanner sc = new Scanner(file); 那么sc将空白作为分隔标记、调用next()方法依次返回file中的单词,如果file最后一个单词已被next()方法返回,sc调用hasNext()将返回false,否则返回true,例10-15,import java.io.*; import java.util.*; public class Example10_15 public static void main(String args) File file = new File(“cost.txt“); Scanner sc=null; int sum=0; try sc = new Scanner(file); while(sc.hasNext() try int price=sc.nextInt(); sum=sum+price; System.out.println(price); catch(InputMismatchException exp) String t=sc.next(); System.out.println(“Total Cost:“+sum+“ dollar“); catch(Exception exp) System.out.println(exp); ,2使用正则表达式作为分隔标记解析文件,创建Scanner对象,指向要解析的文件,并使用useDelimiter方法指定正则表达式作为分隔标记,例如: File file = new File(“hello.java“); Scanner sc = new Scanner(file); sc.useDelimiter(正则表达式);,例10-16,利用正则表达式解析文件中的数字。 为何要用正则表达式? 因为数字间不是以空格间隔的,必须用正则表达式,否则无法解析!,import java.io.*; import java.util.*; public class Example10_16 public static void main(String args) File file = new File(“student.txt“); Scanner sc=null; int count=0; double sum=0; try double score=0; sc = new Scanner(file); sc.useDelimiter(“0123456789.+“); while(sc.has

    注意事项

    本文(第10章输入输出流.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开