第8章 Java的输入输出_第1页
第8章 Java的输入输出_第2页
第8章 Java的输入输出_第3页
第8章 Java的输入输出_第4页
第8章 Java的输入输出_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

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

文档简介

第八章Java的输入输出流教学提示大多数的程序都离不开输入和输出,比如从键盘读取数据,从文件中获取数据或者将数据存入文件,在显示器上显示数据,以及在网络上进行信息交互等,都会涉及到有关输入/输出的处理。本章内容8.1输入/输出流8.2文件处理8.3随机存取文件和本地可执行文件8.4数据流与对象流8.5JAVA的多媒体技术知识要求了解流的概念;理解基本的I/O对象;掌握通过流处理字节级数据、字符数据、对象数据的存取方法和随机流的访问方法;掌握本地可执行文件的调用方法。本章重/难点重点:使用文件流对文件的操作。难点:对象序列化。8.1输入/输出流1、流的概念2、io类库流的概念概念:可以被认为是数据从一种设备流向另一种设备的过程,就是一个通道。特点:数据的发送和获取都是沿数据序列顺序进行的,每个数据必须等待它前面的数据发送或读入后才能被读写。流的分类按流的运行方向分:输入流输出流输入输出流的概念输入流:将数据引入到计算机的CPU中如:从磁盘中读取信息、从网络中读信息、从扫描仪中读信息输出流:将数据引导到外部设备如:向磁盘中保存文件、向网络中发送文件、在屏幕上显示文件等当需要读入数据时,程序先从数据的来源(文件、网络等)打开一个流,然后从这个流中顺序读取数据当要输出数据时,程序打开一个流,通过这个流向输出目标顺序写入数据流中的数据可以是二进制数据,或是某种格式的特定数据Java中数据流的两种类型字节流(按8位一个字节来处理二进制数据)Java.io包中InputStream(输入)和OutputStream(输出)类来实现传输字符流(按16位一个字符的Unicode码来处理数据文本型)Java.io包中Reader和Writer类来实现传输io类库Java中数据输入输出的所有功能实现都是通过java.io包中的类和接口来完成的。

java.io包中的一些处理数据流和文件的类

字节(Byte)流传输8位的数据就应用Byte流,这些类主要用来传输二进制数据,如声音和图像。InputStream和OutputStream是处理字节数据的基本类,这两个类是抽象类,不能直接使用。字节输入流的层次结构文件流,对文件进行读写操作管道流,实现程序或线程间的通信过滤流字节数组流,实现与内存缓冲区的同步读写和CPU寄存器的读写数据流,实现带格式的读写操作将数据读写到缓冲区对象流,将对象作为一个数据通过流进行传输和存储字节输出流的层次结构字符输入流的层次结构Character流以Reader(对应输入)和Writer(对应输出)两个类族来实现,其中Reader和Writer是输入和输出族的根类读缓冲存储进行字节码与字符码的相互转换用于字符文件的输入、输出字符输出流的层次结构字节流和字符流的相互转换通过InputStreamReader类和OutputStreamWriter类实现InputStreamReader:读取字节并解码为字符PublicString(byte

bytes[],String

charsetName)OutputStreamWriter:将要写入的字符解码为字节Byte[]String.getBytes(String

charsetName)字符流和字节流的对应关系

Reader类和Writer类的子类与InputStream类和OutputStream类的子类大部分是对应的,不同之处是前者用来处理16位的字符流,而后者用来处理8位的字节流字节流和字符流的对应表之前常用的输入输出方法PrintStream类

println()不属于OutputStream类,是PrintStream类的子类,能提供复杂的输出。PrintStream类为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。

PrintStream类的方法有:Write,flush,checkError,print,println,close.其中println可以输出多种形式的数据.例如:

System.in和System.out对象为了支持标准的输入输出设备,Java定义了两个流的对象:System.in和System.out。System.in可以从键盘中读入数据,System.out可以将数据输出到显示屏。例:输入一个字符,在屏幕上显示该字符

