将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()容器接收,因为最后还是要返回字符串。
618

被折叠的 条评论
为什么被折叠?



