[高等教育]java-IO.doc

上传人:音乐台 文档编号:1994095 上传时间:2019-01-29 格式:DOC 页数:32 大小:679.50KB
返回 下载 相关 举报
[高等教育]java-IO.doc_第1页
第1页 / 共32页
[高等教育]java-IO.doc_第2页
第2页 / 共32页
[高等教育]java-IO.doc_第3页
第3页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《[高等教育]java-IO.doc》由会员分享,可在线阅读,更多相关《[高等教育]java-IO.doc(32页珍藏版)》请在三一文库上搜索。

1、JAVA I/O(输入输出)“对语言设计人员来说,创建好的输入输出系统是一项特别困难的任务”摘自 Thinking in Java不仅有三种不同种类的IO(文件、控制台、网络连接)需要考虑,而且需要通过大量不同的方式与它们通信(顺序、随机访问、二进制、字符、按行、按字等等)内容包括两大部份一是处理文件本身(添加删除文件等)二是读写文件内容包:java.iojava.nioJava的标准输入输出分别通过System.in和System.out来代表,在默认情况下它们分别代表键盘和显示器,当程序通过System.in来获取输入时,实际上是从键盘读取输入;当程序试图通过System.out执行输出时

2、,程序总是输出到屏幕File类一个File类的对象,表示了磁盘上的文件或目录。 注意:Java里面没有dictionary类File类提供了与平台无关的方法来对磁盘上的文件或目录进行操作。File类直接处理文件和文件系统。File类没有指定信息怎样从文件读取或向文件存储import java.io.*;public class TestFile public static void main(String args) throws Exception /*/创建一个文件,当前目录下File file = new File(my.txt);boolean flag = file.createNe

3、wFile();System.out.println(flag);*/*/创建一个目录File file = new File(my);boolean flag = file.mkdir();System.out.println(flag);*/ /创建带绝对路径的文件File file = new File(c:my.txt);boolean flag = file.createNewFile();System.out.println(flag);一个File类的对象,表示了磁盘上的文件或目录File类描述了文件本身的属性 File对象用来获取或处理与磁盘文件相关的信息,例如权限,时间,日期

4、和目录路径File类还可以浏览子目录层次结构java.io包中的File类提供了与具体平台无关的方式来描述目录和文件对象的属性功能。其中包含大量的方法可用来获取路径、目录和文件的相关信息,并对它们进行创建、删除、改名等管理工作。因为不同的系统平台,对文件路径的描述不尽相同。为做到平台无关,在Java语言中,使用抽象路径等概念。Java自动进行不同系统平台的文件路径描述与抽象文件路径之间的转换。 java路径:”“反斜杠,在java中表示转义,因此需要两个反斜杠“”,表示windows平台的“c:windows”另外,也可以用正斜杠“/”,如c:/windows路径分隔符:File.separa

5、tor或者File.separatorChar, 在window平台下,转换为反斜杠,Unix等下转换为正斜杠;Linux等平台下,没有C盘,D盘的概念Example:使用分隔符实现跨平台文件创建import java.io.*;public class TestFile2 public static void main(String args) throws Exception /File fDir = new File(File.separator);/当前class所在盘的根目录File fDir = new File(File.separator + 173+File.separato

6、r + io + File.separator+ 123 + File.separator + 456);fDir.mkdirs();/对于不存在的目录,必须先调用此方法创建目录String strFile = hellow9999.txt;File file = new File(fDir,strFile);boolean flag = file.createNewFile();System.out.println(flag);File类的直接父类是Object类。下面的构造方法可以用来生成File 对象:File(String directoryPath)File(String direc

7、toryPath, String filename)File(File dirObj, String filename)这里,directoryPath是文件的路径名,filename 是文件名,dirObj 是一个指定目录的File对象 举例说明:File myFile = new File(myfile. txt);File myDir = new File(MyDocs);File myFile = new File(myDir, myfile. txt);这些构造方法取决于访问文件的方式。例如,若在应用程序里只用一个文件,第一种创建文件的结构是最容易的。但若在同一目录里打开数个文件,则

8、后种方法更好一些。Example:在目录下创建子目录及文件import java.io.File;import java.io.IOException;public class TestFile2public static void main(String args) throws IOExceptionFile fDir = new File(c:/abc);/目录 File file2 = new File(c:/abc, xyz/hello.txt);file2.createNewFile();注:必须先创建目录(即目录必须存在),才能创建文件。以上abc、xyz目录必须先创建判断是文件