importjava.io.*;publicclassCharInput1{publicstaticvoidmain(String[]args)throws

IOException//必须做异常处理{inta; try{System.out.print("请输入一个字符:");

a=System.in.read();

System.out.println("你输入的字符是"+(char)a);}catch(IOExceptione){System.out.println("错误信息为:"+e.toString()); }}}例:输入一行字符,在屏幕上显示该行字符importjava.io.*;publicclassCharInput2{publicstaticvoidmain(String[]args){bytebuffer[]=newbyte[255];System.out.println("请在下面输入一行字符:");try{System.in.read(buffer,0,255);//将输入字符读入数组里}catch(Exceptione)//捕获异常并处理{ System.out.println("读取输入字符出错,错误信息为:"+e.toString());}System.out.println("您刚才输入的一行字符为:");StringinputStr=newString(buffer);System.out.println(inputStr);}}8.2文件处理1、文件与目录管理2、文件流1、文件与目录管理与文件操作相关的类:File类在Java语言中,用类File表示文件,File类可以处理各种文件操作。和文件相关的一个重要概念是目录,Java的类File既可以表示文件,也可以表示目录。File类(文件类)是Object类的直接子类,在java.io包中。不能完成数据的输入输出功能。File类是文件或目录的抽象,封装了相应的属性和方法File类的构造方法Path:带有绝对路经或相对路径的文件名或仅是路径。如:Filef=newFile(“c:\j2sdk1.4.2\bin\D.java”)Filem=newFile(“\j2sdk1.4.2\bin\D.java”)

Files=newFile(“D.java”)方法二:

publicFile(Stringpath,Stringname)参数path是路径,name是文件名或目录名。即路径和文件名分开,便于管理和修改如:Filen=newFile(“c:\j2sdk1.4.2\bin”,”D.java”)方法一:publicFile(Stringpath)File类相关的操作1.获取相关的属性可获得文件名、路径、长度、是目录还是文件、目录下的文件、读写属性等2.主要的操作重命名、删除、创建目录文件处理——

1.获取文件和目录属性列出目录下的文件如果File对象是目录,而不是文件,则可以用下面的方法列出目录下的文件。publicString[]list()将目录下的所有文件名保存在字符串数组中返回。获取所有根目录如果需要知道磁盘上的所有文件,则要找出系统平台的所有根目录名。publicstaticFile[]listRoots()该方法返回File数组,其中存放系统平台的所有根目录名。判断文件或目录是否存在booleanexists()判断是文件还是目录booleanisfile()booleanisDirectory()获取文件、目录名和路径StringgetName()StringgetPath()获取文件长度longlength()文件读写性质booleancanRead();booleancanWirte();比较文件或目录booleanequals(Filef)文件处理——

2.文件及目录操作创建新目录

①publicbooleanmkdir()生成File对象指定的目录。②publicbooleanmkdirs()生成File对象指定的目录树。两个方法的区别:mkdirs()可以创建目录路径中多层目录,即同时创建这个目录的父目录以及父目录的父目录,mkdir()要求创建目录的父目录已存在。创建新目录例如,下面的语句就在Windows下创建目录树:c:\lianxi\exampleFilef=newFile("c:\lianxi\example");

f.mkdirs();创建新文件下面的语句在当前目录下建立一个文本文件wo.txt:Filef=newFile("./wo.txt"); f.createNewFile();重命名文件boolean

renameTo(File

newFile);删除当前文件voiddelete();2、文件流对文件进行输入输出处理的类FileInputStream:字节文件输入流FileOutputStream:字节文件输出流FileReader:字符文件输入流FileWriter:字符文件输出流FileInputStream类的构造方法

方法一:直接用文件名FileInputStreamfis=newFileInputStream(“e:/temp/b.txt");方法二:用文件对象名Filef=newFile(“e:/temp/b.txt");FileInputStreamfis=newFileInputStream(f);FileInputStream类常用的方法intread():每次读一个字节的数据,读完返回-1int

read(byte[]b):每次读多个字节,将数据读入到一个数组b[]中,返回实际读取字节数。int

read(byte[]b,int

off,int

len)

将len个字节的数据读入到一个字节型数组b[]中,从下标off开始存放,并返回实际读入的字节数。intavailable()

返回可读入的字节数。voidclose()

关闭输入流,并释放任何与该流有关的资源。protectedvoidfinalize()

当读到无用信息时,关闭该流。longskip(longn)

跳过输入流上的n个字节。FileInputStream类读取文件例子功能:从文件里取内容显示到对话框中关键点:

1.建立流从相应文件中取数据

2.把读到的数据转换成string类型,显示出来importjava.io.*;importjavax.swing.*;classExample8_1{publicstaticvoidmain(Stringargs[]){bytebuffer[]=newbyte[2056];Stringstr; try{Filefile=newFile("e:/第八章/第8章/tips.dat"); FileInputStreamfileInput=newFileInputStream(file);//创建输入流对象

intbytes=fileInput.read(buffer,0,2056);//将流中的数据读到数组buffer的指定位置

str=newString(buffer,0,bytes);//使用数组buffer创建字符串

}catch(Exceptione) {str=e.toString();}

JOptionPane.showMessageDialog(null,str);System.exit(0);}}

FileOutputStream类的构造方法方法一:直接用文件名FileOutputStream

fos=new

FileOutputStream("e:/temp/b.txt");如e:/temp/b.txt文件不存在,则自动创建一个如e:/temp/b.txt文件已存在,则覆盖其内容方法二:用文件对象名Filef=newFile("e:/temp/b.txt");FileOutputStream

fos=newFileOutputStream(f);FileOutputStream类的常用方法voidwrite()voidwrite(intb)voidwrite(byte[]b)longskip(longn)voidclose()voidfinalize()FileInputStream类输出数据的例子功能:从图片a.jpg中读取数据创建图片b.jpg

FileInputStream类输出数据的例子关键点:1、用输入流将a.jpg中的内容读入内存2、用输出流将内存中的内容写入b.jpg中classFileRW

{intbytes;bytebuffer[]=newbyte[65560];FileInputStreamfileInput;FileOutputStream

fileOutput;

FileRW()//构造方法

{takeimg();loadimg();

JOptionPane.showMessageDialog(null,"文件复制并更名成功!\n文件大小为:"+bytes);System.exit(0);}publicvoidtakeimg()//读取图像文件a.jpg{try{Filefile=newFile(“a.jpg”);//创建文件对象

fileInput=newFileInputStream(file);//创建输入流对象

bytes=fileInput.read(buffer,0,65560);

//将从文件file中读取的数据写入到数组buffer中

}

catch(IOException

ei){System.out.println(ei);}}publicvoidloadimg() { try{

fileOutput=newFileOutputStream("b.jpg");//创建文件输出流对象

fileOutput.write(buffer,0,bytes);//从数组buffer中读取数据

}

catch(IOException

eo){System.out.println(eo);}}}publicclassExample8_2{publicstaticvoidmain(String[]args) {newFileRW(); }}FileInputStream类输出数据的例子a.jpgb.jpg字节数组FileInputStreamFileOutputStream文件输入流文件输出流FileReader类和FileWriter的构造方法FileReaderfir=newFileReader("b.txt");FileReaderfir=newFileReader(文件对象名);FileWriterfir=newFileWriter("b.txt");FileWriterfir=newFileWriter(文件对象名);BufferedReader类和BufferedWriter类是增加了缓冲区的输入输出流类,它们用来连接字符输入输出流,使数据处理速度大大加快,提高了读写效率。数据首先写入缓冲区,当缓冲区的数据满时,数据才会写入所连接的输入/输出流;当缓冲区未满时,可以用该类的方法flush()将缓冲区的数据强制全部写入文件。

flush():将缓冲区中的数据强制送出

为加快数据传输速度,提高效率,有时输出数据流会在提交数据之前把所要输出的数据先锁定在内存缓冲区,然后成批地进行输出,每次传输过程都以某特定数据长度为单位传输数据。在这种方式下,在数据的末尾一般都会有一部分数据由于数量不够一个传输单位,而存留在缓冲区里,用方法flush()则可以将这部分数据强制提交。BufferedReader类和BufferedWriter类的构造方法

BufferedReader(字符输入流对象)BufferedWriter(字符输出流对象)字符流进行读写操作的常用方法StringreadLine();从输入流按行读取字符write(Strings,intoff,int

len);向输出流写入多个字符close();关闭流例8—3本周实验作业1、利用File类的相关方法,完成目录和文件的创建、删除和更名2、计算Fibonacii数列,a1=1,a2=1...an=an-1+an-2即前两个数是1,从3个数开始,每个数是前两个数的和,计算数列的前20项,并用字节文件流的方式输出到一个文件,要求每5项1行。

本周实验作业3、编写一个程序,实现如下图所示的可视化复制文件的功能8.3随机存取文件和本地可执行文件1、随机存取文件流(RandomAccessFile类)2、本地可执行文件(Runtime类)什么是随机存取文件流?

RandomAccessFile类可以读写文件中任意位置上的字节、文本等数据既可以作为数据流的源,又可作为数据流目的。通过其不同的构造函数来确定是输出还是输入。它是一个独立分支的类,并不是InputStream或OutputStream的衍生类随机存取文件的原理可看做是在文件系统中的一个大型字节数组,有指针“读”操作:指针从开始位置读取字节并向前移动“写”操作:指针从开始位置写入字节并向前移动可通过相应方法设置指针RandomAccessFile类的构造函数newRandomAccessFile(“part.txt”,“r”);//创建一个对文件名称为part的只读随机访问newRandomAccessFile(文件对象名,"rw");随机存取文件流的常用方法该类实现了DataInput接口和DataOutput接口DataOutput接口中的方法有:DataInput接口中的方法:随机存取文件流的控制读写指针

int

skipBytes(intn)

//使文件指针向后移动指定的n个字节voidseek(longp)

//设置相对文件头的指针偏移量,在此位置进行下一次读写操作。

longgetFilePointer()//获取当前指针位置(相对于起始位)随机存取文件流的使用importjava.io.*;classExample8_4{ publicstaticvoidmain(String[]args) {try{

RandomAccessFilef=new

RandomAccessFile("a.txt","rw");

f.writeBytes("Zhang

si

ming");//将字符串写入输出流

f.close(); }

catch(IOException

e){System.out.println(e);}}}Example8_4运行结果没有a.txt文件时,自动创建文件,并写入字符串写入前写入后随机存取文件流实现一个英汉小词典关键点:创建用户界面:两个Panel,一个用来输入,一个用来显示录入按钮:使用RandomAccessFile输出流在文件的指定位置添加内容显示按钮:使用RandomAccessFile输入流例8—5什么是本地可执行文件?Runtime类层次结构

