第8章文件和输入输出流_第1页
第8章文件和输入输出流_第2页
第8章文件和输入输出流_第3页
第8章文件和输入输出流_第4页
第8章文件和输入输出流_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

第8章

文件和输入输出流本章主要内容:8.1输入/输出流8.1.1流的概念8.1.2

io类库8.2文件处理8.2.1文件与目录管理8.2.2文件流8.3随机存取文件和本地可执行文件8.3.1随机存取文件流8.3.2本地可执行文件8.4数据流与对象流8.4.1数据流8.4.2对象流8.5Java多媒体技术8.5.1应用输入流播放音频文件8.5.2

Java多媒体包JMF的应用文件程序终端文件程序网络端点数据流起点终点

网络端点文件,字符串存储区8.1输入/输出流什么是数据流?8.1.1流的概念什么是流?流是计算机各部件之间的数据流动,按传输方向可分为输入流和输出流。按内容可分为字节流和字符流。输入流指从某个数据来源(如键盘,鼠标,文件等)输入的数据序列输出流指将向某个数据目的地(如屏幕,文件,网络等)输出的数据序列java.io包中定义与输入、输出流相关的类和接口,构成了Java语言的I/O框架java.io包中类和接口从功能上主要分为字符流类型和字节流类型字符流是指数据序列的基本构成单位是16位的Unicode字符数据,如各类基于字符编码的文本文件字节流是指数据序列的基本构成单位是8位的字节数据,如各类基于二进制数据的文件8.1.2

