配色: 字号:
JAVA之旅(二十五)
2016-10-07 | 阅:  转:  |  分享 
  
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();

}

}

仔细看实现思路,静静的看,没错,我们也是可以实现的。

献花(0)
+1
(本文系网络学习天...首藏)