IO流—03

 

将C盘一个文本文件复制到D盘

复制原理:将C盘下的文件数据存储到D盘的一个文件中

步骤:
1,在D盘创建一个文件,用于存储C盘文件中的数据
2,定义读取流和C盘文件关联
3,通过不断的读写完成数据存储
4,关闭资源
代码:
import java.io.*;
class CopyText
{
public static void main(String[] args)throws IOException
{
  copy_2();
}

public static void copy_2()
{
  FileReader fr = null;
  FileWriter fw = null;
 
  try
  {
    fr = new FileReader("C:\\SystemDemo.java");
    fw = new FileWriter("D:\\SystemDeno_copy.txt");
    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)
    {}
   }
  
  
  }
}

//从C盘读一个字符,就往D盘写一个字符,此效率较低
public static void copy_1()throws IOException
{
   //创建目的地
   FileWriter fw = new FileWriter("D:\\RuntimeDemo_copy2.txt");
  
   FileReader fr = new FileReader("C:\\RuntimeDemo.java");
  
   int num = 0;
  
   while((num=fr.read()) != -1)
   {
    fw.write(num);
   }
  
   fr.close();
   fw.close();
}
}


缓冲区的出现是为了提高流的操作效率而出现的
所以在创建缓冲区之前,必须要先有流对象
该缓冲区提供了一个跨平台的换行符:newLine();

代码:

import java.io.*;
class BufferedWriterDemo
{
public static void main(String[] args)throws IOException
{
  //创建一个字符写入流对象
  FileWriter fw = new FileWriter("buf.txt");
 
  //为了提高字符写入流效率,加入了缓冲技术
  //只要将需要将被提高效率的流对象作为参数传递给
  //缓冲区的构造函数即可
  BufferedWriter bufw = new BufferedWriter(fw);
 
  for(int x=0; x<5; x++)
  {
   bufw.write("abcdf"+x);
   bufw.newLine();//newLine()是跨平台的换行符
   bufw.flush();
  }
 
  //记住,只要用到缓冲技术,就要记得刷新
  bufw.flush();
 
  //其实关闭缓冲区,就是在关闭缓冲区中的流对象
  bufw.close();
 
}
}


字符读取流缓冲区
该缓冲区提供了一个一次读一行的方法readLine();方便于对文本数据的获取
当返回null时,表示读到文件末尾。
readLine方法返回的时候只返回回车符之前的数据内容,
并不返回回车符

import java.io.*;
class BufferedReaderDemo
{
public static void main(String[] args)throws IOException
{
  FileReader fr = new FileReader("buf.txt"); //创建字符流对象
  BufferedReader bufr = new BufferedReader(fr);//创建缓冲区对象,并把字符流对象传入缓冲区
 
  String str = null;
  while((str=bufr.readLine()) != null) //使用字符串接收,
  {
   System.out.println(str);
  }
  bufr.close();
}
}

明白了BufferedReader类中特有方法readLine的原理后,
可以自定义一个类中包含一个功能和readLine一致的方法
来模拟一下BufferedReader
代码:
import java.io.*;
class MyBufferedReader
{
private FileReader r;

  MyBufferedReader(FileReader r)
  {
   this.r = r;
  }
 
  //可以一次读一行数据的方法
public String myReaderLine()throws IOException
{
  //定义一个临时容器,原BufferedReader封装的是字符数组
  //为了演示方便,定义一个StringBuilder容器,因为最终还是
  //要将数据变成字符串
  StringBuilder sb = new StringBuilder();
  int ch = 0;
  while((ch=r.read()) != -1)
  {
   if(ch=='\r')
    continue;
   if(ch=='\n')
    return sb.toString();
   else
    sb.append((char)ch); //添加数据
  }
  if(sb.length()!=0)//缓冲区有数据
   return sb.toString();
  return null;
}
public void myClose()throws IOException
{
   r.close();
}
}
class MyBufferedReaderDemo
{
public static void main(String[] args)throws IOException
{
  FileReader fr = new FileReader("buf.txt");
  MyBufferedReader myBuf = new MyBufferedReader(fr); //使用自定义缓冲区
 
  String line = null;
  while((line=myBuf.myReaderLine())!=null) //使用自定义myReaderLine(),相当于readLine();
  {
   System.out.println(line);
  }
  myBuf.myClose(); //使用自定义myClose();相当于close();
}
}

 

个人总结:学会使用字符流复制文件,利用缓冲区提高效率,注意readLine()和newLine()的用法,使用缓

冲区要注意flush()刷新,可以用close()方法一步解决, 掌握bufferedReader()原理,并能用代码实现, 可以

定义一个Stringbuilder()容器接收,因为最后还是要返回字符串。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值