资源描述
1,第六章输入输出流,2,6.1输入输出基础,在Java语言中,输入与输出完全基于“流”这个概念。Java输入输出的流式接口为复杂而繁重的I/O编程任务提供了一个简洁的抽象。,一、流的概念Java程序通过流来完成输入/输出。流通过Java的输入/输出系统与物理设备链接。输入流能够抽象多种不同类型的输入:从磁盘文件、从键盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。二、字节流和字符流在Java2中,定义了两种类型的流:字节类和字符类。1.字节流字节流(bytestream)为处理字节的输入和输出提供了方便的方法。可以使用字节流读取或书写二进制数据。,3,字节流由两个类层次结构定义。在顶层有两个抽象类:InputStream和OutputStream。这两个抽象类定义了实现其他流类的关键方法。最重要的两种方法是read()和write(),它们分别对数据的字节进行读写,这两种方法在InputStream和OutputStream中被定义为抽象方法,它们都被派生的流类重载。下面是几个常用的具体的字节流类:BufferedInputStream:缓冲输入流BufferedOutputStream:缓冲输出流FileInputStream:读取文件的输入流FileOutputStream:写文件的输出流InputStream:描述流输入的抽象类OutputStream:描述流输出的抽象类PrintStream:包含print()和println()的输出流RandomAccessFile:支持随机文件输入/输出,4,2.字符流字符流(characterstream)为字符的输入和输出处理提供了方便。字符流的顶层有两个抽象类:Reader和Writer。这两个抽象类定义了实现其他流类的关键方法。最重要的两种方法是read()和write(),它们分别进行字符的读写,都被派生的流类重载。下面是几个常用的具体的字符流类:BufferedReader:缓冲输入字符流BufferedWriter:缓冲输出字符流FileReader:读取文件的输入流FileWriter:写文件的输出流InputStreamReader:把字节转换成字符的输入流LineNumberReader:计算行数的输入流OutputStreamWriter:把字符转换成字节的输出流PrintWriter:包含print()和println()的输出流Reader:描述字符流输入的抽象类Writer:描述字符流输出的抽象类,5,三、预定义流所有的Java程序运行时自动导入java.lang包,这个包定义了一个名为System的类,该类封装了运行时环境的多个方面。System还包含有3个预定义的字节流变量in、out和err。他们的定义如下:publicstaticInputStreamin;publicstaticPrintStreamout;publicstaticPrintStreamerr;,6,6.2控制台输入输出,一、控制台输入1.BufferedReader缓冲输入字符流类在Java2中,读取控制台输入的首选方法应该是字符流,它使程序容易符合国际标准,并且易于维护。控制台输入由从System.in读取数据来完成。BufferedReader的构造函数用法如下:BufferedReader(ReaderinputReader)其中,inputReader是链接被创建的BufferedReader实例的流。Reader是一个抽象的类,InputStreamReader是Reader的一个具体子类,该子类将字节转换成字符。InputStreamReader的构造函数为:InputStreamReader(InputStreaminputStream)可以这样使用:InputStreamReader(System.in),7,综上所述,下面的代码创建了与键盘相连的BufferedReader对象:BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in)2.BufferedReader中重载方法read()和readLine()read()方法intread()throwsIOException该方法每次执行都从输入流中读取一个字符,然后以整型形式返回。当遇到流的尾时,返回-1。readLine()方法StringreadLine()throwsIOException该方法每次执行从输入流中读取一行字符,然后以String形式返回。当遇到流的尾时,返回null。,8,importjava.io.*;publicclassinputFISpublicstaticvoidmain(Stringargs)BufferedReaderss=newBufferedReader(newInputStreamReader(System.in);Strings,input;inta;floatb;charc;tryinput=ss.readLine();s=input;a=Integer.parseInt(input);b=Float.parseFloat(input);c=(char)ss.read();,必须进行强制类型转换,9,System.out.println(s);System.out.println(a);System.out.println(b);System.out.println(c);catch(IOExceptione)System.out.println(therearesomewronginI/O);,注:捕获的异常类型是Exception时,若输入数据不符合parse方法的参数要求,该异常会被捕获到。捕获的异常类型是IOException时,若输入的数据不符合parse方法的参数要求,该异常不会被捕获到,出现运行时错误。,异常类型可以是Exception,10,程序运行时,从键盘输入:1234(若输入非数字串则有运行错误)wrh输出1234字符串1234整型数据1234.0实型数据w字符型数据,11,3.每行输入多个数据项上面的例子采用逐行读取字符的方法,然后把每行数据作为输入赋给一个变量。如果希望每行数据包含多个子数据项,Java提供了专门的类StringTokenizer来分解一个包含分隔符号的大的字符串。用法如下:StringTokenizerst=newStringTokenizer(line,“:”)这里的字符串line的分隔符指定为“:”。也可指定多个分隔符,如果未指定分隔符,则使用缺省分隔符,即“空格”,“TAB”,”回车”。StringTokenizerst=newStringTokenizer(line)StringTokenizer有两个方法,nextToken()返回下一个标记,hasMoreTokens()返回后面是否还有标记。,12,importjava.io.*;importjava.util.*;publicclassinputFISpublicstaticvoidmain(Stringargs)BufferedReaderss=newBufferedReader(newInputStreamReader(System.in);Strings,input;/暂时容纳输入数据的临时字符串数组Stringfield=newString4;inta,fieldcount=0;floatb;charc;,13,tryinput=ss.readLine();/读取一行StringTokenizerst=newStringTokenizer(input,:);while(st.hasMoreTokens()fieldfieldcount=st.nextToken();fieldcount+;s=field0;a=Integer.parseInt(field1);b=Float.parseFloat(field2);c=(char)ss.read();System.out.println(s);System.out.println(a);System.out.println(b);System.out.println(c);catch(IOExceptione)System.out.println(therearesomewronginI/O);,14,二、控制台输出,Java使用System.out向控制台写数据,这种写数据方式是字节流的方式,另外,Java还提供基于字符的写操作,这个类是PrintWriter.PrintWriter定义了多个构造函数,下面是常用的一个:PrintWriter(OutputStreamoutputStream,BooleanflushOnNewline)其中,flushOnNewline控制Java是否在println()方法被调用时刷新输出流。如果flushOnNewline为true,刷新自动发生,否则,则不发生。,15,importjava.io.*;classPrintWriterDemopublicstaticvoidmain(Stringargs)PrintWriterpw=newPrintWriter(System.out,true);Strings=thisisatest;inti=-7;floatf=23.4f;pw.println(s);pw.println(i);pw.println(f);,16,例:从键盘上输入任意两个整数,求它们的和。,importjava.io.*;publicclassInputDemopublicstaticvoidmain(Stringargs)BufferedReaderread=newBufferedReader(newInputStreamReader(System.in);PrintWriterpw=newPrintWriter(System.out,true);inta,b,c;trya=Integer.parseInt(read.readLine();b=Integer.parseInt(read.readLine();c=a+b;pw.println(c=+c);catch(IOExceptione)pw.println(therearesomeerrors);,17,6.3文件的读写,一、常用的类对文件的读写操作和标准输入输出是十分类似的,需要注意的是要采用专门对文件操作的流,并应在合适的时候关闭流,否则系统资源无法得到释放。对文件操作时,其输入输出流分别是FileReader和FileWriter。二、举例例1:创建文件,即从键盘上输入数据,写入磁盘文件。,18,importjava.io.*;importjava.util.*;classFileWpublicstaticvoidmain(Stringargs)personpeople=newperson();Stringread;inti;BufferedReaderinput=newBufferedReader(newInputStreamReader(System.in);tryPrintWriterout=newPrintWriter(newFileWriter(e:/java/file/people.dat);,19,for(i=0;i3;i+)read=input.readLine();people.name=read;read=input.readLine();people.age=Integer.parseInt(read);read=input.readLine();people.id=read;out.println(people.name+people.age+people.id);out.close();catch(IOExceptione)System.out.println(ErrorforcreateFile);,20,classpersonpublicStringname;publicintage;publicStringid;,21,例2:从文件中读出数据,importjava.io.*;importjava.util.*;classFileRpublicstaticvoidmain(Stringargs)Stringread;tryBufferedReaderinput=newBufferedReader(newFileReader(e:/java/file/people.dat);read=input.readLine();while(!read.equals(null)System.out.println(read);read=input.readLine();input.close();,22,catch(IOExceptione)System.out.println(thefileisnotfound);catch(NullPointerExceptione)return;,23,6.4File类,File类直接处理文件和文件系统,它描述了文件本身的属性,例如:权限、时间、日期和目录路径。File类有三个构造函数。如下:File(StringdirectoryPath);File(StringdirectoryPath,Stringfilename);File(Filedirobj,Stringfilename);,24,importjava.io.File;classFileDemostaticvoidp(Strings)System.out.println(s);publicstaticvoidmain(Stringargs)Filef1=newFile(e:/java/file/people.dat);p(FileName:+f1.getName();p(Path:+f1.getPath();p(abcPath:+f1.getAbsolutePath();p(Parent:+f1.getParent();p(f1.canWrite()?iswriteable:isnotwriteable);p(f1.canRead()?isreadable:isnotreadable);p(filelastmodified:+f1.lastModified();p(Filesize:+f1.length()+Bytes);,25,输出结果如下:,
展开阅读全文