170 likes | 401 Vues
第 21 讲 Java çš„è¾“å…¥ä¸Žè¾“å‡ºæµ ( 下 ). Reader 类和 Writer ç±». å—符æµæ供了处ç†å—符的输入 / 输出的方法,包括两个抽象类 Reader å’Œ Writer 。å—ç¬¦æµ Reader 指å—ç¬¦æµ çš„ 输入æµï¼Œç”¨äºŽè¾“入,而 Writer 指å—ç¬¦æµ çš„ 输出æµï¼Œç”¨äºŽè¾“出。 Reader å’Œ Writer 使用的是 Unicode ,å¯ä»¥å¯¹ä¸åŒæ ¼å¼çš„æµè¿›è¡Œæ“作。 从 Reader å’Œ Writer 派生出的å类的对象 都 能对 Unicode å—符æµè¿›è¡Œæ“作,由这些对象æ¥å®žçŽ°ä¸Žå¤–设的连接。. Reader 类常用方法. Writer 类常用方法.
E N D
Reader类和Writer类 • 字符流提供了处理字符的输入/输出的方法,包括两个抽象类Reader和Writer。字符流Reader指字符流的输入流,用于输入,而Writer指字符流的输出流,用于输出。 • Reader和Writer使用的是Unicode,可以对不同格式的流进行操作。从Reader和Writer派生出的子类的对象都能对Unicode字符流进行操作,由这些对象来实现与外设的连接。
字符文件流FileReader和FileWriter类 • FileReader、FileWriter类用于字符文件的输入输出处理,与文件数据流FileInputStream、FileOutputStream的功能相似。 • 其构造方法如下: • public FileReader(File file) throws FileNotFoundException • public FileReader(String filename) throws FileNotFoundException • public FileWriter(File file) throws IOException • public FileWriter(String fileName,boolean append)throws IOException • FileReader从超类中继承了read、close等方法,FileWriter从超类中继承了write、close等方法。 • 例:FileReader in=new FileReader("java11.txt");
例11.5用FileReader一个字符一个字符地读取整个文件。例11.5用FileReader一个字符一个字符地读取整个文件。 import java.io.*; public class Ex11_5{ public static void main(String args[]){ FileReader fr; int ch; try { fr=new FileReader("c:\\Ex11_5.java"); while((ch=fr.read())!=-1){ System.out.print((char)ch); } }catch(Exception e){ e.printStackTrace(); } } }
字符缓冲流BufferedReader类和BufferedWriter类 • FileReader和FileWriter类以字符为单位进行输入输出,无法进行整行输入与输出,数据的传输效率很低。Java提供BufferedReader和BufferedWriter类以缓冲区方式进行输入输出,其构造方法如下: • public BufferedReader(Reader in) • public BufferedReader(Reader in,int sz) • public BufferedWriter(Writer out) • public BufferedWriter(Writer out,int sz) • BufferedReader流能够读取文本行,方法是readLine()。
字符缓冲流BufferedReader类和BufferedWriter类(续) • 通过向BufferedReader传递一个Reader对象或者Reader子类对象来创建一个BufferedReader对象,如: BufferedReader br=BufferedReader (new FileReader("java11.txt")); 然后再从流br中读取java11.txt中的内容。 • 类似的,可以将BufferedWriter流与FileWriter流连接起来,然后通过BufferedWriter流将数据写到目的地,例如: FileWriter fw=new FileWriter("java11.in"); BufferedWriter bw=new BufferedWriter(fw); • 然后使用BufferedReader类的成员方法write(String s int off,int len)把字符串s写到java11.in中,参数off是字符串s开始处的偏移量,len是写入的字符长度。
例11.6在例11.5中按字符一个一个的读取,效率比较低,现在应用BufferedWriter类来优化它,每次读取若干个字符。例11.6在例11.5中按字符一个一个的读取,效率比较低,现在应用BufferedWriter类来优化它,每次读取若干个字符。 import java.io.*; public class Ex11_6{ public static void main(String args[]){ FileReader fr; BufferedReader br; int ch; try{ fr=new FileReader("c:\\Ex11_6.java"); br=new BufferedReader(fr); while((ch=br.read())!=-1){ System.out.print((char)ch);} }catch(Exception e){ e.printStackTrace(); } } }
随机读写文件 • RandomAccessFile类创建的流与前面的输入输出流不同,RandomAccessFile类独立于字节流和字符流体系之外,不具有字节流和字符流的任何特性,它直接继承自Java的基类Object。RandomAccessFile类有两个构造方法。 • RandomAccessFile(String name,String mode):参数name用来确定一个文件名,给出创建的流的源,也可以是目的地。参数mode用来决定创建流对文件的访问权限,其值可以取r(只读)或者rw(可读写)。注意没有只写方式(w)。 • RandomAccessFile(File file,String mode):参数file是一个File对象,给出创建流的源,也可以是目的地。参数mode与前面的含义是一致的。
例11.7应用类RandomAccessFile编写程序,实现将两个磁盘文件"input1.txt"和"input2.txt"中的内容合并,并显示在屏幕上。 import java.io.*; public class Ex11_7{ public static void main(String args[]){ String s=""; try{ RandomAccessFile f1=new RandomAccessFile("c:/input1.txt","rw"); RandomAccessFile f2=new RandomAccessFile("c:/input2.txt","rw"); s=f1.readLine()+f2.readLine(); char c[]=s.toCharArray(); for(int i=0;i<s.length();i++) System.out.print(c[i]); System.out.println(); } catch(Exception e){} } }
实例1 import java.awt.*; import java.awt.event.*; import java.io.*; public class Ex11_8 extends WindowAdapter implements ActionListener{ Frame f; Button btn; TextArea ta; String fileName; public static void main(String argv[]){ new Ex11_8("output.txt");} public Ex11_8(String fileName){ this.fileName = fileName; f = new Frame(fileName); f.addWindowListener(this); btn = new Button("保存文件"); btn.addActionListener(this); ta = new TextArea(10,40); f.add(ta, BorderLayout.CENTER); f.add(btn, BorderLayout.SOUTH); f.pack(); f.setVisible(true); }
public void actionPerformed(ActionEvent e) { try { FileOutputStream fout = new FileOutputStream(fileName); byte buf[] = ta.getText().getBytes(); fout.write(buf); fout.close();} catch (IOException ioe){ System.err.println(e);} } public void windowClosing(WindowEvent e) { System.exit(0);} } 程序分析: 程序引入了系统包。定义了一个主类Ex11_8,继承了类Frame,且实现了事件监听器接口ActionListner。在主类中定义了一个构造方法,实现了图11-8的界面,并增加了事件监听器。方法actionPerformed()应用文件输出流将文本域中的文本写到指定的文件中。 windowClosing()方法实现关闭窗口。
实例2 import java.io.*; public class Ex11_9{ public static void main(String args[]){ try{ RandomAccessFiler rf=new RandomAccessFile("c:\\Ex11_9.java","rw"); String str; long pof=0; long lof=rf.length(); rf.seek(pof); int i=1; while(pof<lof){ str=rf.readLine(); System.out.println((i++)+""+str); pof=rf.getFilePointer(); } rf.close(); }catch(Exception e){ e.printStackTrace(); } }} 程序分析: 程序定义了一个主类Ex11_9,所有的代码都放在异常处理块try{}catch{},并实例化一个RandomAccessFile对象rf,while循环将该Java源程序显示出来,并在前面增加行号。close()方法关闭对象rf。
本章小结 • Java中的输入输出流,流根据流向分为输入流(InputStream)和输出流(OutputStream)两类,这些流都包括在系统包java.io中。 • 字节输入流都是从InputStream类继承的,InputStream及其子类中最主要的方法是read()方法 • 字节输出流都是从OutputStream类继承的,OutputStream及其子类中最主要的方法是write()方法 • 字符输入流都是从Reader类继承的,Reader及其子类中最主要的方法是read()方法 • 字符输出流都是从Writer类继承的,Writer及其子类中最主要的方法是write()方法 • 随机读写文件类
本章实训 • 实验目的 • 理解数据流的概念。 • 理解Java流的层次结构。 • 理解文件的概念。 • 通过实训了解从标准输入输出设备上输入输出数据的方法。 • 掌握字节流和字符流的基本使用方法,并总结对比它们的联系和区别。 • 参考配套实训手册的实训十五