java.lang.Object

----java.lang.Runtime

作用:运行本地机的可执行文件,如本机的程序,自带的计算器等等Runtime类对象的创建应用程序都有一个Runtime类对象,使应用程序能够与运行环境相连接,但应用程序不能创建自己的Runtime类对象Runtimert=Runtime.getRuntime();Runtime类对象的常用方法如:rt.exec("javaExample8_5");Runtime类使用实例1、运行应用程序8—52、调用Windows系统自带的计算器3、设计一个简单的JAVA编译器,可以编写源程序、编译和运行程序Example8_6Example8_7Example8_8重点8.4数据流与对象流1、数据流2、对象流数据流的来源过滤流概念FilterInputStream和FilterOutputStream,它们是抽象类。使用过滤流时,比一般流多一道工序,就是过滤。过滤流是建筑在其他流之上的,如过滤流的方法read()从下层流中读取数据,并过滤后传给程序,而write()方法是先过滤后,再把数据写入下层流。过滤流作用对数据进行处理提供了同步机制,使得某一时刻只有一个线程可以访问一个I/O流过滤流的子类

DataInputStream和DataOutputStream

直接读写java的内构类型:intfloatboolean等BufferedInputStream

BufferedOutputStream

带有缓冲区的输入输出LineNumberInputStream

