Java输入输出流的示例分析

89次阅读
没有评论

共计 10907 个字符,预计需要花费 28 分钟才能阅读完成。

Java 输入输出流的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1Java 输入输出流

所有的程序语言都提?copy; 与本机文件系统交互的方式;Java 也不例外。我们将看看 Java 是怎样处理标准文件输入输出的 (包括 stdin,stout,stderr)。当你在网络上开发小程序时,你必须注意直接文件输入输出是不安全因素的关键。大多数用户设置他们的浏览器,可让你自由的访问他们的文件系统,但有?copy; 不让你访问。当然,如果你开发你内部的应用程序,你也许需要直接访问文件。

标准输入输出 Unix 的用户,或其他基于命令行系统的用户 (如 DOS),都知道标准输入输出的含义。标准输入文件是键盘,标准输出文件是你的终端屏幕。标准错误输出文件也指向屏幕,如果有必要,它也可以指向另一个文件以便和正常输出区分。

系统类 Java 通过系统类达到访问标准输入输出的功能。上面提到的三个文件在这个系统类中实现:StdinSystem.in 作为 InputStream 类的一个实例来实现 stdin,你可以使用 read() 和 skip(longn) 两个成员函数。read() 让你从输入中读一个字节,skip(longn) 让你在输入中跳过 n 个字节。

StoutSystem.out 作为 PrintStream 来实现 stdout,你可以使用 print() 和 println() 两个成员函数。这两个函数支持 Java 的任意基本类型作为参数。

StderrSystem.err 同 stdout 一样实现 stderr。象 System.out 一样,你可以访问 PrintStream 成员函数。

2 标准输入输出例子

这里有一个例子,功能象 Unix 里的 cat 或 type:

