第3章-Java在文件中的应用ppt课件(全)_第1页
第3章-Java在文件中的应用ppt课件(全)_第2页
第3章-Java在文件中的应用ppt课件(全)_第3页
第3章-Java在文件中的应用ppt课件(全)_第4页
第3章-Java在文件中的应用ppt课件(全)_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章

Java在文件中的应用13.1流式输入输出与文件处理3.2文件概念解读3.3File类3.4事务处理程序3.5文件相关类

23.1流式输入输出与文件处理与外部设备和其他计算机进行交流的输入输出操作,尤其是对磁盘的文件操作,是计算机程序重要而必备的功能,任何计算机语言都必须对输入输出提供支持。Java语言也不例外,它的输入输出类库中包含了丰富的系统工具——已定义好的用于不同情况的输入输出类。利用它们,Java程序可以很方便地实现多种输入输出操作和复杂的文件与目录管理。33.1.1Java输入输出类库Java的输入输出功能必须借助于输入输出类库Java.io包来实现,这个包中的类大部分是用来完成流式输入输出的流类。下面介绍一下流的概念:1.流的概念在Java里,信息可以使用一套叫做“流”的通信系统来存储和获取,该系统是在包Java.io中实现的。事实上,流(stream)就是指在计算机的输入与输出之间运动的数据序列。它是一种功能强大的数据处理机制,就像共享着同一个名字的水流一样,可以将某些内容从一个地方带到另一个地方。一个流是程序中数据所途径的一条路径,那么输入流(inputstream)就是将数据从某个外设(源端)发送到程序中,而一个输出流(outputstream)是将数据从程序中向外发送到某个外设(目的端)。字节流(bytestream):主要是用来处理字节、整数和其他简单的数据类型。字符流(characterstream):是一个特殊类型的字节流,但是不同于字节流,主要是用来处理文本文件和其他文件数据源。过滤流(Filteredstream):是使用FilterInputStream或FilterOutputStream的子类之一创建的,是对现有流所传递的信息进行修改的流。缓冲区(buffer):是一片存储区域,数据在需要由程序读取或写入之前都可以存放在那里。通过使用缓冲区,可以不用总是回溯到最初的数据源那里去获取数据。缓冲流(bufferstream):带缓冲的字节流用到了BufferedInputStream和BufferedOutputStream。4文件的处理与随机访问1.java程序的文件与目录管理任何计算机程序运行时,它的指令和数据都保存在系统的内存中,由于每次计算机关机时保存在内存中的所有信息都会丢失,所以程序要想永久保存运算处理所得的结果,就必须把这些结果保存在磁盘文件中,文件是数据赖以保存的永久性机制,文件操作是计算机程序必备的功能。目录是管理文件的特殊机制,同类文件包括在同一个目录下可以简化文件管理,提高工作效率。Java语言不但支持文件管理,还支持其他语言。例如C语言所不支持的目录管理,但在java语言中,它们都是由专门的类File来实现。File类也在java.io包中,但它不是InputStream或者OutputStream的子类,因为它不负责数据的输入输出,而专门用来管理磁盘文件和目录。每个File类的对象表示一个磁盘文件或目录,其对象属性中包含了文件或目录的相关信息,如名称、长度、所含文件个数等,调用它的方法则可以完成对文件或目录的常用管理操作,如创建、删除等。