行的计数PushbackInputStream

预读一个字节的数据,unread()方法:把刚读过的字节退回数据流的作用实现直接读写java的各种内构类型的原始数据:intfloatboolean等设置指针偏移量怎样使用数据流?要使用数据流必须使它附加在其他流上。例如:FileInputStreamf=newFileInputStream("openFile.dat");//先生成一个文件输入流fDataInputStreambis=newDataInputStream(f);//再对文件流f进行过滤输出不同类型数据值classExample8{publicstaticvoidmain(String

args[]){for(intx=1;x<=100;x++){

intfld1;longfld2;doublefld3;fld1=x+5;fld2=x*5;fld3=x*25;try{FileOutputStreamf=newFileOutputStream("t.dat");

DataOutputStream

bis=newDataOutputStream(f);bis.writeInt(fld1);bis.writeLong(fld2);bis.writeDouble(fld3);}

catch(IOExceptione){

System.out.println(e);}}System.exit(0);}}应用数据流复制声音文件classFileRW

{intbytes,f_length;bytebuffer[];

FileInputStreamfileInput;

FileOutputStream

fileOutput;DataInputStreamdataInput;

DataOutputStream

dataOutput;//构造文件流和过滤流

FileRW() {Filefile=newFile("甜甜的.wma"); f_length=(int)file.length();//获取文件大小,以便设置数组容量

buffer=newbyte[f_length];

takeimg();

loadimg();

JOptionPane.showMessageDialog(null,"文件复制并更名成功!\n文件大小为:"+f_length);System.exit(0);//退出程序}publicvoidtakeimg() { try{fileInput=newFileInputStream(file);

dataInput=newDataInputStream(fileInput);bytes=dataInput.read(buffer);}

catch(IOException

ei){System.out.println(ei);}}

