A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 刘_鑫 中级黑马   /  2013-6-26 07:38  /  1388 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一概述
1.IO流用来处理设备之间的数据传输
2.Java对数据的操作是通过流的方式
3.Java用于操作流的对象都在IO包中
4.流按操作数据分为两种:字节流与字符流。
5.流按流向分为:输入流(Input),输出流(Output)。
二常用的基本类
字符流,用于操作字符,针对纯文本文件
  1.两个抽象基类:Writer 和 Reader,
  2.FileWriter 和 FileReader 其中提高了一些读写方法,可以单个字符读取写入也,也可以以数组的形式读取写入,
   由于流的操作涉及到系统资源,所以要处理异常,及关闭资源
  例如://数组读写
   public static void copy_1()
   { //穿件两个流对象变量
    FileWriter fw = null;
    FileReader fr = null;
    try
    { //关联需要读写的文件
     fw = new FileWriter("SystemDemo_copy.txt");
     fr = new FileReader("SystemDemo.java");
     //定义数组,接收读到数据
     char[] buf = new char[1024];

     int len = 0;
     while((len=fr.read(buf))!=-1)
     { //将数组中的数据写入流
      fw.write(buf,0,len);
     }
    }
    catch (IOException e)
    {
     throw new RuntimeException("读写失败");
    }
    finally
    {
     if(fr!=null)
      try
      { //关闭读取流
       fr.close();
      }
      catch (IOException e)
      {
      }
     if(fw!=null)
      try
      { //关闭写入流
       fw.close();
      }
      catch (IOException e)
      {
      }
    }
   }

   //字符读写
   public static void copy_1()throws IOException//异常抛出
   {
    //创建目的地。
    FileWriter fw = new FileWriter("RuntimeDemo_copy.txt");

    //与已有文件关联。
    FileReader fr = new FileReader("RuntimeDemo.java");
    //定义变量接收所读字符
    int ch = 0;

    while((ch=fr.read())!=-1)
    {
     fw.write(ch);
    }
   
    fw.close();
    fr.close();

   }
  注意事项:1.定义文件路径时,可以用“/”或者“\\”。
     2.在创建一个文件时,如果目录下有同名文件将被覆盖。在读取文件时,必须保证该文件已存在,否则出异常。
3.BufferedWriter 和 BufferedReader:为了提高了对数据的读写效率,出现了缓冲区.
  例如:
  import java.io.*;
   //导入IO包
  class  CopyTextByBuf
  {
   public static void main(String[] args)
   { //创建字符流缓冲区对象
    BufferedReader bufr = null;
    BufferedWriter bufw = null;
    try
    { //关联要操作文件
     bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java"));
     bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));
     //定义字符串变量
     String line = null;
     while((line=bufr.readLine())!=null)
     { //读写都是以行 为单位.
      bufw.write(line);
      bufw.newLine();//每读写一行,则换行,否则格式错换
      bufw.flush();//即使刷新缓冲区,保存数据
     }
    }
    catch (IOException e)
    {
     throw new RuntimeException("读写失败");
    }
    finally
    { //关闭资源
     try
     {
      if(bufr!=null)
       bufr.close();
     }
     catch (IOException e)
     {
      throw new RuntimeException("读取关闭失败");
     }
     try
     {
      if(bufw!=null)
       bufw.close();
     }
     catch (IOException e)
     {
      throw new RuntimeException("写入关闭失败");
     }
    }
   }
  }

字节流
  1.两个抽象基类:OutputStream 和 InputStream
  2.FileOutputStream 和 FileInputStream 其中提高了一些读写方法,可以单个字节读取写入也,也可以以字节数组数组的  形式读取写入,由于流的操作涉及到系统资源,所以要处理异常,及关闭资源
   其中所涉及的方法和字符流基本一致,主要用于非文本文件的操作,比如mp3.图片等.
  3.BufferedOutputStream 和 BufferedInputStream:为了提高了对数据的读写效率,出现了缓冲区.
*** 与字符流的区别:用法上基本相同,不过字节流操作以字节为单位,通过字节读写或着是字节数组读写.各有个的所需,所以         再选择用哪种流时,只要明确我们所要操作的数据类型即可.

