java语言之IO流.ppt_第1页
java语言之IO流.ppt_第2页
java语言之IO流.ppt_第3页
java语言之IO流.ppt_第4页
java语言之IO流.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2020年11月11日,1,Java核心之IO流,2020年11月11日,2,主要内容,File类 递归 IO流的原理 输入/输出流 节点流和处理流 缓冲流、数据流、转换流、Print流、Object流,2020年11月11日,3,文件,什么是文件? 文件可认为是相关记录或放在一起的数据的集合 文件一般存储在哪里? JAVA程序一般通过什么去访问文件属性? JAVA API :java.io.File 类,2020年11月11日,4,Java.io.File,Java.io.File提供了操纵和获取文件属性信息的方法,它代表的是文件名或路径,注意并不代表文件; 在java中,把目录视为一种特殊

2、的文件; 通过File的方法,可以得到文件或目录的描述信息,包括名称、所在路径、读写性、长度等; 可以生成新的目录、临时文件、改变文件名、删除文件、列出一个目录中所有或者和某个模式匹配的文件;,2020年11月11日,5,Java.io.File,常见的构造方法: File(Stringpathname) 以pathname为路径名来创建一个新 File 实例。 例:File myFile = new File(“dir1/dir2/file1.txt”); File myFile = new File(“file1.txt”); File(String parent, Stringchild

3、) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例; 例:File myFile = new File(“dir1/dir2”, “file1.txt”) ; File(Fileparent, String child) 例: File dir1 = new File(“dir1/dir2”) ; File file1 = new File(dir1, “file1.txt”) ; 注意以上构造方法不会真正的在磁盘上创建一个文件,要创建文件,应该调用File的creatNewFile()方法。,2020年11月11日,6,Java.io.File,路径名

4、问题: 在UNIX系列平台中:/usr/local/bin 在windows平台中:E:javaj2se培训 因此,在windows中创建一个文件时应该: File file1 = new File(d:testfile1.txt) ; file1.createNewFile() ; 但其实,在windows平台中,如下也可: File file2 = new File(“”d:/test/file2.txt“); file2.createNewFile() ; staticString separator:与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。也就是说:在windows

5、平台下separator=“” ;在UNIX系列平台下表示“/” ; staticchar separatorChar:与系统有关的默认名称分隔符。,TestFile1.java,2020年11月11日,7,java.io.File常用方法,TestFile1.java,2020年11月11日,8,listFiles方法,返回包含子目录在内的所有文件,注意被重载了。 问题:打印一个目录下的所有文件和目录 问题是子目录下的文件名如何打印呢?,TestFile2.java,TestlistFiles.java,进一步,如果只要打印出txt文件呢?,TestFile3.java,2020年11月11

