Java第八章.docx

上传人:b****1 文档编号:13729179 上传时间:2023-06-16 格式:DOCX 页数:34 大小:27.42KB
下载 相关 举报
Java第八章.docx_第1页
第1页 / 共34页
Java第八章.docx_第2页
第2页 / 共34页
Java第八章.docx_第3页
第3页 / 共34页
Java第八章.docx_第4页
第4页 / 共34页
Java第八章.docx_第5页
第5页 / 共34页
Java第八章.docx_第6页
第6页 / 共34页
Java第八章.docx_第7页
第7页 / 共34页
Java第八章.docx_第8页
第8页 / 共34页
Java第八章.docx_第9页
第9页 / 共34页
Java第八章.docx_第10页
第10页 / 共34页
Java第八章.docx_第11页
第11页 / 共34页
Java第八章.docx_第12页
第12页 / 共34页
Java第八章.docx_第13页
第13页 / 共34页
Java第八章.docx_第14页
第14页 / 共34页
Java第八章.docx_第15页
第15页 / 共34页
Java第八章.docx_第16页
第16页 / 共34页
Java第八章.docx_第17页
第17页 / 共34页
Java第八章.docx_第18页
第18页 / 共34页
Java第八章.docx_第19页
第19页 / 共34页
Java第八章.docx_第20页
第20页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Java第八章.docx

《Java第八章.docx》由会员分享,可在线阅读,更多相关《Java第八章.docx(34页珍藏版)》请在冰点文库上搜索。

Java第八章.docx

Java第八章

第八章输入输出流

【课前思考】

1.字节流和字符流的基类各是什么?

2.什么是对象的串行化?

对象串行化的作用是什么?

【学习目标】

本讲主要讲述了java语言中的输入/输出的处理,通过本讲的学习,同学们可以编写更为完善的java程序。

【学习指南】

仔细阅读本章各知识点的内容,深刻理解java语言中输入/输出流的处理方法,掌握处理问题的方法,多练习,多上机。

【难重点】

●遇到实际问题时,要根据需要正确使用各种输入/输出流,特别是对中文使用适当的字符输入流。

●正确使用对象串行化的方法。

●处理字符流时,其构造方法的参数是一个字节流。

●对象串行化的概念。

【知识点】

●I/O流概述

●文件处理

●过滤流

●字符流的处理

●对象的串行化

●其它常用的流

【内容】

第一节数据流的基本概念

Ø理解数据流

流一般分为输入流(InputStream)和输出流(OutputStream)两类,但这种划分并不是绝对的。

比如一个文件,当向其中写数据时,它就是一个输出流;当从其中读取数据时,它就是一个输入流。

当然,键盘只是一个数人流,而屏幕则只是一个输出流。

ØJava的标准数据流

标准输入输出指在字符方式下(如DOS),程序与系统进行交互的方式,分为三种:

标准输入studin,对象是键盘。

标准输出stdout,对象是屏幕。

标准错误输出stderr,对象也是屏幕。

例8.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异常交由系统处理。

Ø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

例8.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);

}

}

}

例8.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);

}

}

}

第三节文件操作

ØFile类

File类声明如下:

publicclassFileectendsObjectimplementsSerializable,Comparable

构造方法:

publicFile(Stringpathname)

publicFile(Filepatent,Stringchile)

publicFile(Stringpatent,Stringchild)

文件名的处理

ØStringgetName();//得到一个文件的名称(不包括路径)

ØStringgetPath();//得到一个文件的路径名

ØStringgetAbsolutePath();//得到一个文件的绝对路径名

ØStringgetParent();//得到一个文件的上一级目录名

ØStringrenameTo(FilenewName);//将当前文件名更名为给定文件的完整路径

文件属性测试

Øbooleanexists();//测试当前File对象所指示的文件是否存在

ØbooleancanWrite();//测试当前文件是否可写

ØbooleancanRead();//测试当前文件是否可读

ØbooleanisFile();//测试当前文件是否是文件(不是目录)

ØbooleanisDirectory();//测试当前文件是否是目录

普通文件信息和工具

ØlonglastModified();//得到文件最近一次修改的时间

Ølonglength();//得到文件的长度,以字节为单位

Øbooleandelete();//删除当前文件

目录操作

vbooleanmkdir();//根据当前对象生成一个由该对象指定的路径

vStringlist();//列出当前目录下的文件

例8.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("\t"+f1.getAbsolutePath()+"\t"+

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日零时开始计算的毫秒数,并以此长整型构造一个日期对象,再按指定格式输出日期。

程序运行结果如下:

D:

\myjava\Write1.txt62002年12月11日02时18分

D:

\myjava\backup

D:

\myjava\backup\Write1.txt62002年12月31日05时13分

Ø文件过滤器

类FilterInputStream和FilterOutputStream分别对其他输入/输出流进行特殊处理,它们在读/写数据的同时可以对数据进行特殊处理。

另外还提供了同步机制,使得某一时刻只有一个线程可以访问一个输入/输出流

类FilterInputStream和FilterOutputStream分别重写了父类InputStream和OutputStream的所有方法,同时,它们的子类也应该重写它们的方法以满足特定的需要

•要使用过滤流,首先必须把它连接到某个输入/输出流上,通常在构造方法的参数中指定所要连接的流:

–FilterInputStream(InputStreamin);

–FilterOutputStream(OutputStreamout);

这两个类是抽象类,构造方法也是保护方法

类BufferedInputStream和BufferedOutputStream实现了带缓冲的过滤流,它提供了缓冲机制,把任意的I/O流“捆绑”到缓冲流上,可以提高读写效率

•在初始化时,除了要指定所连接的I/O流之外,还可以指定缓冲区的大小。

缺省大小的缓冲区适合于通常的情形;最优的缓冲区大小常依赖于主机操作系统、可使用的内存空间以及机器的配置等;一般缓冲区的大小为内存页或磁盘块等地整数倍,如8912字节或更小。

–BufferedInputStream(InputStreamin[,intsize])

–BufferedOutputStream(OutputStreamout[,intsize])

例8.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“的文件名清单。

结果如下:

D:

\myjava

Write1.txt

Write2.txt

Ø文件对话框

Ø随机文件操作

于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”数据同步读写.等同于读写,但任何内容写操作都直接写到物理文件,对文件属性内容的修改不是这样。

例8.6随机文件操作。

本例对一个二进制整数文件实现访问操作当以可读写方式“rw“打开一个文件”prinmes.bin“时,如果文件不存在,将创建一个新文件。

先将2作为最小

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

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2