9、还是目录isFile()测试此抽象路径名表示的文件是否是一个目录。isDirectory()测试此抽象路径名表示的文件是否是一个标准文件。目录管理 目录操作的主要方法为:public boolean mkdir() 根据抽象路径名创建目录。public String list() 返回抽象路径名表示路径中的文件名和目录名。Example(mkdir、mkdirs方法):import java.io.File;public class TestFile3public static void main(String args)File file = new File(c:/abc/xyz/hell

10、o);System.out.println(file.mkdir();/失败System.out.println(file.mkdirs();/成功System.out.println(file.isFile();System.out.println(file.isDirectory(); Example:list()方法import java.io.File;public class TestFile4public static void main(String args)File file = new File(d:/struts2-blank-2.1.6);/String names =

11、 file.list();/for(String name : names)/System.out.println(name);/File files = file.listFiles();for(File f : files)/System.out.println(f.getName();System.out.println(f.getParent(); 文件管理在进行文件操作时,常需要知道一个关于文件的信息。Jave的File类提供了方法来操纵文件和获得一个文件的信息。另外,File类还可以对目录和文件进行删除、属性修改等管理工作Example:import java.io.File;im

12、port java.io.IOException;public class TestFile5public static void main(String args) throws IOExceptionFile file = new File(C:abcxyzhelloabc.txt);/file.createNewFile();file.delete(); File 类定义了很多获取File对象标准属性的方法。例如getName( )返回文件名,getParent( )返回父目录名,exists( )在文件存在的情况下返回true,反之返回false。然而File类是不对称的。说它不对称,

13、意思是虽然存在允许验证一个简单文件对象属性的很多方法,但是没有相应的方法来改变这些属性File类中的常用方法 String getName()String getPath()String getAbsolutePath()String getParent()boolean renameTo( File newName)long length()boolean delete()boolean mkdir()String list()File类中的常用方法 boolean exists() boolean canWrite() boolean canRead() boolean isFile()

14、boolean isDirectory()public void property() /获取文件相关属性File f=new File(c:/db.ini); System.out.println(f.getName();/文件名 System.out.println(f.getPath();/文件路径 System.out.println(f.canRead();/只读 System.out.println(f.canWrite();/可写 System.out.println(f.isFile();/是文件吗 System.out.println(f.length();/长度目录是一个包

15、含其他文件和路径列表的File 类。 当你创建一个File 对象且它是目录时,isDirectory( ) 方法返回ture。这种情况下,可以调用该对象的list( )方法来提取该目录内部其他文件和目录的列表Example(获取某个目录下的所有名字以.java结尾的文件名):import java.io.File;public class FileTest6public static void main(String args)File file = new File(C:abcxyzhello);String names = file.list();for(String name : nam

16、es)if(name.endsWith(.java)/lastIndexOf不好,例如:a.javaxxaSystem.out.println(name);使用FilenameFilter 希望能够限制由list( )方法返回的文件数目,使它仅返回那些与一定的文件名方式或者过滤(filter)相匹配的文件。为达到这样的目的,必须使用list( )的第二种形式 (方法重载) String list(FilenameFilter FFObj) 该形式中,FFObj是一个实现FilenameFilter接口的类的对象FilenameFilter仅定义了一个方法,accept( )。该方法被列表中的每

17、个文件调用一次。它的通常形式如下: boolean accept(File directory, String filename) 当被directory 指定的目录中的文件(也就是说,那些与filename 参数匹配的文件)包含在列表中时,accept( )方法返回true ,当这些文件没有包括在列表中时,accept( )返回falseExample:import java.io.File;import java.io.FilenameFilter;public class TestFile7public static void main(String args)File file = n

18、ew File(C:abcxyzhello);String names = file.list(new FilenameFilter()/匿名内部类,策略模式public boolean accept(File dir, String name)if(name.endsWith(.txt)return true;return false;);for(String name : names)System.out.println(name); 第三种listFiles( )形式返回满足指定FileFilter的路径名的文件。FileFilter只定义了一个 accept( )方法,该方法被列表中的

19、每个文件调用一次。它的通常形式如下: boolean accept(File path) 如果文件被包括在列表中(即与path参数匹配的文件),accept( )方法返回true,如果不被包括,则返回false。listFiles()方法File listFiles( )File listFiles(FilenameFilter FFObj)File listFiles(FileFilter FObj) 上述三种形式以File对象数组的形式返回文件列表,而不是用字符串形式返回。第一种形式返回所有的文件,第二种形式返回满足指定FilenameFilter接口的文件。除了返回一个File 对象数组

20、,这两个listFiles( )方法就像list( )方法一样工作所谓递归(Recursion),就是方法调用自身。对于递归来说,一定有一个出口,让递归结束,只有这样才能保证不出现死循环。递归算法:Example:计算阶乘public class TestRecursion/循环方式计算阶乘,又叫做迭代方式public int compute(int number)int result = 1;for(int i = number; i 0; i-)result *= i;return result;/使用递归方式计算阶乘public int compute2(int number)if(1

21、= number)return 1;elsereturn number * compute2(number - 1);public static void main(String args)TestRecursion test = new TestRecursion();System.out.println(pute(15);System.out.println(pute2(15);流4个抽象基类InputStream/Reader: 所有输入流的基类,前者是字节输入流,后者是字符输入流OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流流的概念及分类流

22、的概念Java程序通过流来完成输入/输出。流是生产或消费信息的抽象。流通过Java的输入/输出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。流是处理输入/输出的一个洁净的方法,例如它不需要代码理解键盘和网络的不同。Java中流的实现是在java.io包定义的类层次结构内部的。输入输出流输入/输出时,数据在通信通道中流动。所谓“数据流(stream)”指的是所有数据通信通

23、道之中,数据的起点和终点。信息的通道就是一个数据流。只要是数据从一个地方“流”到另外一个地方,这种数据流动的通道都可以称为数据流。输入/输出是相对于程序来说的。程序在使用数据时所扮演的角色有两个:一个是源,一个是目的。若程序是数据流的源,即数据的提供者,这个数据流对程序来说就是一个“输出数据流”(数据从程序流出)。若程序是数据流的终点,这个数据流对程序而言就是一个“输入数据流” ( 数据从程序外流向程序) 输入/输出类在java.io包中提供了60多个类(流)。从功能上分为两大类:输入流和输出流。从流结构上可分为字节流(以字节为处理单位或称面向字节)和字符流(以字符为处理单位或称面向字符)。

24、字节流的输入流和输出流基础是InputStream和OutputStream这两个抽象类,字节流的输入输出操作由这两个类的子类实现。字符流是Java 1.1版后新增加的以字符为单位进行输入输出处理的流,字符流输入输出的基础是抽象类Reader和Writer字节流和字符流Java 2 定义了两种类型的流:字节流和字符流。字节流(byte stream)为处理字节的输入和输出提供了方便的方法。例如使用字节流读取或写入二进制数据。字符流(character stream)为字符的输入和输出处理提供了方便。它们采用了统一的编码标准,因而可以国际化。当然,在某些场合,字符流比字节流更有效Java的原始版

25、本(Java 1.0)不包括字符流,因此所有的输入和输出都是以字节为单位的。Java 1.1中加入了字符流的功能. 在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法 字节流类(Byte Streams) 字节流类用于向字节流读写8位二进制的字节。一般地,字节流类主要用于读写诸如图象或声音等的二进制数据。 字符流类(Character Streams) 字符流类用于向字符流读写16位二进制字符。流的分类两种基本的流是:输入流(Input Stream)和输出流(Output Stream)。可从中读出一系列字节的对象称为输入流。而能向其中写入一系列字节的对象称

26、为输出流。输入流:读数据的逻辑为:1、open a stream 打开一个流2、while more information一般情况下,不会一次性读完(使用while循环,一直取完)3、read information读取流4、close the stream关闭流流是一种资源,使用完毕后,需要关闭输出流:(从程序到外部)写数据的逻辑为:1、open a stream打开一个流2、while more information3、write information4、close the stream流的分类:节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。与特定的目标有关联如文件过滤(

27、处理)流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。过滤流的父类:FilterInputStream/FilterOutputStream与目标关联的一定是节点流字节流类为处理字节式输入/输出提供了丰富的环境。一个字节流可以和其他任何类型的对象并用,包括二进制数据。这样的多功能性使得字节流对很多类型的程序都很重要。字节流类以InputStream 和OutputStream为顶层类,他们都是抽象类(abstract)抽象类InputStream和 OutputStream定义了实现其他流类的关键方法。最重要的两种方法是read()和write(),它们分别对

28、数据的字节进行读写。两种方法都在InputStream 和OutputStream中被定义为抽象方法。它们被派生的流类重写。每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件(FileInputStream),网络连接,甚至是内存缓冲区。要使用流类,必须导入java.io包InputStreamInputStream三个基本的读方法:abstract int read() :读取一个字节数据, 并返回读到的数据,如果返回-1,表示读到了输入流的末尾。int read(byte b) :将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1, 表示读到了输入流的末尾

29、。int read(byte b , int off , int len):将数据读入一个字节数组,同时返回实际读取的字节 数。如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。为什么只有第一个read方法是抽象的,而其余两个read方法都是具体的?因为第二个read方法依靠第三个read方法来实现,而第三个read方法又依靠第一个read方法来实现,所以说只有第一个read方法是与具体的I/O设备相关的,它需要InputStream的子类来实现。(参考JDK源代码,如从文件读和从网络读肯定有区别)Example:public cla

30、ss TestInputStreampublic static void main(String args) throws ExceptionInputStream is = new FileInputStream(c:/a.txt);byte buffer = new byte1024;int length = 0;while (-1 != (length = is.read(buffer, 0, 1024)/type type = (/type) en.nextElement();/字节转换为字符串String str = new String(buffer,0,length); Syst

31、em.out.println(str);is.close();/把这个流关联到的资源关闭注:写法都很固定InputStream其它方法:long skip(long n) :在输入流中跳过n个字节,并返回实际跳过的字节数。int available() :返回在不发生阻塞的情况下,可读取的字节数。void close() :关闭输入流,释放和这个流相关的系统资源。void mark(int readlimit) :在输入流的当前位置放置一个标记,如果读取的字节数多于readlimit设置的值, 则流忽略这个标记。void reset() :返回到上一个标记。boolean markSuppor

32、ted() :测试当前流是否支持 mark和reset方法。如果支持,返回true,否则返回 false。 该类的所有方法在出错条件下引发一个IOException 异常 通过打开一个到数据源(文件、内存或网络端口上的数据)的输入流,程序可以从数据源上顺序读取数据。java.io.包中InputStream的类层次InputStream中包含一套字节输入流需要的方法,可以完成最基本的从输入流读入数据的功能。当Java程序需要外设的数据时,可根据数据的不同形式,创建一个适当的InputStream子类类型的对象来完成与该外设的连接,然后再调用执行这个流类对象的特定输入方法来实现对相应外设的输入操

33、作。InputStream 类子类对象自然也继承了InputStream类的方法。常用的方法有:读数据的方法 read() , 获取输入流字节数的方法available(),定位输入位置指针的方法skip()、reset()、mark()等。OutputStremOutputStrem三个基本的写方法abstract void write(int b) :往输出流中写入一个字节。void write(byte b) :往输出流中写入数组b中的所有字节。void write(byte b, int off, int len) :往输出流中写入数组b中从偏移量off开始的len个字节的数据 其它方

34、法void flush() :刷新输出流,强制缓冲区中的输出字节被写出。void close() :关闭输出流,释放和这个流相关的系统资源。 OutputStream是定义了流式字节输出模式的抽象类。该类的所有方法返回一个void 值并且在出错情况下引发一个IOException异常。 通过打开一个到目标的输出流,程序可以向外部目标顺序写数据java.io.包中OutputStream的类层次 OutputStream中包含一套字节输出流需要的方法,可以完成最基本的输出数据到输出流的功能。当Java程序需要将数据输出到外设时,可根据数据的不同形式,创建一个适当的OutputStream子类类型

35、的对象来完成与该外设的连接,然后再调用执行这个流类对象的特定输出方法来实现对相应外设的输出操作。 OutputStream类子类对象也继承了OutputStream类的方法。常用的方法有:写数据的方法write(),关闭流方法close()等。Example:import java.io.FileOutputStream;import java.io.OutputStream;public class TestOutputStreampublic static void main(String args) throws Exception/OutputStream os = new FileO

36、utputStream(c:out.txt,);/覆盖OutputStream os = new FileOutputStream(c:out.txt, true);/true表示追加String str = aaaaa;byte buffer = str.getBytes();os.write(buffer);/内容比较少,一次性写入文件os.close();过滤流: 在InputStream类和OutputStream类子类中,FilterInputStream和FilterOutputStream过滤流抽象类又派生出DataInputStream和DataOutputStream数据输入

37、输出流类等子类。 过滤流的主要特点是在输入输出数据的同时能对所传输的数据做指定类型或格式的转换,即可实现对二进制字节数据的理解和编码转换。 数据输入流DataInputStream中定义了多个针对不同类型数 据 的 读 方 法 , 如 readByte() 、 readBoolean() 、readShort()、readChar()、readInt()、readLong()、readFloat()、readDouble()、readLine()等。 数据输出流DataOutputStream中定义了多个针对不同类型数据的 写 方法 , 如 writeByte() 、writeBoolean(

38、) 、writeShort()、writeChar()、writeInt()、writeLong()、writeFloat()、writeDouble()、writeChars()等。 过滤流在读/写数据的同时可以对数据进行处理,它提供了同步机制,使得某一时刻只有一个线程可以访问一个I/O流,以防止多个线程同时对一个I/O流进行操作所带来的意想不到的结果。 类FilterInputStream和FilterOutputStream分别作为所有过滤输入流和输出流的父类。基本的流类: FileInputStream和FileOutputStream节点流,用于从文件中读取或往文件中写入字节流。如果

39、在构造FileOutputStream时,文件已经存在,则覆盖这个文件。 BufferedInputStream和 BufferedOutputStream过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。 DataInputStream和DataOutputStream 过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数 据类型的功能。 PipedInputStream和PipedOutputStream管道流,用于线程间的通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有

40、用,必须同时构造管道输入流和管道输出流。I/O流的链接:Java I/O库的设计原则 Java的I/O库提供了一个称做链接的机制,可以将一个流与另一个流首尾相接,形成一个流管道的链接。这种机制实际上是一种被称为Decorator(装饰)设计模式的应用。 通过流的链接,可以动态的增加流的功能,而这种功能的增加是通过组合一些流的基本功能而动态获取的。 我们要获取一个I/O对象,往往需要产生多个I/O对象,这也是Java I/O库不太容易掌握的原因,但在I/O库中Decorator模式的运用,给我们提供了实现上的灵活性。预定义流 为方便使用计算机常用的输入输出设备,各种高级语言与操作系统对应,都规定

41、了可用的标准设备(文件)。所谓标准设备(文件),也称为预定义设备(文件),在程序中使用这些设备(文件)时,可以不用专门的打开操作就能简单的应用。一般地,标准输入设备是键盘,标准输出设备是终端显示器,标准错误输出设备也是显示器 所有的Java程序自动导入java.lang包。该包定义了一个名为System的类,该类封装了运行时环境的多方面信息。例如,使用它的某些方法,你能获得当前时间和与系统有关的不同属性。System 同时包含三个预定义的流变量,in,out和err。这些成员在System中是被定义成public和static型的,这意味着它们可以不引用特定的System对象而被用于程序的其他

42、部分。 System.out是标准的输出流。默认情况下,它是一个控制台。System.in是标准输入,默认情况下,它指的是键盘。System.err指的是标准错误流,它默认是控制台。然而,这些流可以重定向到任何兼容的输入/输出设备 System.in 是InputStream的对象;System.out和System.err是PrintStream的对象。它们都是字节流,尽管它们用来读写外设的字符。如果愿意,你可以用基于字符的流来包装它们标准输入 System类的类变量in表示标准输入流,其定义为: public static final InputStream in 标准输入流已打开,作好提

43、供输入数据的准备。一般这个流对应键盘输入,可以使用InputStream 类的read()和skip(long n)等方法来从输入流获得数据。read()从输入流中读一个字节,skip(long n)在输入流中跳过n个字节。标准输出 System类的类变量out表示标准输出流,其定义为: public static final PrintStream out 标准输出流也已打开,作好接收数据的准备。一般这个流对应显示器输出。 可以使用PrintStream 类的print()和println()等方法来输出数据,这两个方法支持Java的任意基本类型作为参数。标准错误输出 System类的类变量err表示标准错误输出流,其定义为: public static final PrintStream err 标准错误输出流已打开,作好接收数据的准备。一般这个流也对应显示器输出,与System.out一样,可以访问PrintStream类的方法。Example:文件的读写 Java提供了一系列的读写文件的类和方法。在Java中,所有的文件都是字节形式的。Java提供从文件读写

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


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