6、日,9,递归,Public static void main() System.out.println(m(3) ; Public static m(int n) if (n = 1) return 1 ; else return n*m(n-1); ,m(3);,if (n = 1) return 1 ; else return n*m(n-1);,if (n = 1) return 1 ; else return n*m(n-1);,if (n = 1) return 1 ; else return n*m(n-1);,n=3,n=2,n=1,return 1,return 2*1,ret

7、urn 3*2*1,2020年11月11日,10,递归练习,有一个等差数组,首项为11,公差为3,试用递归的方法求出该数组的第50项等于多少;,a1 = 1 ;a2= 1 ;a3 = 2 ;an = an-1 + an-2 ; 用递归的方法求出第20项;,Fibolacci.java,2020年11月11日,11,例:汉诺塔问题,有三根针A、B、C。A针上有N个盘子,大的在下,小的在上,要求把这N个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。,2020年11月11日,12,分析: 将n个盘子从A针移到C针可以分解为下面三

8、个步骤: 将A上n-1个盘子移到 B针上(借助C针); 把A针上剩下的一个盘子移到C针上; 将n-1个盘子从B针移到C针上(借助A针); 事实上,上面三个步骤包含两种操作: 将多个盘子从一个针移到另一个针上,这是一个递归的过程。 hanoi函数实现。 将1个盘子从一个针上移到另一针上。用move函数实现。,12,2020年11月11日,13,八皇后问题,在8*8的国际象棋的棋盘上摆8个皇后,使他们之间不能相互攻击。即任意两个皇后不能位于同一行、同一列或同一对角线上。,EightQueen,2020年11月11日,14,IO流的概念,流是指一连串流动的字符,是以先进先出方式发送信息的通道。,20

9、20年11月11日,15,IO流,什么是流(stream)? 流就是具有源或目标的一组有序的字节 源和目标可以是:文件、网络、内存对象等; 键盘可以作为源,显示器也可以作为目标等等; 读和写都是站在应用程序的角度说话。 程序从其他地方读数据叫输入(input); 程序写数据到其他地方叫输出(output);,文件,程序,0100110,2020年11月11日,16,字节流和字符流,字节流: 0-255的整数。可以处理包括十进制数据、可执行程序、Internet通信和字节码(如class文件)。 所有字节流都是InputStream或OutputStream的子类。 字符流: 是特殊类型的字节流

10、,仅处理文本数据,以Unicode为标准。用于读写这些流的类都是Reader和Writer的子类。,2020年11月11日,17,InputStream的类层次,其中浅色的类为节点流,深色为处理流;,2020年11月11日,18,InputStream的基本方法,此抽象类是表示字节输入流的所有类的超类; abstract int read() 从输入流中读取数据的下一个字节,读之前已到流结束返回1; read()和OutputStream中的write()会被阻塞; int read(byte b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中,读之前已到流结束返回1。 int

11、 read(byte cbuf ,int offset,int length) 读取一串字节放到字节数组中,返回实际读取的字节数;offset表示从哪个地方开始读;length表示实际读取的长度。读之前已到流结束返回1。 void close() 关闭此输入流并释放与该流关联的所有系统资源。 long skip(longn) 跳过和丢弃此输入流中数据的 n 个字节。/很少用到了 int available() 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。 Int byteAvailable = in.available(); If (bayteAvailabl

12、e 0) Byte b=new bytebyteAvailable; In.read(b) ; ,2020年11月11日,19,OutputStream的类层次,其中浅色的类为节点流,深色为处理流;,2020年11月11日,20,OutputStream的基本方法,此抽象类是表示字节输出流的所有类的超类; void write(int b) throws IOException 将参数b的低8位写入到输出流 void write(byte b ) throws IOException 将数组全部字节顺序写入输出流 void write(byte b , int offset, int leng

13、th) throws IOException void close( ) throws IOException 关闭输出流。 void flush( ) throws IOException 有时一个输出流在积累了若干次之后才进行真正的写操作。flush()方法允许你强制执行写操作。 OutputStream的flush不执行任何操作,因为它没有缓冲区。一般只有带有缓冲区的子类(例如:BufferedOutputStream、PrintStream等)才有用。(可以观察API文档,其中指出OutputStream中的flush是do nothing),2020年11月11日,21,文件输入流/

14、文件输出流,FileInputStream/FileOutputStream:它们用于本地文件的二进制格式顺序读写。 要求:读和写要分别创建出不同的文件流对象 编程过程: 生成文件流对象 调用流类中的功能函数如read()、write(int b)等读写文件内容 close()关闭文件 FileInputStream(File file):参数指定文件数据源 FileInputStream(String name):参数指定文件数据源,参数name中有文件路径信息。 FileInputStream(String name,boolean append) FileInputStream(File

15、 file,boolean append) appnde=true则表示如果文件已存在,则可以将要写入的数据追加到文件末尾,2020年11月11日,22,练习,文件copy练习1 文件copy练习2(与1的区别在于copy时间) 把字符串“我们要好好学习java”输入到一个文本文件test.txt,FileInputOutputCopy.java,FileInputOutputCopy2.java,FileInputOutputCopy2.java,TestInputStream.java,2020年11月11日,23,Reader和Writer,Reader和Writer与InputStre

16、am和OutputStream类似,也是抽象类。主要用于对字符数据的输入和输出操作。 如:read():输入流中取出一个char型的字符; read(char a):读取若干字符放入数组; read(charcbuf, intoff, intlen) :读取若干字符放入数组; FileReader(StringfileName) FileReader(Filefile) 比较:TestReader.java,TestInputStream.java 仔细考虑以上两个例子程序够健壮吗?有没有可能打开了文件却没有关闭呢?(正确的方法是在finally中判断是否为null,然后在trycatch中c

17、lose() 注意:Reader和Writer会在本地字符编码级和UNICODE编码之间自动转换,2020年11月11日,24,Reader和Writer,Reader和Writer与InputStream和OutputStream类似,也是抽象类。主要用于对字符数据的输入和输出操作。 如: write(int c):向输出流写一个char型的字符; write(char a):把字符数组中的数据写入到输出流; write (charcbuf, intoff, intlen) :把字符数组中的数据从第off个开始写len个写入到输出流; write(String s):把字符串写入字符输出流。

18、 TestWriter.java:注意close(),flush()的使用; 问题:如果我们要对文本文件进行一行一行的写,我们应该怎么办呢?,2020年11月11日,25,Reader 和writer的类层次,2020年11月11日,26,节点流和处理流,节点流和处理流 节点流构造器的参数是文件、内存对象、网络对象等,即它操作的是其他资源对象。 而处理(过滤)流是以节点流作为构造参数,即它处理的是节点流。从而提供更为强大的读和写的能力;,2020年11月11日,27,InputStreamReader包装InputStream,BufferedReader再包装InputStreamReade

19、r,处理流,2020年11月11日,28,BufferReader和BufferWriter,缓冲流套接到其他流上,实现缓冲,从而避免过多的IO。 注意观察他们构造函数的参数 BufferedReader和BufferedWriter缓冲流中最重要的方法:readline(),newline() ; 输出时,先用输出到内存,注意使用flush()输出到设备。 读 fr = new FileReader(fname); BufferedReader br = new BufferedReader(fr); String str = br.readLine(); /首先读取文件第一行 /下面循环读

20、取文件中的内容,每次读取一行,只要读到数据,就继续循环 while(str!=null) System.out.println (str); str = br.readLine(); ,练习:使用BufferReader和BufferWriter来copy文件,2020年11月11日,29,DataInputStream、DataOutputStream,如果我想向一个文件中写一个double类型的数,怎么办? 我们是把double型的数先转换为字符串再写入到文件中吗?(1、麻烦。2、占用了更多的空间) DataInputStream数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本

21、 Java 数据类型。 DataOutputStream数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。,DataInOutTest.java,2020年11月11日,30,处理流之转换流,InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset读取字节并将其解码为字符。 OutputStreamWriter是字符流通向字节流的桥梁:可使用指定的 charset将要写入流中的字符编码成字节。,TestTransForm1.java,TestTransForm2.java,2020年11月11日,31,处理流之Print流,PrintStream为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。 PrintStream、PrintWriter向文本输出流打印对象的格式化表示形式。,TestPrintStream1.java(注意System.setOut()),TestPrintStream2.java,2020年11月11日

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论