5//TestFileDialog.java1:importjava.io.*;2:importjava.awt.*;3:import.*;4:publicclassTestFileDialog{5:publicstaticvoidmain(Stringargs[]){6:newFileFrame();}}7:classFileFrameextendsFrameimplementsActionListener{8:TextAreata;9:Buttonopen,quit;10:FileDialogfd;11:FileFrame(){12:super(“获取并显示文本文件”);13:ta=newTextArea(10,45);14:open=newButton(“打开”);15:quit=newButton(“关闭”);16:open.addActionListener(this);17:quit.addActionListener(this);18:setLayout(newFlowLayout());19:add(ta);620:add(open);21:add(quit);22:setSize(350,280);23:show();}24:publicvoidactionPerformed(ActionEvente){25:if(e.getActionCommand()==”打开”)26:{27:fd=newFileDialog(this,”打开文件”,FileDialog.LOAD);28:fd.setDirectory(“c:\\temp”);//设置文件对话框的基础目录29:fd.show();//弹出并显示文件对话框,程序暂停直至用户选定一文件30:try{31:Filemyfile=newFile(fd.getDirectory(),fd.getFile());32:RandomAccessFileraf=newRandomAccessFile(myfile,”r”);33:while(raf.getFilePointer()<raf.length())34:{ta.append(raf.readLine()+”\n”);}35:}36:catch(IOExceptionioe){37:System.err.println(ioe.toString());}38:}39:if(e.getActionCommand()==”关闭”)40:{41:dispose();42:System.exit(0);43:}44:}45:}78保存在变量或数组中的数据是临时性的。例如,当局部变量溢出或者程序运行终止时,数据便丢失了。但是,即使产生数据的程序运行结束了,用于保存数据的文件(file)依然长期存在。文件中所包含的数据一般称为永久性数据(persistentdata)。计算机一般将数据保存在辅助设备(secondarystoragedevice)中,例如磁盘、光盘和磁带等。文件处理是任何一种语言所必需的一项重要功能,只有具备这一功能才可支持具有处理大量永久数据能力的应用程序开发。3.2文件概念解读9计算机处理的所有的数据项最终都要被分解为0和1的组合。这是由于制造能够表示两种状态的电子设备比较简单而且易于实现,这两种状态分别代表0和1。由于计算机完成的一切杰出功能都是基于对0和1的操作。这样的一个数据项成为位(bit),8位组成一个字节,多个字节组成字段,计算机处理的记录由多个字段构成。例如在一个工资管理系统中,某一职工的记录可能是由以下字段组成:职工号、姓名、性别、住址、月工资等。数据层次结构10文件和流Java把每个文件作为顺序字节流,且每个文件均以一个文件结束标记(EOF),或者以记录在系统管理数据结构中的一个特殊的字节编号结束。当用户打开一个文件,系统便创建一个对象,并且建立对象与流间的关联。当用户开始运行Java应用程序或applet时,会自动建立3个对象:System.in、System.out和System.err。与这些对象相联系的流可以为程序提供与指定外设或设备间的通信通道。例如,System.in对象(标准输入流对象)使程序能够读取来自键盘的输入,System.out对象(标准输出流对象)使程序能够向屏幕输出数据,而System.err对象(标准错误流对象)则使程序能够在屏幕上显示出错信息。11创建顺序存取文件Java没有对文件结构作出规定,因此,Java文件中也就不存在“记录”的概念。这样一来,程序员就必须将文件结构化以适应应用程序的要求。在下面的例子中将演示如何对文件中实现简单的记录结构化。首先给出例程,然后再对它详细说明。下例的程序建立了一个顺序存取的文件,这一个文件可以用于欠款系统中以协助管理公司客户的欠款。对于每个客户,程序都有一个帐号、客户名、客户姓以及客户的欠款余额。每个客户的数据信息构成一个记录。本程序中用帐号作为记录的关键字,即文件将按照帐号的顺序建立和维护。程序假设客户按帐号顺序输入记录。在一个复杂的欠款系统中应提供排序功能,这样用户可以用任何顺序输入数据,然后程序对记录进行排序并写入文件。12从顺序存取文件读取数据数据保存在文件中,这样当需要它们时再将其读出来。上一节介绍了如何建立一个顺序存取文件,本节来介绍如何将数据从文件中顺序读出。//ReadSequentialFile.java1:importjava.io.*;2:importjava.awt.*;3:import.*;4:importjavax.swing.*;5:importjava_file.*;6:publicclassReadSequentialFileextendsJFrame{7:privateObjectInputStreaminput;8:privateBankUIuserInterface;9:privateJButtonnextRecord,open;//初始化窗体10:publicReadSequentialFile()11:{12:super(“ReadingaSequentialFileofObjects”);13:getContentPane().setLayout(newBorderLayout());14:userInterface=newBankUI();15:nextRecord=userInterface.getDoTask();16:nextRecord.setText(“NextRecord”);17:nextRecord.setEnabled(false);1318:nextRecord.addActionListener(newActionListener(){19:publicvoidactionPerformed(ActionEvente)20:{21:readRecord();22:}23:}24:);25:addWindowListener(newWindowAdapter(){26:publicvoidwindowClosing(WindowEvente){27:if(input!=null)28:closeFile();29:System.exit(0);30:}31:}32:);1433:open=userInterface.getDoTask2();34:open.setText(“OpenFile”);35:open.addActionListener(newActionListener()36:{37:publicvoidactionPerformed(ActionEvente)38:{39:openFile();40:}41:}42:);43:getContentPane().add(userInterface,BorderLayout.CENTER);44:pack();45:setSize(300,200);46:show();47:}48:privatevoidopenFile()49:{50:JFileChooserfileChooser=newJFileChooser();51:fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);1552:intresult=fileChooser.showOpenDialog(this);//用户单击对话框取消按钮53:if(result==JFileChooser.CANCEL_OPTION)54:return;55:Filefilename=fileChooser.getSelectedFile();56:if(filename==null||filename.getName().equals(“”))57:JOptionPane.showMessageDialog(this,”InvalidFileName”,58:”InvalidFileName”,JOptionPane.ERROR_MESSAGE);59:else60:{//打开文件61:try{62:input=newObjectInputStream(newFileInputStream(filename));63:open.setEnabled(false);64:nextRecord.setEnabled(true);65:}66:catch(IOExceptione){67:JOptionPane.showMessageDialog(this,”ErrorOpeningFile”,“Error”,JOptionPane.ERROR_MESSAGE);}68:}69:}16//初始化窗体结束70:publicvoidreadRecord()71:{72:BankAccountRecordrecord;//从文件中输入值73:try74:{75:record=(BankAccountRecord)input.readObject();76:Stringvalues[]={String.valuesOf(record.getAccount()),record.getFirstName(),record.getLastName(),String.valueOf(record.getBalance())77:};78:userInterface.setFieldValues(values);79:}80:catch(EOFExceptioneofex)81:{82:nextRecord.setEnabled(false);83:JOptionPane.showMessageDialog(this,”Nomorerecordsinfile”,“EndofFile”,JOptionPane.ERROR_MESSAGE);84:}85:catch(ClassNotFoundExceptioncnfex){86:JOptionPane.showMessageDialog(this,”Unabletocreateobject”,“ClassNotFound”,JoptionPane.ERROR_MESSAGE);1787:}88:catch(IOExceptionioex){89:JOptionPane.showMessageDialog(this,”Errorduringreadfromfile”,“ReadError”,JOptionPane.ERROR_MESSAGE);90:}91:}92:privatevoidcloseFile()93:{try{94:input.close();95:System.exit(0);}96:catch(IOExceptione){97:JOptionPane.showMessageDialog(this,”Errorclosingfile”,”Error”,JOptionPane.ERROR_MESSAGE);98:System.exit(1);}99:}100:publicstaticvoidmain(Stringargs[])101:{102:newReadSequentialFile();103:}104:}

