JAVA之旅(二十五)
一.文本复制
读写都说了,我们来看下其他的操作,我们首先来看复制
复制原理:其实就是将C盘下的文件数据存储到D盘的一个文件中
实现的步骤:
1.在D盘创建一个文件,用于存储文件中的数据
2.定义读取流和文件关联
3.通过不断的读写完成数据的存储
关闭资源
packagecom.lgl.hellojava;
importjava.io.FileReader;
importjava.io.FileWriter;
importjava.io.IOException;
publicclassHelloJJAVA{
publicstaticvoidmain(String[]args){
copy_1();
copy_2();
}
//从c盘读一个字符,就往D盘写一个字符
publicstaticvoidcopy_1(){
try{
//创建目的地
FileWriterfw=newFileWriter("copy_1.txt");
//与已有文件关联
FileReaderfr=newFileReader("copy_1.txt");
intch=0;
while((ch=fr.read())!=-1){
//读一个写一个
fw.write(ch);
}
fw.close();
fr.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
publicstaticvoidcopy_2(){
FileWriterfw=null;
FileReaderfr=null;
try{
fw=newFileWriter("copy_2.txt");
fr=newFileReader("copy_2.txt");
char[]buf=newchar[1024];
intlen=0;
while((len=fr.read(buf))!=-1){
fw.write(buf,0,len);
}
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
if(fr!=null){
try{
fr.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
if(fw!=null){
try{
fw.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
}
}
这里做了两种方式的拷贝方式,其实都是整理好思路,读和写的一个过程罢了!
二.字符流的缓冲区
字符流的缓冲区,提高了对数据的读写效率,他有两个子类
BufferedWriter
BufferedReader
缓冲区要结合柳才可以使用
在流的基础上对流的功能进行了增强
1.BufferedWriter
缓冲区的出现是提高流的效率而出现的,所以在创建缓冲区之前,必须先有流对象,我们看例子
packagecom.lgl.hellojava;
importjava.io.BufferedWriter;
importjava.io.FileWriter;
importjava.io.IOException;
publicclassHelloJJAVA{
publicstaticvoidmain(String[]args){
try{
//创建一个字符写入流对象
FileWriterfw=newFileWriter("buffer.txt");
//为了提高写入流的效率加入了缓冲技术
BufferedWriterbufw=newBufferedWriter(fw);
//写入数据
bufw.write("hello");
//换行
bufw.newLine();
//只要用到了缓冲区,就需要刷新
bufw.flush();
//缓冲区关闭的就是关联的流
bufw.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
使用都是比较基础的,大家也是可以看到
2.BufferedReader
高效读取
我们直接看代码
packagecom.lgl.hellojava;
importjava.io.BufferedReader;
importjava.io.FileNotFoundException;
importjava.io.FileReader;
importjava.io.IOException;
publicclassHelloJJAVA{
publicstaticvoidmain(String[]args){
try{
//创建一个读取流对象和文件相关联
FileReaderfr=newFileReader("buffer.txt");
//为了提高效率,加入缓冲技术
BufferedReaderbfr=newBufferedReader(fr);
Stringline=null;
while((line=bfr.readLine())!=null){
System.out.println(line);
}
bfr.close();
}catch(FileNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
这样就可以全部出来了
三.通过缓冲区复制文件
OK,我们还是复制文件这个问题,现在我们有缓冲区,我们要怎么样复制文件?
packagecom.lgl.hellojava;
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.FileNotFoundException;
importjava.io.FileReader;
importjava.io.FileWriter;
importjava.io.IOException;
publicclassHelloJJAVA{
publicstaticvoidmain(String[]args){
/
缓冲区文件复制
/
BufferedReaderbufr=null;
BufferedWriterbufw=null;
try{
bufr=newBufferedReader(newFileReader("buffer.txt"));
bufw=newBufferedWriter(newFileWriter("buffercopy.txt"));
Stringline=null;
while((line=bufr.readLine())!=null){
bufw.wwww.shanxiwang.netrite(line);
}
//关闭流
bufr.close();
bufw.close();
}catch(FileNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
这样,就可以复制文件了
四.readLine工作原理
我们注意到我们要使用这个方法readline,无论是读一行还是读多个字符,其实都是在硬盘上一个一个读取,所以最终使用的还是read方法一个读一个的方法
其实他内存中有一个数组,你读完之后并没有立马读,而是临时存储起来,这就是缓冲区,
当读到换行,才去返回一行数据,就这样一行一行的读取,这就是他的工作原理
五.自定义readLine
我们了解了readLine的工作原理,那我们就可以尝试去更改他了,自定义一个怎么样?我们尝试一下
packagecom.lgl.hellojava;
importjava.io.FileNotFoundException;
importjava.io.FileReader;
importjava.io.IOException;
publicclassHelloJJAVA{
publicstaticvoidmain(String[]args){
/
自定义readLine
/
FileReaderfr;
try{
fr=newFileReader("buffer.txt");
MyBufferReadermy=newMyBufferReader(fr);
Stringline=null;
while((line=my.myReadLine())!=null){
System.out.println(line);
}
}catch(FileNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
classMyBufferReader{
privateFileReaderfr;
publicMyBufferReader(FileReaderfr){
this.fr=fr;
}
//一次读取一行的方法
publicStringmyReadLine()throwsIOException{
//定义临时容器
StringBuildersb=newStringBuilder();
intch=0;
while((ch=fr.read())!=-1){
if(ch==''\r''){
continue;
}elseif(ch==''\n''){
returnsb.toString();
}else{
sb.append((char)ch);
}
}
if(sb.length()!=0){
returnsb.toString();
}
returnnull;
}
publicvoidclose()throwsIOException{
fr.close();
}
}
仔细看实现思路,静静的看,没错,我们也是可以实现的。
|
|