importjava.io.*classmyCat{publicvoidmain(Stringargs[])throwsIOException{intb;intcount=0;while((b=System.in.read())!=-1){count++;System.out.print((char)b);}System.out.println();//blanklineSystem.err.println( counted +count+ totalbytes.}}

3 普通输入输出类

除了基本的键盘输入和屏幕输出外,我们还需要联系文件的输入输出。我们将学习下面几个类:lFileInputStreamlDataInputStreamlFileOutputStreamlDataOutputStream

作为参考,再列出一?copy; 特定应用的类:lPipedInputStreamlBufferedInputStreamlPushBackInputStreamlStreamTokenizerlPipedOutputStreamlBufferedOutputStreamlRandomAccessFile

我们不在此讨论这?copy; 类,但你可以在 JAVA_HOME/src/java/io 目录里查看每个类的成员函数定义。

4 文件

在我们进行文件操作时,需要知道一?copy; 关于文件的信息。File 类提?copy; 了一?copy; 成员函数来操纵文件和获得一?copy; 文件的信息。

4.1 创建一个新的文件对象

你可用下面三个方法来创建一个新文件对象:

FilemyFile;myFile=newFile(etc/motd

myFile=newFile(/etc , motd //moreusefulifthedirectoryorfilenamearevariables

FilemyDir=newfile(/etc myFile=newFile(myDir, motd

这三种方法取决于你访问文件的方式。例如,如果你在应用程序里只用一个文件,第一种创建文件的结构是最容易的。但如果你在同一目录里打开数个文件,则第二种或第三种结构更好一?copy;。

4.2 文件测试和使用

一?copy; 你创建了一个文件对象,你便可以使用以下成员函数来获得文件相关信息:

文件名 lStringgetName()lStringgetPath()lStringgetAbslutePath()lStringgetParent()lbooleanrenameTo(FilenewName)

文件测试 lbooleanexists()lbooleancanWrite()lbooleancanRead()lbooleanisFile()lbooleanisDirectory()lbooleanisAbsolute()

一般文件信息 llonglastModified()llonglength()

目录用法 lbooleanmkdir()lString[]list()

4.3 文件信息获取例子程序

这里是一个独立的显示文件的基本信息的程序,文件通过命令行参数传输:

importjava.io.*;classfileInfo{FilefileToCheck;publicstaticvoidmain(Stringargs[])throwsIOException{if(args.length 0){for(inti=0;i args.length;i++){fileToCheck=newFile(args[i]);info(fileToCheck);}}else{System.out.println( Nofilegiven.}}publicvoidinfo(Filef)throwsIOException{System.out.println( Name: +f.getName());System.out.println(Path: =f.getPath());if(f.exists()){System.out.println( Fileexists. System.out.print((f.canRead()? andisReadable : ));System.out.print((f.cnaWrite()? andisWriteable : ));System.out.println(. System.out.println( Fileis +f.lenght()= bytes. }else{System.out.println( Filedoesnotexist.}}}

5 输入流

InputStreamSequenceInputStreamFileInputStreamPipedInputStreamByteArrayInputStreamFileterInputStreamStringBufferInputStream

DataInputStreamLineNumberInputStreamPushbackInputStreamBufferedInputStream 有好几个类是专门用来处理文件输入的。下面是文件输入类的层次结构:

5.1FileInputStream 对象

FileInputStream 典型地表示一种顺序访问的文本文件。通过使用 FileInputStream 你可以访问文件的一个字节、几个字节或整个文件。

5.2 打开 FileInputStream

为一个文件打开输入流 FileInputStream,你必须将文件名或文件对象传送给结构:

FileInputStreammyFileStream;myFileStream=newFileInputStream(/etc/motd

你还可以象下边这样从 FileInputStream 里读文件信息:

FilemyFile;FileInputSteammyFileStream;myFile=newFile(/etc/motd myFileStream=newFileInputStream(myFile);

一?copy;FileInputStream 输入流打开,你就可以从里面读取信息了。read() 成员函数有以下几种选项:

lintread()//readsonebyte//return-1atendofstreamlintread(byteb[])//fillsentirearray,ifpossible//returnsnumberofbytesread//returns-1ifendofstreamisreached

lintread(byteb[],intoffset,intlen)//readslenbytesintobstartingatb[offset]//Returnsnumberofbytesread,//or-1ifendofstreamisreached.

5.3 关闭 FileInputStream

当你完成一个文件的操作,你可选两种方法关闭它:显式关闭和隐式关闭,隐式关闭是自动垃圾回收时的功能。

显式关闭如下:myFileStream.close();

6 例程:显示一个文件

如果文件的访问权限足够,你可以在 TextArea 对象里显示文件内容。

下面是显示文件的程序片断:

FileInputStreamfis;TextAreata;publicvodinit(){byteb[]=newbyte[1024];intI;//makeitbigenoughorwaituntilyou//knowthesizeofthefileStrings;try{fis=newFileInputStream( /etc/motd}catch(FileNotFoundExceptione){/*dosomethingappropriate*/}try{I=fis.read(b);}catch(IOExceptione){/*dosomethingappropriate*/}s=newString(b,0);ta=newTextArea(s,5,40);add(ta);}

7DataInputStreams

DataInputStreams 与 FileInputStreams 差不多。Data 流可以直接读任意一种变量类型,如浮点数,整数和字符等。一般来说,对二进制文件使用 DataInputStream 流。

7.1 打开和关闭 DataInputStreams

打开和关闭 DataInputStreams 对象时,其方法与 FileInputStreams 相同:

DataInputStreamsmyDataStream;FileInputStreamsmyFileStream;

//getafilehandlemyFileStream=newFileInputStream(/usr/db/stock.dbf //open,or chain adatainputfilemyDataStream=newDataOutputStream(myFileStream);

//Nowwecanusebothinputstreamstoaccessourfile//j(Ifwewantto…)myFileStream.read(b);I=myDataStrea.readInt();

//closethedatafrielexplicityly//Alwaysclosethe topmost filestreammyDataStream.close();myFileStream.close();

7.2 读 DataInputStreams

当你从 DataInputStreams 流里访问文件时,你可以使用与 FileInputStream 流相同的成员函数 read()。但你也可以使用其他访问方法来读取不同种类的数据:

lbytereadByte()lintreadUnsignedByte()lshortreadShort()lintreadUnsighedShort()lcharreadChar()lintreadIntllongreadLong()lfloatreadFloat()ldoublereadDouble()lStringreadLine()

以上每一个成员函数都读取相应的数据对象。象 StringreadLine() 成员函数,你可使用 \n,\r,\r\n, 或 EOF 作为字符?reg; 结束符。

读一个长整型,例如:

longserialNo;…serialNo=myDataStream.readLong();

8URL 输入流

除了基本文件访问外,Java 还提?copy; 了通过网络使用 URL 访问对象的功能。在下面这个例子里,我们用 getDocumentBase() 成员函数并显式指定 URL 对象来访问声音和图象。

StringimageFile=newString(images/Duke/T1.gif images[0]=getImage(getDocumentBase(),imageFile();

如果我们愿意,可以直接使用 URL:URLimageSource;imageSource=newURL(https://cache.yisu.com/upload/information/20210522/355/675820.gif

我们可以为相应的 URL 打开输入流。例如,下面的程序里包括一个数据文件:InputStreamis;bytebuffer[]=newbyte[24];is=newURL(getDocumentBase(),dataname).openStream();

现在我们可以使用 is,就象使用 FileInputStream 对象一样:is.read(buffer.0,buffer.length);

注意:有?copy; 用户设置了他们的浏览器安全属性,可以不让你的程序访问他们的文件。

9OutputStreams

上面我们谈到了读数据,那么如何实现写数据呢?象输入流一样,输出流也有类似的层次结构:

OutputStream

FileOutputStreamPipedOutputStreamByteArrayOutputStreamFilterOutputStream

DataOutputStreamPrintStreamBufferedOutputStream

我们将分析 FileOutputStream 和 DataOutputStream 类来完成我们碰到的输出流问题。其它的输出流包含了更多的信息和成员函数。象输入流的源文件一样,这?copy; 文件在 $JAVA_HOME/src/java/io 目录下。

9.1FileOutputStream 类

FileOutputStream 对象用于向一个文本文件写数据。象输入文件一样,你得先打开这个文件后才能写这个文件。

9.2 打开一个 FileOutputStream 对象

要打开一个 FileOutputStream 对象,象打开一个输入流一样,你可以将字符?reg; 或文件对象作为参数:FileOutputStreammyFileStream;myFileStream=newFileOutputStream(/etc/motd

象输入流一样,你也可这样使用:FilemyFile;FileOutputStreammyFileStream;myFile=newFile(/etc/motd myFileStream=newFileOutputStream(myFile);

9.3 写入一个流

一?copy; 文件被打开,你便可以使用 write() 函数向文件里写一?copy; 数据。就象输入流的 read() 函数一样,你可有三种方法:lvoidwrite(intb);//writesoutonebytelvoidwrite(byteb[]);//writesoutentirearraylvoidwrite(byteb[],intoffset,intlength);//writeoutlengthbytesofb[],startingatb[offset]9.4 关闭一个 FileOutputStream 对象

关闭输出流和关闭输入流方法一样,你可以使用显式方法:myFileStream.close(); 你也可以让系统自动关闭它。

10 例子:存储信息

下面有一个程序,让用户输入一?copy; 姓名和电话号码。每一个姓名和号码将加在文件里。用户通过点“Done 按钮来告诉系统整个列表已输入完毕。

一?copy; 用户输入完整个列表,程序将创建一个输出文件并显示或打印出来。例如:

555-1212,Tom123-456-7890,PeggyL.234-5678,Marc234-5678,Ron876-4321,Beth Brian33.1.42.45.70,Jean-Marc

下面是程序的源代码:importjava.io.*;

//Phones.java//Asimpledatabasecreationprogram

classPhones{staticFileOutputStreamfos;publicstaticfinalintlineLength=81;publicstaticvoidmain(Stringargs[])throwsIOExciption{byte[]phone=newbyte[lineLength];byte[]name=newbyte[lineLenght];intI;fos=newFileOutputStream(phone.numbers while(true){System.err.println( Enteraname(enter done toquit) readLine(name);if(done .equalsIgnoreCase(newString(name,0,0,4))){break;}System.err.println(Enterthephonenumber readLine(phone);for(i=0;phone[i]!=0;i++){fos.write(phone[i]);}fos.write(, for(i=0;name[i]!=0;I++){fos.write(name[i]);}fos.write(\n}fos.close();}

privatestaticvoidreadLine(byteline[])throwsIOException{inti=0,b=0;

while((i lineLengh-1)) ((b=System.ini.read())!= \n )){line[i++]=(byte)b;}line[i]=(byte)0;}}

11BufferedOutput 流

如果你处理的数据量很多,或向文件写很多次小数据,你可以使用一个 BufferedOutput 流。BufferedOutput 流提?copy; 和 FileOutputStream 类同样的写操作方法,但所有输出全部存放在一个缓冲区里。当你填满缓冲区,它将一次性写入磁盘。或者你主动将缓冲区写入磁盘。

11.1 创建 BufferedOutput 流

如果要创建一个 BufferedOutput 流,首先需要一个 FileOutput 流。然后将缓冲区链接到 FileOutput 流:FileOutputStreammyFileStream;BufferedOutputStreammyBufferStream;//getafilehandlemyFileStream=newFileOutputStream(/usr/db/stock.dbf //chainabufferedoutputstreammyBufferSSstream=newBufferedOutputStream(myFileStream);

11.2 更新和关闭 BufferedOutput 流

和普通 FileOutput 流一样,向 BufferedOutput 流里的每一次写操作和写入磁盘操作并不是一一对应的。要想在程序结束?reg; 前将缓冲区里的数据写入磁盘,除非填满缓冲区,否则只有显式调用 flush() 函数://forceleft-overdatatodiskmyBufferStream.flush();//closethedatafileexplicitly//Alwaysclosethe topmost filestreammyBufferStream.close();myFileStream.close();

12DataOutput 流

和 DataInputStream 对应,Java 还提?copy; 了 DataOutput 流。使用 DataOutput 流,我们可以向文件写入二进制数据。

12.1 打开和关闭 DataOutput 流对象

打开和关闭 DataOutput 流对象与打开、关闭 FileOutput 流对象方法一样:DataOutputStreammyDataStream;FileOutputStreammyFileStream;BufferedOutputStreammyBufferStream;

//getafilehandlemhyFileStream=newFileOutputStream(/usr/db/stock.dbf //chainabufferedoutputstream(forefficiency);myBufferStream=newBufferedOutputStream(myFileStream);//chainadataoutputfilemyDataStream=newDataOutputStream(myBufferStream);

//Nowwecanusebothinputstreamstoaccessourfile//(iiIfwewantto…)myBufferStream.write(b);myDataStream.writeInt(i);

//closethedatafileexplicitly//Alwayscolsethe topmost filestreammyDataStream.close();myBuffersStream.close();myFileStream.close();

12.2 向 DataOutput 流写数据

FileOutput 流里的 write() 函数各种方法都适用于 DataOutput 流。你还可以看到 DataInput 流的类似函数方法:lvoidwriteBoolean(booleanv)lvoidwriteByte(intv)lvoidwriteShort(intv)lvoidwriteChar(intv)lvoidwriteInt(intv)lvoidwriteFloat(floatv)lvoidwriteDouble(doublev)lvoidwriteBytes(strings)lvoidwriteChars(strings)

对字符?reg; 来说,有两种选择:byte 和 char。记住 byte 是 8 位数据而 char 是 16 位数据。如果你想利用 Unicode 字符的优点,你应使用 writeChars() 函数。

12.3 输出记数

在使用二进制数据输出时常用的另外一个函数是 size()。这个函数返回写入文件数据的总字节数。你也可用 size() 函数将数据文件分成四字节为单位的块,例如:…intbytesLeft=myDataStream.size()%4;for(intI=0;I bytesLeft;I++){myDataStrea.write(0);}…

13 随机访问文件

我们读文件常常不是从头至尾顺序读的。你也许想将一文本文件当作一个数据库,读完一个记录后,跳到另一个记录,它们在文件的不同地方。Java 提?copy; 了 RandomAccessFile 类让你操作这种类型的输入输出。

13.1 创建随机访问文件

打开随机访问文件有两种方法:l 用文件名 myRAFile=newRandomAccessFile(Stringname,Stringmode);l 用文件对象 myRAFile=newRandomAccessFile(Filefile,Stringmode);

mode 参数决定了访问文件的权限,如只读 r 或读写 wr 等。

例如,我们打开一个数据库更新数据:RandomAccessFilemyRAFile;myRAFile=newRandomAccessFile(/usr/db/stock.dbf , rw

13.2 访问信息

RandomAccessFile 对象的读写操作和 DataInput/DataOutput 对象的操作方式一样。你可以使用在 DataInputStream 和 DataOutputStream 里出现的所有 read() 和 write() 函数。

还有几个函数帮助你在文件里移动指针:llonggetFilePointer(); 返回当前指针 lvoidseek(longpos); 将文件指针定位到一个绝对地址。地址是相对于文件头的偏移量。地址 0 表示文件的开头。llonglength(); 返回文件的长度。地址 length() 表示文件的结尾。

13.3 增加信息

你可以使用随机访问文件来设置成增加信息模式:myRAFile=newRandomAccessFile(/tmp/java.log , rw myRAFile.seek(myRAFile.length());//Anysubsequentwrite()swillbeappendedtothefile

9.13.4 追加信息例子下面是一个在已存在文件后面追加字符?reg; 的例子:importjava.io.IOException;importjava.io.RandomAccessFile;

classraTest{publicstaticvoidmain(Stringargs[])throwsIOException{RandomAccessFilemyFAFile;Strings= InformationtoAppend\nHimom!\n //openourrandomaccessfilemyRAFile=newRandomAccessFile( /tmp/java.log , rw //movetotheendofthefilemyRAFile.seek(myRAFile.length());//Startappending!myRAFile.writeBytes(s);

myRAFile.close();}}

1.Java 通过系统类达到访问标准输入输出的功能。2. 你可以创建、读、写文件。

关于 Java 输入输出流的示例分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注丸趣 TV 行业资讯频道了解更多相关知识。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计10907字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)