java教程8 文件操作.ppt_第1页
java教程8 文件操作.ppt_第2页
java教程8 文件操作.ppt_第3页
java教程8 文件操作.ppt_第4页
java教程8 文件操作.ppt_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

1、第8章,文件操作,Sunny Liu weiliu_,本课教学内容,Java中的流 抽象流 流类 Readers和Writers 文件的输入和输出,问题陈述,应用场景 为员工登录系统创建一个登录程序。该程序的功能说明如下: 接收用户名和密码 用户情况(如用户名、密码、登录日期和登录时间)应该被记入日志文件,流的概念,流是程序和外界进行数据交换的通道。 流是有序的数据序列,它有源(输入流)和目的(输出流)。 两种基本的流是:输入流(InputStream)和输出流(OutputStream)。程序通过输入流从数据源读取数据,通过输出流向目的地写数据。 java.io包使用术语流定义I/O(输入和

2、输出)。该包有两个主要的部分:字符流(Character stream)和字节流(Byte stream)。,流的分类,字节流被称为输入流或输出流,而字符流被称为Reader或Writer。 节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。 过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。,流的分类,抽象流,输入流 InputStream 输出流 OutputStream,输入流InputStream,InputStream类是所有输入流的父类,它是一个抽象类,不能被实例化。它提供了一系列和读取数据有关的方法。 InputStream类最重要的方

3、法是读取数据的read()方法。 read()方法的功能是逐字逐句地以二进制的原始方式读数据。,输入流InputStream,有三个基本的读方法: abstract int read():读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。 int read(byte b):将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。 int read(byte b, int off, int len):将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定

4、读取的最大字节数。,输入流InputStream,其它方法 long skip(long n):在输入流中跳过n个字节,并返回实际跳过的字节数。 int available():返回在不发生阻塞的情况下,可读取的字节数。 void close():关闭输入流,释放和这个流相关的系统资源。 void mark(int readlimit):在输入流的当前位置放置一个标记,如果读取的字节数多于readlimit设置的值,则流忽略这个标记。 void reset():将位置指针返回到标记的位置。 boolean markSupported():判断流是否支持标记和复位操作。,java.io包中Inp

5、utStream的类层次,基本的输入流类,输出流OutputStream,OutputStream类是所有输出流的父类,它是一个抽象类,不能被实例化。它提供了一系列和写数据有关的方法。 OutputStream类最重要的方法是写入数据的write()方法。 write()方法的功能是将字节写入流中。,输出流OutputStream,三个基本的写方法 void write(int b) :往输出流中写入一个字节。向输出流写数据。 void write(byte b):往输出流中写入数组b中的所有字节。 void write(byte b,int off,int len):往输出流中写入数组b中从

6、偏移量off开始的len个字节的数据。,输出流OutputStream,其它方法 void close():当完成写操作后,应该关闭输出流。 void flush():OutputStream类本身的flush()方法不执行任何操作,它的一些带有缓冲区的子类(比如BufferedOutputStream和PrintStream类)覆盖了flush()方法。通过带缓冲区的输出流写数据时,数据先保存在缓冲区中,积累到一定程度才会真正写到输出流中。缓冲区通常用字节数组实现,实际上是指一块内存空间。flush()方法强制把缓冲区内的数据写到输出流中。,java.io包中OutputStream的类层次

7、,流类,FileInputStream和FileOutputStream BufferedInputStream和BufferedOutputStream DataInputStream和DataOutputStream PipedInputStream和PipedOutputStream ByteArrayInputStream和ByteArrayOutputStream,FileInputStream和FileOutputStream类,这些流被分类为node(节点)流,是因为它们从磁盘文件读和写数据。 FileInputStream类允许你以流的形式从文件读输入;FileOutputSt