183.2.5随机存取文件顺序存取文件对于“即时存取”程序来说并不合适,例如银行系统,每个银行都可能有成千上万个用户的帐户,当用户使用自动取款机(ATM)时,系统必须在几秒内作出回答。需要快速存取就要使用随机存取文件(random-accessfile)。程序无需检索所有记录,可以直接且迅速地存取随机存取文件中的独立记录。随机存取文件有时也称为直接存取文件(direct-accessfile)。因为Java语言本身对文件没有结构要求,所有需要使用随机存取的程序必须自己建立它们。创建随机存取文件的方法有很多。其中最简单的一种可能是文件中的所有记录均保持相等的固定长度。利用固定记录长度的方法使程序很容易就能计算出任何一条记录距离文件头的距离。随机存取文件像一列有许多车厢的火车,有的车厢是空的而有的车厢有货物。数据可以被插入到一个随机存取的文件中而不影响里面的其他数据,以前保存在文件中的数据也可以方便地修改或删除。193.2.6向随机存取文件随机写入数据下面的程序以rw模式打开的文件中写入数据。其中使用了RandomAccessFile类的seek方法确定文件中保存记录信息的确切位置。seek方法将文件定位指针设置到相对于文件头的指定位置上,并用Record类的write方法输出数据。在该程序中假设用户不输入重复帐号并且在JTextField中输入适当的数据类型。20//WriteRandomFile.java1:importjava_file.*;2:importjavax.swing.*;3:importjava.io.*;4:import.*;5:importjava.awt.*;6:publicclassWriteRandomFileextendsJFrame{7:privateRandomAccessFileoutput;8:privateBankUIuserInterface;9:privateJButtonenter,open;//初始化窗口10:publicWriteRandomFile()11:{12:super(“Writetorandomaccessfile”);13:userInterface=newBankUI();14:enter=userInterface.getDoTask();15:enter.setText(“Enter”);16:enter.setEnabled(false);17:enter.addActionListener(newActionListener(){18:publicvoidactionPerformed(ActionEvente)2119:{20:addRecord();21:}22:}23:);24:addWindowListener(newWindowAdapter(){25:publicvoidwindowClosing(WindowEvente)26:{27:if(output!=null){28:addRecord();29:closeFile();30:}31:else32:System.exit(0);33:}34:}35:);2236:open=userInterface.getDoTask2();37:open.setText(“SaveAs”);38:open.addActionListener(newActionListener(){39:publicvoidactionPerformed(ActionEvente)40:{//打开文件41:openFile();42:}43:}44:);45:getContentPane().add(userInterface,BorderLayout.CENTER);46:setSize(300,150);47:show();48:}49:privatevoidopenFile()50:{51:JFileChooserfileChooser=newJFileChooser();2352:fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);53:intresult=fileChooser.showSaveDialog(this);54:if(result==JFileChooser.CANCEL_OPTION)55:return;56:Filefilename=fileChooser.getSelectedFile();57:if(filename==null||filename.getName().equals(“”))58:JOptionPane.showMessageDialog(this,”InvalidFileName”,“InvalidFileName”,JOptionPane.ERROR_MESSAGE);59:else{//打开文件60:try{61:output=newRandomAccessFile(filename,”rw”);62:enter.setEnabled(true);63:open.setEnabled(false);64:}65:catch(IOExceptione){66:JOptionPane.showMessageDialog(this,”Filedoesnotexist”,“InvalidFileName”,JOptionPane.ERROR_MESSGAGE);67:}68:}69:}2470:privatevoidcloseFile()71:{72:try{73:output.close();74:System.exit(0);75:}76:catch(IOExcetptionex)77:{78:JOptionPane.showMessageDialog(this,”Errorclosingfile”,”Error”,JOptionPane.ERROR_MESSAGE);79:System.exit(1);80:}81:}82:publicvoidaddRecord()83:{84:intaccountNumber=0;85:Stringfields[]=userInterface.getFieldValues();86:Recordrecord=newRecord();87:if(!fields[BankUI.ACCOUNT].equals(“”)){//输出文件的值88:try{89:accountNumber=Integer.parseInt(fields[BankUI.ACCOUNT]);2590:if(accountNumber>0&&accountNumber<=100){91:record.setAccount(accountNumber);92:record.setFirstName(fields[BankUI.FIRST]);93:record.setLastName(fields[BankUI.LAST]);94:record.setBalance(Double.parseDouble(fields[BankUI.BALANCE]));95:output.seek((accountNumber-1)*Record.size());96:record.write(output)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论