io类库I/O流字节流字符流1.InputStreamReader是字节流通向字符流的桥梁:把读取的字节型数据解码为字符型数据。2.OutputStreamWriter是字符流通向字节流的桥梁:把将要写入的字符型数据编码为字节型数据。其中:在从字节流转化为字符流时,其实质是将字节数组(bytebytes[]转化为字符串String.publicString(bytebytes[],StringcharsetName);

在从字符流转化为字节流时,其实质是将字符串String转化为字节数组(bytebytes[].byte[]String.getBytes(StringcharsetName);8.1.2

io类库1、字节流的层次结构

在java.io类库中,InputStream和OutputStream是处理字节数据的基本输入输出类,他们处在java.io包的最顶层。这两类均为抽象类,也就是说他们不能被实例化,必须生成子类之后才能实现一定的功能。8.1.2

io类库2、字符流的层次结构8.1.2

io类库2、字符流的层次结构类名功能BufferedReader和BufferedWriter用于字符流读写缓冲存储。InputStreamReader和OutputStreamWriter用于将字节码与字符码相互转换。FileReader和FileWriter用于字符文件的输入输出。8.2文件处理1、File类2、字符文件:

FileReader类、FileWriter类3、字节文件:

FileInput类、FileOutput类定义在包java.io中文件是计算机中一种基本的数据存储形式,在实际存储数据时,如果对于数据的读写速度要求不是很高,存储的数据量不是很大时,使用文件作为一种持久数据存储的方式是比较好的选择。存储在文件内部的数据和内存中的数据不同,存储在文件中的数据是一种“持久存储”,也就是当程序退出或计算机关机以后,数据还是存在的,而内存内部的数据在程序退出或计算机关机以后,数据就丢失了。File类不是InputStream,OutputStream或Reader,Writer的子类,因为它不负责数据的输入输出,而是专门用来管理磁盘文件与目录的。8.2.1文件与目录管理1、创建File类文件对象

(1)所有对文件的操作都要使用File类.(2)其构造:

File(“文件名”);File(“文件所在目录”,“文件名”);文件与应用程序不在同一目录文件与应用程序在同一目录Filef1=newFile(“C:\myProgram\jtest”);Strings=“myProgram\jtest”;Filef2=newFile(S);Filef3=newFile(“testfile.dat”);Filef4=newFile(“\docs”,“file.dat”);8.2.1文件与目录管理2、获取文件及目录属性(1)判断文件或目录是否存在

publicbooleanexists();(2)判断是文件还是目录

publicbooleanisFile();

publicbooleanisDirectory();(3)获取文件或目录名称与路径

publicStringgetName();返回文件名或目录名。

publicStringgetPath();返回文件或目录的路径。8.2.1文件与目录管理(4)获取文件的长度

publiclonglength();

(5)获取文件读写属性

publicbooleancanRead();publicbooleancanWrite();(6)列出目录中的文件

publicString[]list();(7)比较两个文件或目录

publicbooleanequals(Filef);8.2.1文件与目录管理3、文件及目录操作

File类中还定义了一些对文件或目录进行管理、操作的方法,常用的方法有:(1)重命名文件

publicbooleanrenameTo(FilenewFile);(2)删除文件

publicvoiddelete();(3)创建目录

publicbooleanmkdir();8.2.2文件流对文件进行输入输出处理的四个类:FileInputStream:字节文件输入流;FileOutputStream:字节文件输出流;FileReader:字符文件输入流;FileWriter:字符文件输出流。8.2.2文件流1、字节文件输入流读取文件(1)FileInputStream类FileInputStream(Stringfilename);FileInputStream(Filefile);FileInputStream(FileDescriptorfdObj);(2)从文件输入流中读取字节intread();intread(byteb[]);intread(byteb[],intoff,intlen);intread();每次只能从输入流中读取一个字节的数据。该方法返回的是一个0~255之间的一个整数值,若为文本类型的数据返回的是ASCII值。若该方法到达输入流的末尾,则返回值为-1

。intread(byteb[]);intread(byteb[],intoff,intlen);以字节型数组作为参数,一次可以读取多个字节,读入的字节数据直接放入字节数组b中,并返回实际读取的字节个数。需要注意的是:read方法是阻塞方法,也就是如果流对象中无数据可以读取时,则read方法会阻止程序继续向下运行,一直到有数据可以读取为止。intread(byteb[])的作用是读取当前流对象中的数据,并将读取到的数据依次存储到数组b(b需要提前初始化完成)中,也就是把当前流中的第一个字节的数据存储到b[0],第二个字节的数据存储到b[1],依次类推。流中已经读取过的数据也会被删除,后续的数据会变成流中的第一个字节。【例8-1】在下面的程序中,读取一个文本文件test.dat,并将其显示到对话框上。

在编写程序之前,我们至少需要知道两件事:(1)怎样把一个流与一个文件联系起来;(2)用什么方法把从文件中读取到的数据显示到一个对话框中。*读取文件*/importjava.io.*;importjavax.swing.*;classExample8_1{publicstaticvoidmain(Stringargs[]){bytebuffer[]=newbyte[2056];Stringstr; try{ Filefile=newFile("d:/jtest/test.dat"); FileInputStreamfileInput=newFileInputStream(file);intbytes=fileInput.read(buffer);

str=newString(buffer,0,bytes);}catch(Exceptione) { str=e.toString(); } JOptionPane.showMessageDialog(null,str);System.exit(0);//退出程序

}}8.2.2文件流2、字节文件输出流写入文件(1)FileOutputStream类FileOutputStream(Stringfilename)FileOutputStream(Filefile)FileOutputStream(FileDescriptorfdObj)(2)把字节发送到文件输出流write(int

b);write(byte[]

b);write(byte[]

b,int

off,int

len);write(int

b):将指定字节写入此文件输出流write(byte[]

b):将b.length个字节从指定字节数写入此文件输出流中【例8-2】复制图像文件a.jpg,并且更名为b.jpg。*读写图像文件*/importjavax.swing.JOptionPane;importjava.io.*;classFileRW{intbytes;bytebuffer[]=newbyte[65560];FileInputStreamfileInput;FileOutputStreamfileOutput;FileRW() {takeimg(); loadimg();JOptionPane.showMessageDialog(null,"文件复制并更名成功!\n文件大小为:"+bytes);System.exit(0);//退出程序

}//读取图像文件a.jpgpublicvoidtakeimg() { try{ Filefile=newFile("a.jpg"); fileInput=newFileInputStream(file);bytes=fileInput.read(buffer,0,65560);}catch(IOExceptionei){System.out.println(ei);}}//写入到b.jpgpublicvoidloadimg() { try{ fileOutput=newFileOutputStream("b.jpg");fileOutput.write(buffer,0,bytes); }catch(IOExceptioneo){System.out.println(eo);} }}publicclassExample8_2{publicstaticvoidmain(String[]args) {newFileRW(); }}8.2.2文件流3、字符文件流读写文本文件(1)FileReader和FileWriter

FileReader(Stringfilename);FileReader(Filefile);FileReader(FileDescriptorfdObj);FileWriter(Stringfilename);FileWriter(Filefile);FileWriter(FileDescriptorfdObj);8.2.2文件流3、字符文件流读写文本文件(2)用字符流进行读写操作的方法

与字节输入输出流的功能一样,Reader和Writer只是建立一条通往字符文件的通道,而要实现对字符数据的读写操作,还需要读方法和写方法来完成。

8.2.2文件流从输入流中按行读取字符的方法:

StringreadLine();向输出流写入多个字符的方法:

write(String

s,int

off,int

len);将指定的字符串s从偏移量off开始的len个字符写入文件输出流。刷新BufferedWriter所建立的缓冲区,一次性将缓冲区中的数据写入文件的方法如下:

flush();【例8-3】将文件a.txt读取到文本区,经修改后,另存为b.txt。/*文件的读取和写入*/importjava.io.*;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;classWinextendsJFrameimplementsActionListener{FileReaderr_file;FileWriterw_file;BufferedReaderbuf_reader;BufferedWriterbuf_writer;JTextAreatxt;JButtonbtn1,btn2;JPanelp;Win(){setSize(200,200);setVisible(true);txt=newJTextArea(10,10);btn1=newJButton("Read");btn2=newJButton("Write");btn1.addActionListener(this);btn2.addActionListener(this);p=newJPanel();add(txt,"Center");add(p,"South");p.setLayout(newFlowLayout());p.add(btn1);p.add(btn2);validate();setDefaultCloseOperation(EXIT_ON_CLOSE);}publicvoidactionPerformed(ActionEvente){if(e.getSource()==btn1){readFile();}if(e.getSource()==btn2){writeFile();}}//读取文件publicvoidreadFile(){Strings; try{ Filef=newFile("D:/jtest/","Test.txt"); r_file=newFileReader(f);buf_reader=newBufferedReader(r_file); }catch(IOExceptionef){System.out.println(ef);} try{ while((s=buf_reader.readLine())!=null) {txt.append(s+'\n');}}catch(IOExceptioner){System.out.println(er);}}publicvoidwriteFile(){ try{w_file=newFileWriter("D:/jtest/Test.txt");buf_writer=newBufferedWriter(w_file);Stringstr=txt.getText();buf_writer.write(str,0,str.length());buf_writer.flush(); }catch(IOExceptionew){System.out.println(ew);}}}publicclassExample8_3{ publicstaticvoidmain(String[]args) { Winw=newWin(); }}8.3随机存取文件和本地可执行文件随机存取文件流RandomAccessFile类可以读写文件中任意位置上的字节、文本等数据。它有二个构造方法:(1)RandomAccessFile(Stringfilename,Stringmode)(2)RandomAccessFile(Filefile,Stringmode)8.3.1随机存取文件流【例8-4】用随机存取文件流读写文件。1./*随机流*/2.importjava.io.*;3.classExample8_44.{5. publicstaticvoidmain(String[]args)6. {7. try{8.

RandomAccessFilef=newandomAccessFile("a.txt","rw");9.

f.writeBytes("Zhangsiming");10.

f.close();11.

}12.

catch(IOExceptione){13.

System.out.println(e);14.

}15. }16.

}

见书上234页表8.3随机存取文件流的常用方法。8.4数据流与对象流

有许多应用程序需要将处理的数据作为Java的一种基本类型(如布尔型,字节,整数和浮点数)来使用。这就要用到数据流类DataInputStream类和DataOutputStream类。这两个数据流类是很有用处的,它们允许程序按机器无关的格式读取Java原始数据。常用方法见表8.4

8.4.1数据流8.4.1数据流用下面的构造方法就可以建立DataInputStream类和DataOutputStream类的实例:

publicDataInputStream(InputStreamin);publicDataOutputStream(OutputStreamout);8.4.1数据流方法功能close()关闭流并释放资源。readBoolean()

读取一个布尔值。readByte()读取一个字节。readInt()从文件中读取一个int值。readUTF()从文件中读取一个UTF字符串。seekByte(intpos)设置文件指针偏移量,在该位置发生下一个读取或写入操作。writeBoolean(booleanb)把一个布尔值作为单字节值写入。writeChars(Strings)向文件写入一个字符串。writeInt(intv)向文件写入一个int值。writeBytes(Strings)向文件写入一个字符串。writeUTF(Stringstr)使用UTF-8编码将一个字符串写入该文件。【例8-9】应用DataInputStream类和DataOutputStream类复制声音文件。

importjavax.swing.JOptionPane;importjava.io.*;import

java.util.*;classFileRW{intbytes,f_length;bytebuffer[];FileInputStreamfileInput;FileOutputStreamfileOutput;DataInputStreamdataInput;DataOutputStreamdataOutput;FileRW(){Filefile=newFile("E:"+File.separator+"gongsl2008"+File.separator+"03_布局管理器_1.avi");f_length=(int)file.length();buffer=new

byte[f_length];taking();loading();JOptionPane.showMessageDialog(null,"文件复制成功!\n文件大小为:"+f_length);System.exit(0);}public

voidtaking(){try{fileInput=newFileInputStream(“f:"+File.separator+"gongsl2008"+File.separator+"Kalimba.mp3");dataInput=newDataInputStream(fileInput);bytes=dataInput.read(buffer);}catch(IOExceptionei){ei.printStackTrace();}try{dataInput.close();}catch(IOExceptionei){ei.printStackTrace();}}public

voidloading(){try{fileOutput=newFileOutputStream(“f:"+File.separator+"gongsl2008"+File.separator+"Kalimba.mp3");dataOutput=newDataOutputStream(fileOutput);dataOutput.write(bu

温馨提示

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

评论

0/150

提交评论