8、ream类允许你把输出写进流文件。 例子 FileInputStream inputFile = new FileInputStream(“Empolyee.dat”); FileOutputStream outputFile = new FileOutputStream(“bonus.dat”);,BufferedInputStream和BufferedOutputStream类,BufferedInputStream类为输入流创建和维持缓冲,它用于增加输入操作的有效性。缓冲过程由从流里一字节一字节地读出数据来完成。 BufferedOutputStream类为输出流创建和维持缓冲。 两者都

9、表示filter(过滤器)流。,过滤输入流:FilterInputStream,FilterInputStream是一种用于扩展输入流功能的装饰器,它有好几个子类,分别用来扩展输入流的某一种功能。,DataInputStream和DataOutputStream类,DataInputStream和DataOutputStream类创建的对象被称为数据输入流和数据输出流。 它们不同于前面介绍的所有流,它是一种较为高级的数据输入输出方式。 它们允许程序按照与机器无关的风格读取Java的原始数据类型。,DataInputStream和DataOutputStream类,DataInputStream

10、类 将创建的数据输入流指向一个由参数in指定的输入流,以便从中读取数据(与机器无关的风格读取),如: FileInputStream fis = new FileInputStream(“datafile.txt”); DataInputStream in_data = new DataInputStream(fis); DataOutputStream类 将创建的数据输出流指向一个由参数out指定的输出流,然后通过这个数据输出流把Java数据类型的数据写到输出流out。 FileOutputStream fos = new FileOutputStream(“datafile.txt”);

11、DataOutputStream out_data = new DataOutputStream(fos);,示例,FileOutputStream out1=new FileOutputStream(D:test.txt); BufferedOutputStream out2=new BufferedOutputStream(out1); /装饰文件输出流 DataOutputStream out=new DataOutputStream(out2); /装饰带缓冲输出流 out.writeByte(-12); out.writeLong(12); out.writeChar(1); out

12、.writeUTF(好); out.close(); InputStream in1=new FileInputStream(D:test.txt); BufferedInputStream in2=new BufferedInputStream(in1); /装饰文件输入流 DataInputStream in=new DataInputStream(in2); /装饰缓冲输入流 System.out.print(in.readByte()+ ); System.out.print(in.readLong()+ ); System.out.print(in.readChar()+ ); Sy

13、stem.out.print(in.readUTF()+ ); in.close();,PipedInputStream和PipedOutputStream类,管道流用于在线程之间传输数据。在线程里的PipedInputStream对象从出现在另一个线程里的PipedOutputStream对象接收输入。这些类在创建管道时一起使用。 通过给PipedInputStream对象引用输出管道,你能把输入(inPipe)和输出(outPipe)连接到流里。,outPipe写进管道,inPipe从管道读出,Readers和Writers,简介 输入和输出流的子类以字节的形式读和写数据。Reader和W

14、riter类是抽象类支持Unicode字符流的读和写。 Unicode用于每个字符由16位表示的数据。字节流以八位数据为单位工作。,Readers和Writers,子类和方法 Reader和Writer类的最重要的子类是InputStreamReader和OutputStreamWriter。 Reader类支持InputStream类方法如:read(), skip(), mark(), markSupported(), reset() 和close()。 Writer类支持OutputStream类方法如:write(), flush()和close(),Reader类分层结构,Reade

15、r,BufferedReader,CharArrayReader,InputStreamReader,StringReader,PipedReader,FilterReader,Writer类分层结构,Writers,BufferedWriter,CharArrayReader,FilterWriter,StringWriter,PipedWrier,PrintWriter,OutputStreamWriter,从键盘读,InputStreamReader和OutputStreamWriter类 InputStreamReader和OutputStreamWriter类用于在字节和Unicod

16、e字符流之间转换数据。 InputStreamReader类转换InputStream子类对象为Unicode字符流。 OutputStreamWriter流转换Unicode字符输出流为字节输出流,从键盘读,例子,import java.io.*; public class NumberInput public static void main(String args) try InputStreamReader ir; BufferedReader in; ir=new InputStreamReader(System.in); /从键盘接收了一个字符串的输入,并创建了一个字符 输入流的对

