Java学习笔记(六、输入和输出流)

9.1 字节流和字符流
    对java语言而言,输入/输出包括:对外设通道的输入/输出、对文件的读写、对网络数据的读和写。java语言采用流的机制实现输入和输出。流是一种有方向的字节/字符数据序列。
9.1.1 File对象
    File对象对应一个目录或文件,只用来命名文件、查询文件属性和处理目录,不提供读写文件操作。
9.1.2 流对象
    java程序的输入和输出流成为流对象,文件读写的主要操作包括:建立流对象、读数据、写数据和关闭流。输入输出流由文件名或File对象创建。
    根据输入输出数据的类型是字节还是字符,java.io提供两种基本抽象类:一种用于读写字节,另一种用于读写字符。
    字节流用于读写二进制数据,比如图像和声音文件等。字节流数据是8位的,由InputStream类和OutputStream类为字节流提供API和部分实现。字节流读和写操作由FileInputStream类和FileOutputStream类提供支持。它们分别是InputStream类和OutputStream类的子类。
    字符流数据是16为的Unicode字符,字符流能处理Unicode字符集中的任何字符,由Reader类和Writer类为字符流提供API和部分实现。读和写操作由FileReader类和FileWriter类提供支持。它们分别是Reader类和Writer类的子类。
例如:一个文件复制的应用程序。

  1. import java.io.*;
  2. class Example{
  3. public static void main(String args[])
  4.     File inputFile = new File("file1.txt");
  5.     File outputFile = new File("file2.txt");
  6.     int ch;
  7.     try{
  8.             FileReader in =new FileReader(inputFile);
  9.             FileWriter out = new FileWriter(outputFile);
  10.             System.out.println("文件复制程序开始工作:");
  11.             while((ch=in.read())!=-1){
  12.             out.write(ch);
  13.     }
  14.     in.close();
  15.     out.close();
  16.     System.out.println("文件复制程序工作结束");
  17.     }catch(FileNotException e1){
  18.         System.out.println("文件没有找到!");
  19.     }catch(IOException e1){
  20.         System.out.println("File read Error");
  21.     }
  22. }
  23. 9.2缓冲式输入输出
        当程序处理的文件按行组织,并且行不是定长时,用前面所述的流类实现很不方便。程序如果要按行输入输出,需采用缓冲式输入输出方式。
    9.2.1 缓冲式输入
        采用缓冲式输入时,对于程序的输入请求,系统一次性输入足够多的内容放在内存缓冲区中,供程序以后的输入请求使用,待缓冲区内容用完,再一次性输入做够多的数据。
        程序要采用缓冲式输入,只要先创建FileReader对象,再利用FileReader对象创建BufferedReader对象,习惯成为将FileReader对象接到BufferedReader对象上。如:
    file=new FileReader("abc.txt");
    in = new BufferedReader(file);
    这样,就可以对BufferedReader对象in使用readLine方法。
    9.2.2 缓冲式输出
        程序只要先创建FileWriter对象,再利用FileWriter对象创建BufferedWriter对象。如果想立即写入到文件,则需调用flush方法。
    9.3 随即访问
        流在某些应用中,不希望顺序读写流。例如,跳过部分不需要的数据,去读更后面的数据;或者,对早先读过的数据要重新读入等。这样的应用需要采用随机访问方式。
        文件随机访问可利用RadomAccessFile类实现,由这个类创建的流既可以随机输出,也可以随机输入。
    例如,下面的程序把若干long型整数写到一个名为longData。dat文件中,然后按相反顺序读出这些写入的整数。

    1. import java.io.*;
    2. public class Example{
    3. public static void main(String args[]){
    4.     RadomAccessFile inOut=null;
    5.     long data[]={151,278,235,206,-170,32,43,21,83,47};
    6.     try{
    7.              inOut=new RadomAccessFile("longData.dat","rw");
    8.              for(int i=0;i<data.length;i++){
    9.               inOut.writeLong(data[i]);
    10.      }
    11.      for(int i=data.length-1;i>=0;i--){
    12.       inOut.seek(i*8);//long型数据占8个字节,第i个整数自i*8字节开始
    13.       System.out.println("  "+inOut.readLong()+((i==0)?"/n":","));
    14.      }
    15.      inOut.close();
    16.     }catch(FileNotFoundExceptino e1){
    17.          System.out.println("file not found");
    18.     }catch(IOException e2){
    19.          System.out.println("file read/write error");
    20.     }
    21. }
    22. }

     

    9.4文件对话框
        可以使用javax.swing包中的类JFileChooser实现打开和保存文件对话框。
    1、JFileChooser类的构造方法
    (1)JFileChooser(),建立一个JFileChooser对象,默认的文件对话框路径是用户的Home目录。
    (2)JFileChooser(String currentDircetoryPath),建立一个JFileChooser对象,并设置文件对话框的打开路径。
    2、其他常用方法
    (1)showOpenDialog(),打开文件对话框
    (2)showSaveDialog(),保存文件对话框
    3、设置筛选条件
        使用FileFilter类,该类预设两个方法,accept(File f),getDescription()。当目录中的文件与筛选条件相符时,accept方法返回true,并将此文件名显示在对话框中。而getDescription方法则是对筛选条件的描述,由程序指定,例如“*.java”等。
        由于FileFilter类是一个抽象类,需要继承这个类,编写一个实现类,实现上述两个方法。然后,就可以使用JFileChooser类的addChooseFileFilter方法,或者是SetFileFilter方法设置筛选条件。
    1. class MyFileFilter extends FileFilter{
    2.     string ext;
    3.     MyFileFilter(String t){
    4.      ext=t;
    5.     }
    6.     public boolean accept(File file){
    7.         if(file.isDirectory()) return true;
    8.         String fn=file.getName();
    9.         int index=fn.lastIndexOf('.');
    10.         if(index>0&&index<fn.length()-1){
    11.             String extension=fn.substring(index+1).toLowerCase();
    12.         if(extension.equals(ext)) return true;
    13.         }
    14.     return false;
    15.     }
    16.     public String getDescription(){
    17.         if(ext.equals("java")){
    18.              return "java Source File(*.java)";
    19.         }
    20.     if(ext.equals("txt")){
    21.      return "Txt File(*.txt)";
    22.     }
    23.     }
    24. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值