程序设计第15章输入输出流和文件操作ppt课件

上传人:钟*** 文档编号:1263380 上传时间:2019-10-12 格式:PPT 页数:43 大小:1.61MB
返回 下载 相关 举报
程序设计第15章输入输出流和文件操作ppt课件_第1页
第1页 / 共43页
程序设计第15章输入输出流和文件操作ppt课件_第2页
第2页 / 共43页
程序设计第15章输入输出流和文件操作ppt课件_第3页
第3页 / 共43页
点击查看更多>>
资源描述
第十五章 输入输出流与文件操作,目 录,重点与难点点拨,输入输出流的分类,目录和文件管理,文件和随机访问,其他常用的流,综合案例,字符流,字节流,经典练习题,本章知识重点,输入输出流的分类,java.io包中流的体系结构,目录和文件管理涉及到的类,输入输出流的概念,本章知识难点,目录和文件管理涉及到的类,流输入及输出的一般过程,输入输出流的分类,Java 流的概念 Java使用流(stream)来执行输入输出(I/O)的功能,流是一 种数据的源头和目的之间的通信途径 标准输入输出 Java系统事先定义好两个流对象,分别与系统的标准输入 和标准输出相联系,它们是System. in和System.out System是Java中一个功能很强大的类,利用它可以获得很 多Java运行时的系统信息。,【例15.1】,输出流(程序写出数据),输入流(程序读入数据),Java流类体系结构1,Java流类体系结构2,Java流类体系结构3,Java流类体系结构4,Java流的概念,输入输出流的分类,目录和文件管理,文件名的处理,File类,文件或目录的生成,文件属性测试,普通文件信息和工具,目录操作,public File(String path):如果path是实际存在的路径,则该File对象表示的是目录;如果path是文件名,则该File对象表示的是文件。 public File(String path,String name):path是路径名,name是文件名(不可为空)。 public File(File dir,String name):dir是路径名,name是文件名。,String getName( ):得到一个文件的名称(不包括路径)。 String getPath( ):得到一个文件的路径名。 String getAbsolutePath( ):得到一个文件的绝对路径名。 String getParent( ):得到一个文件的上一级目录名。 String renameTo(File newName):将当前文件名更名为给定文件的完整路径。,【例15.2】,boolean exists( ):测试当前File对象所指示的文件或目录是否存在,若存在,返回True。 boolean createNewFile():创建当前文件。 boolean canWrite( ):测试当前文件是否可写。 boolean canRead( ):测试当前文件是否可读。 boolean isFile( ):测试当前文件是否是文件(不是目录)。 boolean isDirectory( ):测试当前文件是否是目录,若为目录则返回True。,【例15.3】,long lastModified( ):得到文件最近一次修改的时间。 long length( ):得到文件的长度,以字节为单位,若不存在,返回0。 boolean delete( ):删除File对象代表的文件或目录,目录需为空。删除成功,返回True。,boolean mkdir():生成一个由该对象指定的路径(新目录),若成功,返回True。 boolean mkdirs():生成一个新的目录,包含子目录。若成功,返回true。 boolean renameTo(File newName):将当前File对象所代表的路径名改为newName所代表的路径名。若成功,返回true。 String list():列出当前目录下的文件。 File listFiles():得到该对象所代表的目录下的File对象数组。 String toString():得到抽象路径表示法。,【例15.4】,File类的应用,【例15.5】,【例15.6】,字节流,顺序读/写文件(FileInputStream与FileOutputStream),FileInputStream类从磁盘文件读取数据。常用的构造方法有: FileInputStream(String name):打开文件name用来读取数据。 如:FileInputStream f =new FileInputStream(“c:/test.txt“); FileInputStream(File file):打开文件file用来读取数据。 如:File f=new File(“c:/test.txt“); FileInputStream f1=new FileinputStream(f); 将FileDescriptor对象作为其参数。 如:FileDescriptor() fd=new FileDescriptor(); FileinputStream f2=new FileInputstream(fd);,FileOutputStream类创建文件(如果文件不存在),并将数据写入文件。FileOutputStream类常用的构造方法有: FileOutputStream(String name):打开文件name用来写入数据。 如:FileOutputStream f=new FileOutputStream (“c:/test.txt“); FileOutputStream(File file):打开文件file用来写入数据。 如:File f =new File(“c:/test.txt“); FileOutputStream f1=new FileOutputStream (f); FileOutputStream(String name,Boolean append):打开文件name用来写入数据,若append为true,则写入的数据会加到原有文件后面,否则,覆盖原有的文件。 如:FileOutputStream f =new FileOutputStream(“c:/test.txt“,true); 将FileDescriptor对象作为其参数。 FileDescriptor() fd =new FileDescriptor(); FileOutputStream f =new FileOutputStream(fd);,【例15.7】,字节流,字节流,ByteArrayInputStream 将字节数组用作源,并在该数组中执行读操作 它有两种构造方法。第一种构造方法将字节数组作为参数。 ByteArrayInputStream(byte buffer):生成一个字节数组的输入流,并指定一个字节数组buffer为此输入流的流缓冲区。 如:ByteArrayInputStream b =new ByteArrayInputStream(buf); 另外一种构造方法有助于从指定的字节数组来创建ByteArrayInputStream。 ByteArrayinputStream b =new ByteArrayinputStream(buf,off,len); 其中off 是要读取的第一个字节的偏移,len 是要读取数组的字节数;,ByteArrayOutputStream有2种构造方法 ByteArrayOutputStream():生成一个字节数组的输出流,其缓冲区的默认初始大小为32字节,若有需要,缓冲区的大小会随之增加。 如:ByteArrayOutPutStream b=new ByteArrayOutputStream(); ByteArrayOutputStream(int size):创建32个自己的缓冲器用于储存数据,但分配size字节的初始大小给此缓冲区。 如:ByteArrayOutputStream b1=new ByteArrayOutputStream(size);创建大小为size的缓冲器,ByteArrayOutputStream的一些常用方法: int size():返回此流缓冲区的大小。 byte toByteArray():生成一个新的字节数组,并将流的内容复制到此字节数组。 String toString():将流的内容转换为String对象。,【例15.8】,字节流,缓冲区流BufferedInputStream和BufferedOutputStream,BufferedInputStream类的构造方法和方法: BufferedInputStream(InputStream in):构造一个BufferedInputStream。 BufferedInputStream(InputStream in, int size):构造一个具有给定的缓冲区大小的BufferedInputStream。 int available():得到可以从这个输入流读取的字节数。 void close():关闭流。 void mark(int readlimit):在这个输入流的当前位置做标记。 boolean markSupported():检查这个输入流是否支持mark和reset方法。 int read():读取数据的下一个字节。 int read(byte b, int off, int len):从这个字节输入流的给定偏移量处开始读取字节,存储到给定的字节数组。 void reset():将缓冲区重新设置到加标记的位置。 long skip(long n):跳过n个字节的数据。,BufferedOutputStream类的构造方法和方法: BufferedOutputStream(OutputStream out):构造一个BufferedOutputStream。 BufferedOutputStream(OutputStream out, int size):构造一个具有给定的缓冲区大小的BufferedOutputStream。 void flush():刷新这个流。 void write(byte b, int off, int len):将给定的字节数组写到这个缓冲输出流。 void write(int b):将给定的字节写到这个缓冲输出流。,【例15.9】,字符流,字符流,InputStreamReader和OutputStreamWriter,InputStreamReader类的构造方法和方法: InputStreamReader(InputStream in):构造一个InputStreamReader。 InputStreamReader(InputStream in, String enc):使用命名的字符编码构造一个InputStreamReader。 void close():关闭流。 String getEncoding():得到字符编码的名称。 int read():读取一个字符。 int read(char cbuf, int off, int len):将字符读到数组中。 boolean ready():如果这个流已准备好,返回True。,OutputStreamWriter类的构造方法和方法: OutputStreamWriter(OutputStream out):构造一个OutputStreamWriter。 OutputStreamWriter(OutputStream out, String enc):使用命名的字符编码构造一个OutputStreamWriter。 void close():关闭流。 void flush():刷新流。 String getEncoding():得到这个流使用的字符编码的名称。 void write(char cbuf, int off, int len):写字符数组的一部分。 void write(int c):写一个字符。 void write(String str, int off, int len):写一个字符串的一部分。,【例15.10】,字符流,FileReader,FileReader(File file):构造一个FileReader。 FileReader(FileDescriptor fd):从一个文件描述符构造一个FileReader。 FileReader(String filename):从一个文件名构造一个FileReader。,【例15.11】,字符流,FileWriter,FileWriter(File file):从File对象构造一个FileWriter。 FileWriter(FileDescriptor fd):从文件描述符构造一个FileWriter。 FileWriter(String filename):从文件名构造一个FileWriter。 FileWriter(String filename, boolean append):构造一进行附加的FileWriter。,【例15.12】,字符流,BufferedReader和BufferedWriter,这两个类对应的流使用了缓冲,能大大提高输入输出的效率。这两个也是过滤器流,常用来对InputStreamReader和OutputStreamWriter进行处理。,【例15.13】,字符流,CharArrayReader和CharArrayWriter,CharArrayReader类的构造方法和方法如下: CharArrayReader(char buf):从给定的字符数组构造一个CharArrayReader。 CharArrayReader(char buf, int offset, int length):同上。 void close():关闭流。 void mark(int readAheadLimit):在流中的当前位置加标记。 boolean markSupported():如果这个流支持mark操作,那么返回True。 int read():读取一个字符。 int read(char b, int off, int len):将字符读入数组的一部分。 boolean ready():检查这个流是否已经准备好被读取。 void reset():将流重设到最近的标记。 long skip(long n):跳过n个字符。,CharArrayWriter类的构造方法和方法如下: CharArrayWriter():构造一个CharArrayWriter。 CharArrayWriter(int initialSize):构造一个具有给定初始大小的CharArrayWriter。 void close():关闭流。 void flush():刷新流。 void reset():重设流。 int size():得到缓冲区的当前大小。 char toCharArray():得到输入数据的副本。 String toString():将输入数据转换为字符串。 void write(char c, int off, int len):将字符写到缓冲区中。 void write(int c):将一个字符写到缓冲区中。 void write(String str, int off, int len):将字符串的一部分写到缓冲区中。 void writeTo(Writer out):将缓冲区的内容写到另一个字符流中。,【例15.14】,文件的随机访问,RandomAccessFile(File file, String mode):构造一个随机访问文件流,file为被访问的文件对象,mode是用来指定存取的模式,mode可以为r(读)、w(写)或rw(读写)。 RandomAccessFile(String name,String mode):构造一个随机访问文件流,以便访问由字符串name指定名字的文件,mode参数使用同上,boolean readBoolean() byte readByte() char readChar() double readDouble() float readFloat() int readInt() long readLong() short readShort() String readLine(),void writeByte(byte b) void writeBytes(String s) void writeChar(char c) void writeChars(String s) void writeDouble(double d) void writeFloat(float f) void writeInt(int i) void writeLong(long l) void writeShort(short s),void seek(long pos):将文件指针移到pos(不可为负)的位置,相对于文件初始位置值(初始值为0)。 long getFilePointer():得到目前文件指针的位置(相对于文件初始位置)。 long length():得到文件的长度。 int skipBytes( int n ):使文件指针向前移动指定的n个字节,【例15.15】,其他常用的流,管道流,ZIP文件流,DataInputStream和DataOutputStream,对象流,综合案例,【例15.16】下面的代码实现了一个简单的文件编辑器,import java.awt.*; import java.awt.event.*; import java.io.*; public class FileEdit extends WindowAdapter implements ActionListener,TextListener Frame f; TextArea ta1; Panel p1; TextField tf1; Button b1,b2,b3; FileDialog fd; File file1=null; public static void main(String args) (new FileEdit().display(); ,综合案例(续),public void display() f = new Frame(“FileEdit“); f.setSize(680,400); f.setLocation(200,140); f.setBackground(Color.lightGray); f.addWindowListener(this); tf1 = new TextField(); tf1.setEnabled(false); tf1.setFont(new Font(“Dialog“,0,20); /设置文本行的初始字体 f.add(tf1,“North“); ta1 = new TextArea(); ta1.setFont(new Font(“Dialog“,0,20); /设置文本区的初始字体 f.add(ta1); ta1.addTextListener(this); /注册文本区的事件监听程序 p1 = new Panel(); p1.setLayout(new FlowLayout(FlowLayout.LEFT);,综合案例(续),b1 = new Button(“Open“); b2 = new Button(“Save“); b3 = new Button(“Save As“); p1.add(b1); p1.add(b2); p1.add(b3); b2.setEnabled(false); b3.setEnabled(false); b1.addActionListener(this); /注册按钮的事件监听程序 b2.addActionListener(this); b3.addActionListener(this); f.add(p1,“South“); f.setVisible(true); public void textValueChanged(TextEvent e) /实现TextListener接口中的方法,对文本区操作时触发 b2.setEnabled(true); b3.setEnabled(true); ,综合案例(续),public void actionPerformed(ActionEvent e) if (e.getSource()=b1) /单击打开按钮时 fd = new FileDialog(f,“Open“,FileDialog.LOAD); fd.setVisible(true); /创建并显示打开文件对话框 if (fd.getDirectory()!=null) ,综合案例(续),if (e.getSource()=b2)|(e.getSource()=b3) /单击保存按钮时 if(e.getSource()=b3)|(e.getSource()=b2) ,综合案例(续),else save(file1); public void save(File file1) try /将文本区内容写入字符输出流 FileWriter fw = new FileWriter(file1); fw.write(ta1.getText(); fw.close(); b2.setEnabled(false); b3.setEnabled(false); catch (IOException ioe) System.out.println(ioe); public void windowClosing(WindowEvent e) System.exit(0); ,综合案例(续),程序运行结果,简答练习题,利用输入输出流编写程序,实现文件拷贝的功能。,编写程序,实现在屏幕上显示文本文件的功能。,有哪些常用的字节流和字符流,他们的主要区别是什么?,对字节流和字符流进行读写操作的一般步骤是什么?,File类有哪些构造方法和常用方法?,编写程序,从键盘输入一串字符,从屏幕输出并将其存入a.txt文件中。,【例15.1】标准输入输出举例,标准输入输出,输入输出流的分类,import java.io.*; public class IODemo public static void main(String args) throws IOException int b; int count=0; while(b=System.in.read()!=-1)count+;System.out.print(char)b); System.out.println(); System.out.println(“program end“); ,程序运行如下: 输入:a,b,c,d 输出:a,b,c,d 输入:Z 输出: program end,【例15.2】对Test.txt及其上一级目录的File类对象进行操作,目录和文件管理,File类,import java.io.*; public class fileTest /创建一个文件 public static void main(String args) File f=new File(“parentfileTest.txt“); File f1=new File(“newfileTest.txt“); trySystem.out.println(f.getParent(); System.out.println(f.getName(); System.out.println(f1.getPath(); System.out.println(f1.getAbsolutePath();catch(Exception e)e.printStackTrace(); ,程序运行结果,【例15.3】建立 test.txt 文件对象,判断是否存在,如果不存在就创建之,import java.io.*; public class CreateNewFile public static void main(String args) File f=new File(“test.txt“); try if(!f.exists() f.createNewFile(); else System.out.println(“exists“); catch(Exception e) e.printStackTrace(); ,程序运行结果,目录和文件管理,File类,【例15.4】创建文件夹Dir以及文件夹dir/cdir。,目录和文件管理,File类,import java.io.*; public class CreateDir public static void main(String args) File f=new File(“test.txt“); File f1=new File(“Dir“); File f2=new File(“dir/cdir“); File f3=new File(“newTest.txt“); try f.renameTo(f3);/把test.txt改名为newTest.txt f1.mkdir(); /创建目录Dir f2.mkdirs(); /创建目录dir及其子目录cdir catch(Exception e)e.printStackTrace(); ,程序运行结果,【例15.5】使用File类的方法获取文件file.txt的属性信息,目录和文件管理,File类的应用,import java.io.*; public class file public static void main(String args) File fl = new File(“file.txt“); System.out.println(“The file is exist? “+fl.exists(); System.out.println(“The file can write? “+fl.canWrite(); System.out.println(“The file can read? “+fl.canRead(); System.out.println(“The file is a file? “+fl.isFile(); System.out.println(“The file is a directory? “+fl.isDirectory(); System.out.println(“The files name is: “+fl.getName(); System.out.println(“The files all path is: “ + fl.getAbsolutePath(); System.out.println(“The files length is “+fl.length(); ,程序运行结果,【例15.6】列出Dir目录下的所有文件和目录(String list( ),最后修改时间;若为目录则在其后面标出,若为文件,则在其后面标出文件长度(提示:方法long lastModified()能够返回自1970.1.1起 到最后修改时间之间的秒数),import java.io.*; import java.util.*; public class testDir public static void main(String args) File f=new File(“Dir“); String listAll=null; File temp=null; try listAll=f.list(); for(int i=0;it“); else System.out.print(temp.length()+“t“); System.out.println(new Date(temp.lastModified(); catch(Exception e)e.printStackTrace(); ,目录和文件管理,File类的应用,程序运行结果,字节流,【例15.7】将FileIO.java复制为FileExam.java.bak,import java.io.*; public class FileIO public static void main(String args) FileInputStream inFile=null; FileOutputStream outFile=null; tryinFile=new FileInputStream(“FileIO.java“); outFile=new FileOutputStream(“FileExam.java.bak“); int date; while(date=inFile.read()!=-1)outFile.write(date); catch(FileNotFoundException e)System.out.println(e.getMessage(); catch(IOException e)System.out.println(e.getMessage(); finallyif(inFile!=null)tryinFile.close();catch(IOException e) if(outFile!=null)tryoutFile.close();catch(IOException e) ,程序运行结果,【解题分析】以下问题的求解过程可分解如下: 先打开文件FileExam.java 用read()将其内容逐字节读取出来(如果返回值为-1,则表明已到达文件尾端) 再用write()将读出的字节逐一写入另一个文件FileExam.java.bak中 若文件无法打开(例如FileExam.java不存在)或无法生成(FileExam.java.bak),则抛出FileNotFoundException异常,若读写出错,则抛出IOException异常。 最后,在finally中关闭文件。,【例15.8】程序读入文件ByteIO.java,将其内容写入内存中(一个字节数组),接着转换为String对象,并将该String对象内的令牌解析出来,字节流,import java.io.*; import java.util.*; public class ByteIO public static void main(String args) tryFile inFile=new File(“FileIO.java“); FileInputStream inData=new FileInputStream(inFile); ByteArrayOutputStream dataArray=new ByteArrayOutputStream(); int data; while(data=inData.read()!=-1)dataArray.write(data); inData.close(); String dataStr=dataArray.toString(); StringTokenizer tokens=new StringTokenizer(dataStr); while(tokens.hasMoreTokens()System.out.println(tokens.nextToken(); catch(IOException e)System.out.println(e.getMessage(); ,程序运行结果,【例15.9】文件拷贝的缓冲改进,字节流,/文件拷贝的缓冲改进 import java.io.*; public class Copy public static void main(String args) BufferedInputStream bis=null; BufferedOutputStream bos=null; byte buf=new byte100; try bis=new BufferedInputStream(new FileInputStream(“test.txt“); bos=new BufferedOutputStream(new FileOutputStream(“testcopy.txt“); int len=0; while( true ) len=bis.read(buf); if(len=0) break; bos.write(buf,0,len); bos.flush();/缓冲区只有满时才会将数据输出到输出流,用flush()将未满的缓冲区中数据强制输出 catch(Exception e)e.printStackTrace(); finally if(bis != null) try bis.close(); catch(Exception e) e.printStackTrace(); if(bos!= null) try bos.close(); catch(Exception e) e.printStackTrace(); ,程序运行结果,【例15.10】利用InputStreamReader从键盘接受输入,再将输入的字符显示出来,字符流,import java.io.*; class inputstreamreader public static void main(String args) try int character; InputStreamReader instreamread = new InputStreamReader(System.in); /InputStreamReader以字符形式读取输入 while (character = instreamread.read() != -1) System.out.print(char) character); catch (IOException e) System.out.print(“Bye”); ,程序运行结果如下: 输入:a,b,c,d 输出:a,b,c,d 输入:1,2,3,4 输出:1,2,3,4 输入:Z 输出:Bye,【例15.11】下例中打开一个文件file.txt(内容为:Hello from file),将文件的内容读到缓冲区,然后显示数据,字符流,import java.io.*; public class fileread public static void main(String args) throws Exception FileReader fileread = new FileReader(“file.txt“);/打开文件 char data = new char1024; int charsread = fileread.read(data);/读入 System.out.println(new String(data,0,charsread);/显示 fileread.close();/关闭文件流 ,程序运行结果,字符流,【例15.12】下例中,分别采用三种方式:逐字符地写数据、一次写入所有数据、分批写数据,使用类FileWriter,import java.io.*; public class filewrite public static void main(String args) throws Exception char data=T,h,i,s, ,i,s, ,a, ,s,t,r,i,n,g, ,o,f, ,t,e,x,t,.; FileWriter filewriter1=new FileWriter(“file1.txt“); for(int loop_index=0;loop_indexdata.length;loop_index+)filewriter1.write(dataloop_index); FileWriter filewriter2=new FileWriter(“file2.txt“); filewriter2.write(data); FileWriter filewriter3=new FileWriter(“file3.txt“); filewriter3.write(data,5,10); filewriter1.close(); filewriter2.close(); filewriter3.close(); ,程序执行后: file1.txt和file2.txt的内容为:This is a string of text。 file3.txt的内容为:is a strin。,字符流,【例15.13】从键盘接受输入并回显,import java.io.*; public class Echotest public static void main(String args) BufferedReader in =new BufferedReader(new InputStreamReader(System.in); String s; System.out.print(“please enter a string:“); try while(s = in.readLine().length() != 0) System.out.println(“输入是:“+s); catch(IOException e) e.printStackTrace(); ,程序运行结果,字符流,【例15.14】下例演示CharArrayReader类的作用,该例从字符数组中逐个读取字符并显示,chararrayreader.java import java.io.*; public class chararrayreader public static void main(String args) throws IOException char data = T,h,i,s, ,i,s, ,a, ,s, t,r,i,n,g, ,o,f, ,t,e,x,t,.; CharArrayReader chararrayreader = new CharArrayReader(data); int character; while(character = chararrayreader.read() != -1) System.out.print(char)character); ,程序运行结果为: This is a string of text.,文件的随机访问,【例15.15】把若干个32位整数写到一个名为test.txt的文件中,利用seek()方法,以相反的顺序读取这些数据,import java.io.*; public class RandomFile public static void main(String args) RandomAccessFile raf=null; int data=12,31,56,23,27,1,43,65,4,99; try raf=new RandomAccessFile(“test.txt“,“rw“); for(int i=0;i=0;i-) raf.seek(i*4); System.out.println(raf.readInt(); catch(Exception e)e.getMessage(); finally if(raf!=null) tryraf.close();catch(Exception e)e.getMessage(); ,程序运行结果,再 见,谢谢你的配合!,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸设计 > 毕设全套


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!