17、象 in=new BufferedReader(ir); String s=in.readLine();,从键盘读,例子,/从输入流in中读入一行,并将读取的值赋值给字符串变量s System.out.println(Input value is: +s); int i = Integer.parseInt(s);/转换成int型 i*=2; System.out.println(Input value changed after doubled: +i); catch(IOException e) System.out.println(e); ,文件的输入和输出,简介 Java支持在文件上的

18、基于流的输入和输出操作。 它提供类,如:File, FileDescriptor, FileInputStream和FileOutputStream等。 File类能访问文件和目录对象并提供操纵他们的方法 . FileDescriptor类帮助主机系统跟踪正在访问的文件. FileInputStream和FileOutputStream类提供读和写文件流的职能 . 用RandomAccessFile类能随机访问文件 . FileReader和FileWriter类支持基于Unicode的文件I/O,文件的输入和输出,File类 File类用于访问文件和目录对象。它使用主机操作系统的文件名约定。

19、 File类的方法允许你删除和重命名文件。这些方法检查文件的读和写许可。 你能用File类的目录方法创建,删除,重命名和说明路径 要创建新的File类对象,你能用下列任何三种构造函数: File(String pathname) File(String parent,String child) File(File parent,String child),FileInputStream,FileInputStream是InputStream类的直接子类。该类提供三个构造函数: FileInputStream(File file) FileInputStream(String name) Fil

20、eInputStream(FileDescriptor fdObj) 从文件中读入数据有两种方式 直接利用FileInputStream类提供的read()方法来完成读入操作。 以FileInputStream类对象为原始数据源,再加上其他功能强大的输入流如DataInputStream流完成文件的读入操作。,FileInputStream,import java.io.*; class FileReaderSample public static void main(String agrs)throws IOException FileInputStream in=new FileInput

21、Stream(“C:in.txt); int data; while(data=in.read()!=-1) System.out.print(data + ); in.close(); ,FileOutputStream,FileOutputStream向文件写数据,它有以下构造方法: FileOutputStream(File file) FileOutputStream(String name) FileOutputStream(FileDescriptor fdObj) FileOutputStream(String name, boolean append) 在创建FileOutpu

22、tStream实例时,如果相应的文件并不存在,会自动创建一个空的文件。如果参数file或name表示的文件路径尽管存在,但是代表一个文件目录,那么会抛出FileNotFoundException异常。 默认情况下,FileOutputStream向文件写数据时,将覆盖文件中原有的内容。以上第四个构造方法提供了一个布尔类型的参数append,如果append参数为true,将在文件末尾添加数据。,FileOutputStream,import java.io.*; public class FileWriterSample public static void main(String args)

