黑马程序员_日记02(IO)

来源:互联网 发布:吐槽大会 知乎 编辑:程序博客网 时间:2024/05/16 17:05

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

字节流:InputStream,OutputStream
字符流:Reader,Writer
一:FileWriter和FileReader
FileWriter:
 1,
 //指定文件会被创建到指定的目录下,如果有重名的文件则会被覆盖
 //可以用FileWriter fw = new FileWriter("text.txt",true);则不覆盖原有文件,在文件结尾续写
 FileWriter fw = new FileWriter("test.txt");
 //写到内存中(既流中),
 fw.write("abc");
 //要用fw.fluse();刷新缓冲区,将数据写到目的地
 fw.fluse();
 2,IO异常处理
 public static void main(String args[]) {
  FileWriter fw = null;
  try {
   fw = new FileWriter("test.txt");
   fw.write("avd");
  } catch(IOException e) {
  
  } finally {
   try {
    if(fw != null)     //如果上面有异常,fw为null,会出现空指针异常
     fw.close();
   } catch(IOException e) {
   }
   
  }
 }
 
FileReader:
 1,
 //创建一个文件读取流对象,若文件不存在会发生异常
 FileReader fr = new FIleReader("test.txt");
 //读一个字符,读到流末尾返回-1
 char ch = fr.read();
 
 int ch = 0;
 while((ch=fr.read()) != -1) {
  System.out.println((char)ch);
 }
 //读取一个字符数组
 //通常数组的大小事1024的整数倍
 char[] buf = new char[1024];
 int num = 0;
 while((num = fr.fead(buf)) != -1) {
  System.out.print(new String(buf,0,num));
 }
 fr.close();
 
示例:将C盘的文本文件拷贝到D盘
 1,
 public void copy_1() throws IOException {
  FileWriter fw = new FileWriter("");
  FileReader fr = new FileReader("");
  int ch = 0;
  while((ch = fr.read()) != -1) {
   fw.writ(ch);
  }
  fw.close();
  fr.close();
 }
 疑问:这种方式会产生磁头在源地址与目的地址之间频繁的移动?
  fw.writ(ch)是将数据写入内存中的流中,等调用flush()或close()
  的时候才写入磁盘
  是fw.write()调用windows的底层资源还是fw.flush()?
 2,
 public void copy_2() {
  FileWriter fw = null;
  FileReader fr = null;
  try {
   fw = new FileWriter("");
   fr = new FIleReader("");
   char[] buf = new char[1024];
   int len = 0;
   while((len = fr.read(buf)) != -1) {
    fw.write(buf,0,len);
   }
  } catch(IOException e) {
   
  } finally {
   if(fw != null) {
    try {
     fw.close();
    } catch(IOException e) {
    }
   }
   if(fr != null) {
    try {
     fr.close();
    } catch(IOException e) {
    }
   }
  }
 }
二:字符流的缓冲区(为了提高流的读写效率):BufferedWriter,BufferReader
 创建缓冲区之前必须先有流对象
 BufferedWriter:
  BufferedWriter bw = new BufferedWriter(fw);
  bw.write("adsf");
  bw.flush();//使用缓冲区必须要使用flush()刷新
  bw.close();//关闭缓冲区就是关闭缓冲区中的流对象,所以不必有fw.close();
  //fw.close();
 BufferedReader:
  BufferedReader br = new BufferedReader(fr);
  String line = null;
  while((line = br.readLine()) != null) {
  
  }
  //readLine()返回值不包含任何行终止符
  
 创建自己的缓冲区:
  class MyBufferedReader extends Reader {
   private Reader r = null;
   public MyBufferedReader(Reader r) {
    this.r = r;
   }
   
   publci String MyReadLine() threws IOException {
    StringBuilder sb = new StringBuilder();
    int ch = 0;
    while((ch=fr.read())!=-1) {
     if(ch=='\r')
      continue;
     if(ch=='\n')
      return sb.toString();
     sb.append((char)ch);
    }
    if(sb.length()!=0)
     return sb.toString();
    return null;
   }
   //要覆盖父类的方法
   public int read(char[] cbuf, int off, int len) threws IOException {
    r.read(cbuf,off,len);
   }
   public void close() threws IOException {
    r.close();
   }
   
   public void MyClose() threws IOException {
    r.close();
   }
  }
 装饰设计模式:对已有对象进行功能增强,可以定义类,
  将已有对象传入(构造方法)基于已有的功能提供加强的功能。
  该类称为装饰类。
 装饰与继承的区别:F:\java图片\j2se\IO流\装饰与继承.png
 
 
三:字节流
 字节流不用刷新
 定义字节流的缓冲区
 public class MyBufferedInputStream {
 private InputStream in;
 private byte[] ch = new byte[1024];
 private int count = 0,pre = 0;
 private byte b;
 
 MyBufferedInputStream(InputStream in) {
  this.in = in;
 }
 
 public int MyRead() throws IOException {
  if(count ==0) {
   count = in.read(ch);
   pre = 0;
   if(count < 0 ) {
    return -1;
   }
   b = ch[pre];
   pre++;
   count--;
   return b&255;
  }
  else {
   b = ch[pre];
   pre++;
   count--;
   return b&255;
  }
 }
 
 public void MyClose() throws IOException {
  in.close();
 }
}

 
四:转换流
(InputStreamReader是字节流通向字符流的桥梁)
(OutPutStreamWriter是字符流通向字节流的桥梁)

 class TranStream{
  public static void main(String args[]) {
   //获取键盘录入对象
   InputStream in = System.in;
   //将字节流对象转换为字符流,使用转换流InputStreamReader
   InputStreamReader isr = new InputStreamReader(in);
   BufferedReader bufr = new BufferedReader(isr);
   //以上三句可以合并为下面一句
   BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
   
   //BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
   
   /*
   //BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
   BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("e:\\test\\01.txt")));
  
   BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
   //BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("e:\\test\\01.txt")));
   */
   
   String line = null;
   
   while((line = bufr.readLine() != null) {
    if("over".equals(line))
     break;
    System.out.println(line);
    /*
     bufw.write(line.toUpperCase());
     bufw.newLine();
     bufw.flush();
    */
   }
   bufr.close();
  }
 }
 
 转换流:字符和字节之间的桥梁,通常,涉及到字符编码转换时使用
五:流操作的基本规律
 1,明确源和目的
  源:输入流:InputStream  Reader
  目的:输出流:OutputStream Writer
 2,明确操作的数据是否是纯文本
  是:字符流
  不是:字节流
 3,再明确要使用哪个具体对象
  通过设备来区分:
  源设备:内存,硬盘,键盘
  目的设备:内存,硬盘,控制台
 4,是否需要提高效率(可以利用缓冲区技术提高效率)
六:File
 1,4个构造方法
 2,File类的常见方法
  创建:boolean createNewFile()
    boolean mkdir()
    boolean mkdirs()
  删除:boolean delete()/void deleteOnExit()在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
  判断: boolean exists()测试此抽象路径名表示的文件或目录是否存在。
     boolean isFile()
     boolean isDirectory()
  获取信息:getName()/getAbsolutePath()/getPath()/lastModified()
     getParent();返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
七:Properties
 是集合中和IO技术相结合的集合容器
 该对象可以用于键值对形式的配置文件
 
 
 

 

原创粉丝点击