《java中输入输出学习文档精品资料.doc》由会员分享,可在线阅读,更多相关《java中输入输出学习文档精品资料.doc(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、java中输入输出的总括(初学必看)第八章 输入输出流【课前思考】1.字节流和字符流的基类各是什么?2.什么是对象的串行化?对象串行化的作用是什么?【学习目标】本讲主要讲述了java语言中的输入/输出的处理,通过本讲的学习,同学们可以编写更为完善的java程序。【学习指南】仔细阅读本章各知识点的内容, 深刻理解 java 语言中输入/输出流的处理方法,掌握处理问题的方法,多练习,多上机。【难 重 点】遇到实际问题时,要根据需要正确使用各种输入输出流,特别是对中文使用适当的字符输入流。l正确使用对象串行化的方法。l处理字符流时,其构造方法的参数是一个字节流。l对象串行化的概念。l【知 识 点】I
2、/Ol 流概述文件处理l过滤流l字符流的处理l对象的串行化l其它常用的流l【内 容】第一节 数据流的基本概念理解数据流流一般分为输入流(Input Stream)和输出流(Output Stream)两类,但这种划分并不是绝对的。比如一个文件,当向其中写数据时,它就是一个输出流;当从其中读取数据时,它就是一个输入流。当然,键盘只是一个数人流,而屏幕则只是一个输出流。Java的标准数据流标准输入输出指在字符方式下(如DOS),程序与系统进行交互的方式,分为三种:标准输入studin,对象是键盘。标准输出stdout,对象是屏幕。标准错误输出stderr,对象也是屏幕。例 8.1 从键盘输入字符。
3、本例用System.in.read(buffer)从键盘输入一行字符,存储在缓冲区buffer中,count保存实际读入的字节个数,再以整数和字符两种方式输出buffer中的值。Read方法在java.io包中,而且要抛出IOException异常。程序如下:import java.io.*;public class Input1public static void main(String args) throws IOException System.out.println(Input: );byte buffer = new byte512; /输入缓冲区int count = Syste
4、m.in.read(buffer); /读取标准输入流System.out.println(Output: );for (int i=0;iCOUNT;I+) 输出buffer元素值System.out.print( +bufferi);System.out.println();for (int i=0;i0) /读取输入流System.out.print(new String(buffer);System.out.println();rf.close(); /关闭输入流catch (IOException ioe)System.out.println(ioe);catch (Exceptio
5、n e)System.out.println(e);例 8.3 写入文件。本例用System.in.read(buffer)从键盘输入一行字符,存储在缓冲区buffer中,再以FileOutStream的write(buffer)方法,将buffer中内容写入文件Write1.txt中,程序如下:import java.io.*;public class Write1 public static void main(String args)trySystem.out.print(Input: );int count,n=512;byte buffer = new byten;count = S
6、ystem.in.read(buffer); /读取标准输入流FileOutputStream wf = new FileOutputStream(Write1.txt);/创建文件输出流对象wf.write(buffer,0,count); /写入输出流wf.close(); /关闭输出流System.out.println(Save to Write1.txt!);catch (IOException ioe)System.out.println(ioe);catch (Exception e)System.out.println(e);第三节 文件操作File类File类声明如下:pub
7、lic class File ectends Object implements Serializable,Comparable构造方法:public File(String pathname)public File(File patent,String chile)public File(String patent,String child)文件名的处理String getName( ); /得到一个文件的名称(不包括路径)String getPath( ); /得到一个文件的路径名String getAbsolutePath( );/得到一个文件的绝对路径名String getParent
8、( ); /得到一个文件的上一级目录名String renameTo(File newName); /将当前文件名更名为给定文件的完整路径文件属性测试boolean exists( ); /测试当前File对象所指示的文件是否存在boolean canWrite( );/测试当前文件是否可写boolean canRead( );/测试当前文件是否可读boolean isFile( ); /测试当前文件是否是文件(不是目录)boolean isDirectory( ); /测试当前文件是否是目录普通文件信息和工具long lastModified( );/得到文件最近一次修改的时间long le
9、ngth( ); /得到文件的长度,以字节为单位boolean delete( ); /删除当前文件目录操作boolean mkdir( );v /根据当前对象生成一个由该对象指定的路径String list( ); /列出当前目录下的文件v例 8.4 自动更新文件。本例使用File类对象对指定文件进行自动更新的操作。程序如下:import java.io.*;import java.util.Date;import java.text.SimpleDateFormat;public class UpdateFile public static void main(String args) t
10、hrows IOException String fname = Write1.txt; /待复制的文件名String childdir = backup; /子目录名new UpdateFile().update(fname,childdir);public void update(String fname,String childdir) throws IOException File f1,f2,child;f1 = new File(fname); /当前目录中创建文件对象f1child = new File(childdir); /当前目录中创建文件对象childif (f1.exi
11、sts() if (!child.exists() /child不存在时创建子目录child.mkdir();f2 = new File(child,fname); /在子目录child中创建文件f2if (!f2.exists() | /f2不存在时或存在但日期较早时f2.exists()&(f1.lastModified() f2.lastModified() copy(f1,f2); /复制getinfo(f1);getinfo(child);elseSystem.out.println(f1.getName()+ file not found!);public void copy(Fi
12、le f1,File f2) throws IOException /创建文件输入流对象FileInputStream rf = new FileInputStream(f1);FileOutputStream wf = new FileOutputStream(f2);/创建文件输出流对象int count,n=512;byte buffer = new byten;count = rf.read(buffer,0,n); /读取输入流while (count != -1)wf.write(buffer,0,count); /写入输出流count = rf.read(buffer,0,n);
13、System.out.println(CopyFile +f2.getName()+ !);rf.close(); /关闭输入流wf.close(); /关闭输出流public static void getinfo(File f1) throws IOException SimpleDateFormat sdf;sdf= new SimpleDateFormat(yyyy年MM月dd日hh时mm分);if (f1.isFile()System.out.println(t+f1.getAbsolutePath()+t+f1.length()+t+sdf.format(new Date(f1.l
14、astModified();elseSystem.out.println( t+f1.getAbsolutePath();File files = f1.listFiles();for (int i=0;iFILES.LENGTH;I+)getinfo(filesi);f1.lastModified()返回一个表示日期的长整型,值为从1970年1月1日零时开始计算的毫秒数,并以此长整型构造一个日期对象,再按指定格式输出日期。程序运行结果如下:D:myjavaWrite1.txt62002年12月11日02时18分 D:myjavabackupD:myjavabackupWrite1.txt62
15、002年12月31日05时13分文件过滤器类FilterInputStream和FilterOutputStream分别对其他输入/输出流进行特殊处理,它们在读/写数据的同时可以对数据进行特殊处理。另外还提供了同步机制,使得某一时刻只有一个线程可以访问一个输入/输出流类FilterInputStream和FilterOutputStream分别重写了父类InputStream和OutputStream的所有方法,同时,它们的子类也应该重写它们的方法以满足特定的需要要使用过滤流,首先必须把它连接到某个输入/输出流上,通常在构造方法的参数中指定所要连接的流:FilterInputStream(In
16、putStream in);FilterOutputStream(OutputStream out);这两个类是抽象类,构造方法也是保护方法类BufferedInputStream和BufferedOutputStream实现了带缓冲的过滤流,它提供了缓冲机制,把任意的I/O流“捆绑”到缓冲流上,可以提高读写效率在初始化时,除了要指定所连接的I/O流之外,还可以指定缓冲区的大小。缺省大小的缓冲区适合于通常的情形;最优的缓冲区大小常依赖于主机操作系统、可使用的内存空间以及机器的配置等;一般缓冲区的大小为内存页或磁盘块等地整数倍,如8912字节或更小。BufferedInputStream(Inp
17、utStream in, int size) BufferedOutputStream(OutputStream out, int size)例 8.5 列出当前目录中带过滤器的文件名清单。本例实现FilenameFilter接口中的accept方法,在当前目录中列出带过滤器的文件名。程序如下:import java.io.*;public class DirFilter implements FilenameFilterprivate String prefix=,suffix=; /文件名的前缀、后缀public DirFilter(String filterstr)filterstr =
18、 filterstr.toLowerCase();int i = filterstr.indexOf(*);int j = filterstr.indexOf(.);if (i0)prefix = filterstr.substring(0,i);if (j0)suffix = filterstr.substring(j+1);public static void main(String args) /创建带通配符的文件名过滤器对象FilenameFilter filter = new DirFilter(w*abc.txt);File f1 = new File(); File curdir
19、 = new File(f1.getAbsolutePath(),); /当前目录System.out.println(curdir.getAbsolutePath();String str = curdir.list(filter); /列出带过滤器的文件名清单for (int i=0;iSTR.LENGTH;I+)System.out.println(t+stri);public boolean accept(File dir, String filename)boolean yes = true;tryfilename = filename.toLowerCase();yes = (fi
20、lename.startsWith(prefix) &(filename.endsWith(suffix);catch(NullPointerException e)return yes;程序运行时,列出当前目录中符合过滤条件“w*.txt“的文件名清单。结果如下:D:myjavaWrite1.txtWrite2.txt文件对话框随机文件操作于InputStream 和OutputStream 来说,它们的实例都是顺序访问流,也就是说,只能对文件进行顺序地读/写。随机访问文件则允许对文件内容进行随机读/写。在java中,类RandomAccessFile 提供了随机访问文件的方法。类Rando
21、mAccessFile的声明为:public class RandomAccessFile extends Object implements DataInput, DataOutput File:以文件路径名的形式代表一个文件FileDescriptor:代表一个打开文件的文件描述FileFilter & FilenameFilter:用于列出满足条件的文件File.list(FilenameFilter fnf) File.listFiles(FileFilter ff)FileDialog.setFilenameFilter(FilenameFilter fnf)FileInputStr
22、eam & FileReader:顺序读文件FileOutputStream & FileWriter:顺序写文件RandomAccessFile:提供对文件的随机访问支持类RandomAccessFile则允许对文件内容同时完成读和写操作,它直接继承Object,并且同时实现了接口DataInput和DataOutput,提供了支持随机文件操作的方法DataInput和DataOutput中的方法readInt(), writeDouble()int skipBytes(int n):将指针乡下移动若干字节length():返回文件长度long getFilePointer():返回指针当前
23、位置void seek(long pos):将指针调到所需位置void setLength(long newLength):设定文件长度构造方法:RandomAccessFile(File file, String mode) RandomAccessFile(String name, String mode)mode 的取值“r” 只读. 任何写操作都将抛出IOException。“rw” 读写. 文件不存在时会创建该文件,文件存在时,原文件内容不变,通过写操作改变文件内容。 “rws” 同步读写. 等同于读写,但是任何协操作的内容都被直接写入物理文件,包括文件内容和文件属性。“rwd” 数
24、据同步读写. 等同于读写,但任何内容写操作都直接写到物理文件,对文件属性内容的修改不是这样。例 8.6 随机文件操作。本例对一个二进制整数文件实现访问操作当以可读写方式“rw“打开一个文件”prinmes.bin“时,如果文件不存在,将创建一个新文件。先将2作为最小素数写入文件,再依次测试100以内的奇数,将每次产生一个素数写入文件尾。程序如下:import java.io.*;public class PrimesFile RandomAccessFile raf;public static void main(String args) throws IOException(new Prim
25、esFile(). createprime(100);public void createprime(int max) throws IOExceptionraf=new RandomAccessFile(primes.bin,rw);/创建文件对象raf.seek(0); /文件指针为0raf.writeInt(2); /写入整型int k=3;while (k=max)if (isPrime(k)raf.writeInt(k);k = k+2; output(max);raf.close(); /关闭文件public boolean isPrime(int k) throws IOExce
26、ptionint i=0,j;boolean yes = true;tryraf.seek(0); int count = (int)(raf.length()/4); /返回文件字节长度while (i=count) & yes)if (k % raf.readInt()=0) /读取整型yes = false;elsei+;raf.seek(i*4); /移动文件指针 catch(EOFException e) /捕获到达文件尾异常return yes;public void output(int max) throws IOExceptiontryraf.seek(0); System.
27、out.println(2.+max+中有 +(raf.length()/4)+ 个素数:);for (int i=0;i(int)(raf.length()/4);i+)raf.seek(i*4); System.out.print(raf.readInt()+ );if (i+1)%10=0) System.out.println(); catch(EOFException e) System.out.println();程序运行时创建文件“primes.bin“,并将素数写入其中,结果如下:2.100中有 25 个素数:2 3 5 7 11 13 17 19 23 29 31 37 41
28、 43 47 53 59 61 67 71 73 79 83 89 97 第四节 字符流Reader类和Writer类 前面说过,在JDK1.1之前,java.io包中的流只有普通的字节流(以byte为基本处理单位的流),这种流对于以16位的Unicode码表示的字符流处理很不方便。从JDK1.1开始, java.io包中加入了专门用于字符流处理的类,它们是以Reader和Writer为基础派生的一系列类同类InputStream和OutputStream一样,Reader和Writer也是抽象类,只提供了一系列用于字符流处理的接口。它们的方法与类InputStream和OutputStrea
29、m类似,只不过其中的参数换成字符或字符数组Reader类void close()void mark(int readAheadLimit)boolean markSupported() :int read() int read(char cbuf) int read(char cbuf, int off, int len) boolean ready() void reset() long skip(long n)Writer类void close() void flush() void write(char cbuf) void write(char cbuf, int off, int l
30、en) void write(int c) void write(String str) void write(String str, int off, int len) 例 8.7 文件编辑器。本例实现文件编辑器中的打开、保存文件功能。程序如下:import java.awt.*;import java.awt.event.*;import java.io.*;public class EditFile1 extends WindowAdapter implements ActionListener,TextListenerFrame f;TextArea ta1;Panel p1;Text
31、Field tf1;Button b1,b2,b3; FileDialog fd;File file1 = null;public static void main(String args)(new EditFile1().display();public void display()f = new Frame(EditFile);f.setSize(680,400);f.setLocation(200,140);f.setBackground(Color.lightGray);f.addWindowListener(this);tf1 = new TextField();tf1.setEna
32、bled(false);tf1.setFont(new Font(Dialog,0,20); /设置文本行的初始字体f.add(tf1,North);ta1 = new TextArea();ta1.setFont(new Font(Dialog,0,20); /设置文本区的初始字体f.add(ta1);ta1.addTextListener(this); /注册文本区的事件监听程序p1 = new Panel();p1.setLayout(new FlowLayout(FlowLayout.LEFT);b1 = new Button(Open);b2 = new Button(Save);b
33、3 = new Button(Save As);p1.add(b1);p1.add(b2);p1.add(b3);b2.setEnabled(false);b3.setEnabled(false);b1.addActionListener(this); /注册按钮的事件监听程序b2.addActionListener(this);b3.addActionListener(this);f.add(p1,South);f.setVisible(true);public void textValueChanged(TextEvent e) /实现TextListener接口中的方法,对文本区操作时触
34、发b2.setEnabled(true);b3.setEnabled(true);public void actionPerformed(ActionEvent e)if (e.getSource()=b1) /单击打开按钮时fd = new FileDialog(f,Open,FileDialog.LOAD);fd.setVisible(true); /创建并显示打开文件对话框if (fd.getDirectory()!=null) & (fd.getFile()!=null)tf1.setText(fd.getDirectory()+fd.getFile();try /以缓冲区方式读取文件
35、内容file1 = new File(fd.getDirectory(),fd.getFile();FileReader fr = new FileReader(file1);BufferedReader br = new BufferedReader(fr);String aline;while (aline=br.readLine() != null)/按行读取文本ta1.append(aline+rn);fr.close();br.close();catch (IOException ioe)System.out.println(ioe);if (e.getSource()=b2) |
36、(e.getSource()=b3) /单击保存按钮时if (e.getSource()=b3) |(e.getSource()=b2)&(file1=null) /单击SaveAs按钮时,或单击Save按钮且文件对象为空时fd = new FileDialog(f,Save,FileDialog.SAVE);if (file1=null)fd.setFile(Edit1.txt);elsefd.setFile(file1.getName();fd.setVisible(true); /创建并显示保存文件对话框if (fd.getDirectory()!=null) & (fd.getFile
37、()!=null)tf1.setText(fd.getDirectory()+fd.getFile();file1 = new File(fd.getDirectory(),fd.getFile();save(file1);elsesave(file1);public void save(File file1)try /将文本区内容写入字符输出流FileWriter fw = new FileWriter(file1);fw.write(ta1.getText();fw.close();b2.setEnabled(false);b3.setEnabled(false);catch (IOException io