三File类
1.该是将文件或者文件夹封装成对象,以便对其属性进行操作,并且该类可以和流结合.
2.构造方法
  a.File f = new File("a.txt");//直接封装文件的相对路径
  b.File f = new File("C:\\abc\\a.txt");//封装文件的绝对路径
  c.File dir = new File("c:\\abc");//封装文件夹
    File f = new File(dir,"a.txt");//通过文件夹和文件名来构造文件
3.常见成员方法
  创建:
   createNewFile()//创建文件,文件不存在时,返回true,存在也返回false.注意区分:创建对象的时候,并没有创建文件
   makedir()//创建文件夹(单级)
   makedirs()//创建多级文件夹
  删除:
   delete()//删除文件或空文件夹
   deleteOnExit()//在虚拟机退出时删除
  判断:
   canExcute()//判断能否执行
   canRead()//是否为可读
   canWrite()//是否为可写
   compareTo()//比较文件或文件夹的名字
   exists()//判断是否存在
   isDirectory()//判断存在的文件是否为文件夹
   isFile()//判断存在的文件是否为文件
  获取:
   getName() //获取对象名称
   getPath()//获取对象封装的路径
   getAbsolutePath()//获取对象的绝对路径
   getParent()//获取对象父目录
   lastModified()//获取文件最后一次修改的时间
   length()//获取文件的大小
  特殊方法renameTo()//把该对象的名字改成参数
   当2个对象路径相同时.只改名字,但当路径不同时,相当于剪切并重命名.
  综合应用:将某目录下的所有.avi文件复制到指定目录下:
  import java.io.BufferedInputStream;
  import java.io.BufferedOutputStream;
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.FileOutputStream;
  import java.io.IOException;
  
  public class CopyTest {

   public static void main(String[] args) {
    File f = new File("E:\\Java\\各类视频\\张孝祥JAVA高新技术");
    String str =".avi";
    String str1="E:\\Java\\各类视频\\高薪技术\\";
    getDocuments(f,str,str1);
   }//将f文件下的str文件复制到指定目录str1下
   public static void getDocuments(File f,String str,String str1){
    File[] files = f.listFiles();
    for (int i = 0; i < files.length; i++) {
     if (files[i].isDirectory()) {
      getDocuments(files[i],str,str1);
     }//此处为递归思想,简单将,就是当条件满足一定时,方法不断的重复调用本身
     else{
      if (files[i].getName().endsWith(str)) {
       copyMethod_2(files[i].getAbsolutePath(), str1+files[i].getName());
      }
      
     }
    }
   }
   // 定义一个复制方法,通过字节流,并用到缓冲区提高效率,针对非纯文本文件,,参数为源文件和复制文件的绝对路径
   public static void copyMethod_2(String source, String copy) {
    // 定义缓冲字符读取流对象,初始化为空
    BufferedInputStream bis = null;
    // 定义缓冲字符写入流对象,初始化为空
    BufferedOutputStream bos = null;
    // 涉及操作系统资源,会出现异常,所以要处理
    try {
     // 将读取流和文件关联
     bis = new BufferedInputStream(new FileInputStream(source));
     // 创建要写入的目的,即数据存储位置.
     bos = new BufferedOutputStream(new FileOutputStream(copy));
     // 定义数组,用于接收读取到数据
     byte[] bt = new byte[1024];
     // 定义变量,记录读取的字节数
     int len = 0;
     // 通过循环,不断的读写完成复制
     while ((len = bis.read(bt)) != -1) {
      // 将数组中的有效字节写入到文件中
      bos.write(bt, 0, len);
     }
    } catch (IOException e) {
     throw new RuntimeException("文件读写失败");
    }
    // 关闭流资源
    finally {
     // 操作涉及到系统资源,会抛IOException异常,所以要处理
     try {
      if (bis != null)
       bis.close();// 关闭输入流
     } catch (IOException e) {
      throw new RuntimeException("读取流关闭失败");
     }
     try {
      if (bos != null)
       bos.close();// 关闭输出流
     } catch (IOException e) {
      throw new RuntimeException("写入流关闭失败");
     }
    }
   }
  }


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马