51CTO下载Java网络编程+讲义.docx
- 文档编号:7348712
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:98
- 大小:86.74KB
51CTO下载Java网络编程+讲义.docx
《51CTO下载Java网络编程+讲义.docx》由会员分享,可在线阅读,更多相关《51CTO下载Java网络编程+讲义.docx(98页珍藏版)》请在冰豆网上搜索。
51CTO下载Java网络编程+讲义
Java网络编程
(讲义)
教学单位:
信息学院
适用专业:
计算机科学与技术、网络工程
适用年级:
2007级本科
讲义编写:
王立波
第一章Java的数据流
输入/输出(Input/Output)泛指对某个设备或环境进行数据的输入或输出。
例如对硬盘进行输入/输出、对视频设备进行输入/输出、对网络主机进行输入/输出等,可以想象,因设备或环境的不同,会有各式各样的输入/输出问题与解决方案。
输入/输出问题在程序设计中实际上是一个很复杂的问题。
对于输入/输出问题,Java将之抽象化为流(Stream)对象来解决。
对不同的输入/输出问题,会有相应的流对象提供解决的方案。
本章就是要学习Java中各式各样解决输入/输出问题的对象。
然而输入/输出问题所涉及的领域相当广,基于学习的角度来看,必须选择一个主题来专门讨论,所以本章主题会围绕在文件输入/输出。
第一节数据流的基本概念
流一般分为输入流(InputStream)和输出流(OutputStream)两类,但这种划分并不是绝对的。
比如一个文件,当向其中写数据时,它就是一个输出流;当从其中读取数据时,它就是一个输入流。
当然,键盘只是一个数人流,而屏幕则只是一个输出流。
1、Java的标准数据流
标准输入输出指在字符方式下(如DOS),程序与系统进行交互的方式,分为三种:
标准输入studin,对象是键盘、标准输出stdout,对象是屏幕、标准错误输出stderr,对象也是屏幕。
例1从键盘输入字符。
用System.in.read(buffer)从键盘输入一行字符,存储在缓冲区buffer中,count保存实际读入的字节个数,再以整数和字符两种方式输出buffer中的值。
Read方法在java.io包中,而且要抛出IOException异常。
程序如下:
importjava.io.*;
publicclassInput1{
publicstaticvoidmain(Stringargs[])throwsIOException{
System.out.println("Input:
");
bytebuffer[]=newbyte[512];//输入缓冲区
intcount=System.in.read(buffer);//读取标准输入流
System.out.println("Output:
");
for(inti=0;i System.out.print(""+buffer[i]); } System.out.println(); for(inti=0;i System.out.print((char)buffer[i]); } System.out.println("count="+count);//buffer实际长度 } } 程序中,main方法采用throws子句抛出IOException异常交由系统处理。 2、java.io包中的数据流及文件类 字节流: 从InputStream和OutputStream派生出来的一系列类。 这类流以字节(byte)为基本处理单位。 ◇InputStream、OutputStream ◇FileInputStream、FileOutputStream ◇PipedInputStream、PipedOutputStream ◇ByteArrayInputStream、ByteArrayOutputStream ◇FilterInputStream、FilterOutputStream ◇DataInputStream、DataOutputStream ◇BufferedInputStream、BufferedOutputStream 字符流: 从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。 ◇Reader、Writer ◇InputStreamReader、OutputStreamWriter ◇FileReader、FileWriter ◇CharArrayReader、CharArrayWriter ◇PipedReader、PipedWriter ◇FilterReader、FilterWriter ◇BufferedReader、BufferedWriter ◇StringReader、StringWriter 第二节字节流初步 InputStream和OutputStream read(): 从流中读入数据 skip(): 跳过流中若干字节数 available(): 返回流中可用字节数 mark(): 在流中标记一个位置 reset(): 返回标记过得位置 markSupport(): 是否支持标记和复位操作 close(): 关闭流 intread()从输入流中读一个字节,形成一个0~255之间的整数返回(是一个抽象方法)。 intread(byteb[])读多个字节到数组中。 intread(byteb[],intoff,intlen) write(intb)将一个整数输出到流中(只输出低位字节,抽象) write(byteb[])将字节数组中的数据输出到流中 write(byteb[],intoff,intlen)将数组b中从off指定的位置开始,长度为len的数据输出到流中 flush(): 刷空输出流,并将缓冲区中的数据强制送出 close(): 关闭流 从输入流中读取长度为len的数据,写入数组b中从索引off开始的位置,并返回读取得字节数。 进行I/O操作时可能会产生I/O例外,属于非运行时例外,应该在程序中处理。 如: 型FileNotFoundException,EOFException,IOException 例2打开文件。 本例以FileInputStream的read(buffer)方法,每次从源程序文件OpenFile.java中读取512个字节,存储在缓冲区buffer中,再将以buffer中的值构造的字符串newString(buffer)显示在屏幕上。 程序如下: importjava.io.*; publicclassOpenFile{ publicstaticvoidmain(Stringargs[])throwsIOException{ try{//创建文件输入流对象 FileInputStreamrf=newFileInputStream("OpenFile.java"); intn=512; bytebuffer[]=newbyte[n]; while((rf.read(buffer,0,n)! =-1)&&(n>0))//读取输入流 {System.out.print(newString(buffer));} System.out.println(); rf.close();//关闭输入流 }catch(IOExceptionioe){System.out.println(ioe);} catch(Exceptione){System.out.println(e);} } } 例3写入文件。 本例用System.in.read(buffer)从键盘输入一行字符,存储在缓冲区buffer中,再以FileOutStream的write(buffer)方法,将buffer中内容写入文件Write1.txt中,程序如下: importjava.io.*; publicclassWrite1{ publicstaticvoidmain(Stringargs[]){ try{ System.out.print("Input: "); intcount,n=512; bytebuffer[]=newbyte[n]; count=System.in.read(buffer);//读取标准输入流 FileOutputStreamwf=newFileOutputStream("Write1.txt");//创建文件输出流对象 wf.write(buffer,0,count);//写入输出流 wf.close();//关闭输出流 System.out.println("SavetoWrite1.txt! "); }catch(IOExceptionioe){ System.out.println(ioe); }catch(Exceptione){ System.out.println(e); } } } 第三节文件操作 1、File类 File类声明如下: publicclassFileectendsObjectimplementsSerializable,Comparable 构造方法: publicFile(Stringpathname) publicFile(Filepatent,Stringchile) publicFile(Stringpatent,Stringchild) 2、文件名的处理 StringgetName();//得到一个文件的名称(不包括路径) StringgetPath();//得到一个文件的路径名 StringgetAbsolutePath();//得到一个文件的绝对路径名 StringgetParent();//得到一个文件的上一级目录名 StringrenameTo(FilenewName);//将当前文件名更名为给定文件的完整路径文件属性测试 booleanexists();//测试当前File对象所指示的文件是否存在 booleancanWrite();//测试当前文件是否可写 booleancanRead();//测试当前文件是否可读 booleanisFile();//测试当前文件是否是文件(不是目录) booleanisDirectory();//测试当前文件是否是目录 3、普通文件信息和工具 longlastModified();//得到文件最近一次修改的时间 longlength();//得到文件的长度,以字节为单位 booleandelete();//删除当前文件 4、目录操作 booleanmkdir();//根据当前对象生成一个由该对象指定的路径 Stringlist();//列出当前目录下的文件 例4自动更新文件。 本例使用File类对象对指定文件进行自动更新的操作。 程序如下: importjava.io.*; importjava.util.Date; importjava.text.SimpleDateFormat; publicclassUpdateFile{ publicstaticvoidmain(Stringargs[])throwsIOException{ Stringfname="Write1.txt";//待复制的文件名 Stringchilddir="backup";//子目录名 newUpdateFile().update(fname,childdir); } publicvoidupdate(Stringfname,Stringchilddir)throwsIOException{ Filef1,f2,child; f1=newFile(fname);//当前目录中创建文件对象f1 child=newFile(childdir);//当前目录中创建文件对象child if(f1.exists()){ if(! child.exists())//child不存在时创建子目录 child.mkdir(); f2=newFile(child,fname);//在子目录child中创建文件f2 if(! f2.exists()||//f2不存在时或存在但日期较早时 f2.exists()&&(f1.lastModified()>f2.lastModified())) copy(f1,f2);//复制 getinfo(f1); getinfo(child); }else System.out.println(f1.getName()+"filenotfound! "); } publicvoidcopy(Filef1,Filef2)throwsIOException{ FileInputStreamrf=newFileInputStream(f1);//创建文件输入流对象 FileOutputStreamwf=newFileOutputStream(f2);//创建文件输出流对象 intcount,n=512; bytebuffer[]=newbyte[n]; count=rf.read(buffer,0,n);//读取输入流 while(count! =-1){ wf.write(buffer,0,count);//写入输出流 count=rf.read(buffer,0,n); } System.out.println("CopyFile"+f2.getName()+"! "); rf.close();//关闭输入流 wf.close();//关闭输出流 } publicstaticvoidgetinfo(Filef1)throwsIOException{ SimpleDateFormatsdf; sdf=newSimpleDateFormat("yyyy年MM月dd日hh时mm分"); if(f1.isFile()) System.out.println(" f1.length()+"\t"+sdf.format(newDate(f1.lastModified()))); else{ System.out.println("\t"+f1.getAbsolutePath()); File[]files=f1.listFiles(); for(inti=0;i getinfo(files[i]); } } } f1.lastModified()返回一个表示日期的长整型,值为从1970年1月1日零时开始计算的毫秒数,并以此长整型构造一个日期对象,再按指定格式输出日期。 5、文件过滤器 类FilterInputStream和FilterOutputStream分别对其他输入/输出流进行特殊处理,它们在读/写数据的同时可以对数据进行特殊处理。 另外还提供了同步机制,使得某一时刻只有一个线程可以访问一个输入/输出流。 类FilterInputStream和FilterOutputStream分别重写了父类InputStream和OutputStream的所有方法,同时,它们的子类也应该重写它们的方法以满足特定的需要。 要使用过滤流,首先必须把它连接到某个输入/输出流上,通常在构造方法的参数中指定所要连接的流: FilterInputStream(InputStreamin); FilterOutputStream(OutputStreamout); 这两个类是抽象类,构造方法也是保护方法。 类BufferedInputStream和BufferedOutputStream实现了带缓冲的过滤流,它提供了缓冲机制,把任意的I/O流“捆绑”到缓冲流上,可以提高读写效率。 在初始化时,除了要指定所连接的I/O流之外,还可以指定缓冲区的大小。 缺省大小的缓冲区适合于通常的情形;最优的缓冲区大小常依赖于主机操作系统、可使用的内存空间以及机器的配置等;一般缓冲区的大小为内存页或磁盘块等地整数倍,如8912字节或更小。 BufferedInputStream(InputStreamin[,intsize]) BufferedOutputStream(OutputStreamout[,intsize]) 例5列出当前目录中带过滤器的文件名清单。 本例实现FilenameFilter接口中的accept方法,在当前目录中列出带过滤器的文件名。 程序如下: importjava.io.*; publicclassDirFilterimplementsFilenameFilter{ privateStringprefix="",suffix="";//文件名的前缀、后缀 publicDirFilter(Stringfilterstr){ filterstr=filterstr.toLowerCase(); inti=filterstr.indexOf('*'); intj=filterstr.indexOf('.'); if(i>0) prefix=filterstr.substring(0,i); if(j>0) suffix=filterstr.substring(j+1); } publicstaticvoidmain(Stringargs[]){ FilenameFilterfilter=newDirFilter("w*abc.txt");//创建带通配符的文件名过滤器对象 Filef1=newFile(""); Filecurdir=newFile(f1.getAbsolutePath(),"");//当前目录 System.out.println(curdir.getAbsolutePath()); String[]str=curdir.list(filter);//列出带过滤器的文件名清单 for(inti=0;i System.out.println("\t"+str[i]); } publicbooleanaccept(Filedir,Stringfilename){ booleanyes=true; try{ filename=filename.toLowerCase(); yes=(filename.startsWith(prefix))&(filename.endsWith(suffix)); }catch(NullPointerExceptione){} returnyes; } } 程序运行时,列出当前目录中符合过滤条件“w*.txt“的文件名清单。 6、随机文件操作 对于InputStream和OutputStream来说,它们的实例都是顺序访问流,也就是说,只能对文件进行顺序地读/写。 随机访问文件则允许对文件内容进行随机读/写。 在java中,类RandomAccessFile提供了随机访问文件的方法。 类RandomAccessFile的声明为: publicclassRandomAccessFileextendsObjectimplementsDataInput,DataOutput File: 以文件路径名的形式代表一个文件 FileDescriptor: 代表一个打开文件的文件描述 FileFilter&FilenameFilter: 用于列出满足条件的文件 File.list(FilenameFilterfnf) File.listFiles(FileFilterff) FileDialog.setFilenameFilter(FilenameFilterfnf) FileInputStream&FileReader: 顺序读文件 FileOutputStream&FileWriter: 顺序写文件 RandomAccessFile: 提供对文件的随机访问支持 类RandomAccessFile则允许对文件内容同时完成读和写操作,它直接继承Object,并且同时实现了接口DataInput和DataOutput,提供了支持随机文件操作的方法 DataInput和DataOutput中的方法 readInt(),writeDouble()… intskipBytes(intn): 将指针乡下移动若干字节 length(): 返回文件长度 longgetFilePointer(): 返回指针当前位置 voidseek(longpos): 将指针调到所需位置 voidsetLength(longnewLength): 设定文件长度 构造方法: RandomAccessFile(Filefile,Stringmode) RandomAccessFile(Stringname,Stringmode) mode的取值 “r”只读.任何写操作都将抛出IOException。 “rw”读写.文件不存在时会创建该文件,文件存在时,原文件内容不变,通过写操作改变文件内容。 “rws”同步读写.等同于读写,但是任何协操作的内容都被直接写入物理文件,包括文件内容和文件属性。 “rwd”数据同步读写.等同于读写,但任何内容写操作都直接写到物理文件,对文件属性内容的修改不是这样。 例6随机文件操作。 本例对一个二进制整数文件实现访问操作当以可读写方式“rw“打开一个文件”prinmes.bin“时,如果文件不存在,将创建一个新文件。 先将2作为最小素数写入文件,再依次测试100以内的奇数,将每次产生一个素数写入文件尾。 程序如下: importjava.io.*; publicclassPrimesFile{ RandomAccessFileraf; publicstaticvoidmain(Stringargs[])throwsIOException{ (newPrimesFile()).createprime(100); } publicvoidcreateprime(intmax)throwsIOException{ raf=newRandomAccessFile("primes.bin","rw");//创建文件对象 raf.seek(0);//文件指针为0 raf.writeInt (2);//写入整型 intk=3; while(k<=max){ if(isPrime(k)) raf.writeInt(k); k=k+2; } output(max); raf.close();//关闭文件 } publicbooleanisPrime(intk)throwsIOException{ inti=0,j; boo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 CTO 下载 Java 网络 编程 讲义