publicvoidloadimg()//写入到新文件中

{ try{fileOutput=newFileOutputStream("aa.wma");

dataOutput=newDataOutputStream(fileOutput);

dataOutput.write(buffer,0,bytes); }catch(IOException

eo){System.out.println(eo);}}}

publicclassExample8_9{publicstaticvoidmain(String[]args) {newFileRW(); }}对象流的来源对象流的作用把对象作为一个整体进行传输和存储对象流的应用实例程序功能:将文本框对象及其中字符作为一个整体进行读写关键点:1、创建对象输出流,将文本框连同内容写入文件2、创建对象输入流,将文件内容显示例8—10本周实验内容1、建立一个文本文件,输入学生3门课的成绩,编写一个程序,读入这个文件中的数据,输出每门课的成绩的最小值,最大值和平均值。2、编写程序,保存一个文本对象并检索对象的数据。什么是对象的序列化对象流进行读写时,必须保证该对象是序列化的,才能保证对象被正确的读出。把对象的状态记录下来就是对象的序列化怎样进行对象的序列化系统定义的类大多都是序列化对象用户自己定义的类通过实现Serializable接口进行序列化或继承序列化类Serializable接口属于java.io包不含方法对象的序列化实例1、实现日期、地址对象在对象流中的保存2、读取8-11中保存的数据例8—11例8—12什么是管道流管道流(PipeStreams)是把一个线程的输出作为另一个线程的输入。作用:实现在程序、线程、代码块间直接传输数据。实现通过PipedInputStream和PipedOutputStream。管道流的使用方法1:PipedOutputStreamout=newPipedOutputStream()//创建管道输出流out………{将数据写入输出流out}PipedIutputStreami

温馨提示

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

评论

0/150

提交评论