23、 try FileOutputStream fileOut = new FileOutputStream(C:out.txt); fileOut.write(你好.getBytes(); fileOut.close(); catch(FileNotFoundException e) catch(IOException e) ,从文件读和写,FileInputStream类 和FileOutputStream 类 FileInputStream类允许你以流的形式读文件。你能用文件名串或File对象作为参数创建类对象。 FileOutputStream方法补充FileInputStream的方法。

24、FileOutputStream方法把输出写进文件流。,从文件读和写,例子 下列例子显示在文件里的读和写操作。在该程序中,来自控制台的输入写进称为IOText.txt文件。程序为正确显示文件的内容然后删除该文件。,从文件读和写,import java.lang.*; import java.io.*; public class IOTest public static void main (String args ) throws IOException FileOutputStream fOutputStream = new FileOutputStream(“C:IOTest.txt”);

25、 InputStreamReader inputStream = new InputStreamReader(System.in); BufferedReader bufferStream = new BufferedReader(inputStream); String ioString; System.out.print(“n Please enter something: “); System.out.flush(); ioString = bufferStream.readLine(); for( int i=0; i ioString.length();i+) fOutputStre

26、am.write( ioString.charAt(i) ); fOutputStream.close(); FileInputStream fInputStream = new FileInputStream(“ c:IOTest.txt “); int numberOfBytes = fInputStream.available();,System.out.println(“No. of bytes present: “+numberOfBytes); Byte inBuff = new bytenumberOfBytes; int readByte = fInputStream.read

27、(inBuff,0,numberOfBytes); System.out.println(“No. of bytes read: “ +readByte); System.out.println(“n They are: “+new String(inBuff); fInputStream.close(); System.out.println(“n Deleting”); File testFile = new File(“c:IOTest.txt”); testFile.delete(); ,随机存取文件,定义 术语随机存取意味着数据能在文件内的任意位置读或写。 RandomAccessF

28、ile类为执行I/O用原始数据类型实现DataInput和DataOutput接口。RandomAccessFile类也支持读和写的许可,并且允许文件以只读和读写方式访问。,随机存取文件,创建随机存取文件 有两种方法创建随机存取文件用路径名作为串或用File类对象。 RandomAccessFile (String pathname, String mode) RandomAccessFile( File name, String mode) 例如: RandomAccessFile randomFile = new RandomAccessFile(“iotest.txt” , “rw”);

29、 File file1 = new File(“iotest.txt”); RandomAccessFile randomFile = new RandomAccessFile(file1 , “rw”);,随机存取文件,RandomAccessFile类的方法: void seek(long pos) long getFilePointer() long length(),序列化,定义 为使文件对象持久,你必须实行重要的一步:存储文件。存储文件对象被称为序列化。序列化是实现持久性的关键。它能够让你把对象写进流并能在以后读出来。 序列化的实现 JDK1.2提供java.io包的Serializ

30、able接口支持对象的序列化。 ObjectInputStream类的readObject()方法用于从流读对象。被读对象应该符合适当的类名。 ObjectOutputStream类的writeObject()方法把对象写进流,序列化,把对象写进文件的例子,FileOutputStream file = new FileOutputStream(“c:String.dat”); ObjectOutputStream objout = new ObjectOutputStream(file); objout.writeObject(testStr); file.close();,序列化,读对象的

31、例子,FileInputStream file = new FileInputStream(“c:String.dat”); ObjectInputStream objInput = new ObjectInputStream(file); testStr = (String) objInput.readObject(); file.close();,实例分析,任务单,实例分析,步骤1:确定需要记录的用户信息 User + +:+password + + Logged in: + +: + Date: 步骤2:确定记录用户信息所需要的技术 使用流写入日志文件 步骤3:确定表示时间的类 Date

32、 Calendar GregorianCalendar,实例分析,步骤4:确定用于写文件的类和变量名 类:RandomAccessFile 变量:logFile 步骤5:确定日志文件名 userlog.txt 步骤6:确定提供给日志文件的权限 读和写,实例分析,步骤7:确定接收用户登录信息的组件及其变量 步骤8:确定存储日志文件输入的变量 entry,实例分析,步骤9:确定表示时间的变量名 步骤10:确定何时在日志文件中建立一个输入项 当点击OK按钮时,在userlog.txt文件中建立一个用户信息的输入项,实例分析,步骤11:确定要处理的异常 输入输出异常IOException 步骤12:确

33、定异常的出错信息 “不能写入日志文件”,后跟异常对象,步骤13:编写代码记录用户的输入,实例分析,public class LoginIO extends JFrame implements ActionListener JPanel panel; JLabel labelName; JLabel labelPass; JTextField textName; JPasswordField textPass; JButton butLogin, butCancel; GridLayout gl; Date date; GregorianCalendar gCal; public LoginIO() gl = new GridLayout(2, 3); panel = new JPanel(); getContentPane().add(panel); panel.setLayout(gl); labelName = new JLabel(用户名); labelPass = new JLabel(密码); textName = new JTextField(20); textPass = new JPasswordField(20);,butLogin = new JButton(登录); butCancel = new JButto

温馨提示

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

评论

0/150

提交评论