Java:IO流,復(fù)制圖片或視頻等,字節(jié)流,輸入,剪切文件,復(fù)制,測試效率【詩書畫唱】

字節(jié)流可以讀取任何類型的文件,因此也可以讀取文本類型的文件
自己出題,自己深入了解和理解思考是一種很好的學(xué)習(xí)方法。
復(fù)制刪除(剪切)圖片,設(shè)置每次讀取字節(jié)長度為100,求出共讀取的字節(jié)總長度,求出復(fù)制所用的時間

package IO;
?
import java.io.*;
public class lizi4 {
?
public static void main(String[] args)? throws Exception{
File weJianLuJing=new File("D://集成開發(fā)工具/7.jpg");
//用FileInputStream聲明讀取的字節(jié)流:
FileInputStream shuRuLiu=new FileInputStream(weJianLuJing);
//用FileOutputStream聲明寫入的字節(jié)流:
//用XXX getName()得到XXX的名字,這里當(dāng)作相對路徑,這樣的話,
//XXX就會復(fù)制到相對路徑
FileOutputStream shuChuLiu=
new FileOutputStream(weJianLuJing . getName());
long startTime=System. currentTimeMillis() ;
//用字節(jié)數(shù)組byte[]當(dāng)作容器
byte[] ziJieShuZu=new byte [100];
// 這里的100表示每次讀取的字節(jié)的長度
int xiaBiaoLength;
// xiaBiaoLength:下標(biāo)的長度,就是數(shù)組長度
int ziJieZongChangDu=0;
int count=0;
while((xiaBiaoLength=shuRuLiu.read(ziJieShuZu))!=-1){
System. out . println("這次讀取的字節(jié)長度:"+xiaBiaoLength);
count++;
ziJieZongChangDu=ziJieZongChangDu+xiaBiaoLength;
// 下面會寫出下標(biāo)0到xiaBiaoLength-1(含頭含尾)的字節(jié)
shuChuLiu.write(ziJieShuZu,0,xiaBiaoLength) ;
shuChuLiu. flush();
}
System. out . println("讀取的文件的字節(jié)總長度:"
+ziJieZongChangDu);
System. out . println("讀取文件的次數(shù):"
+count+"次");
long endTime=System. currentTimeMillis();
System. out . println("復(fù)制花費的時間為"
+(endTime-startTime)+"毫秒");
shuChuLiu. close();shuRuLiu.close();
weJianLuJing .delete();
//讀的同時要進(jìn)行寫入。
}
// newFileLuJing:新的文件路徑
// oldFileLuJing:舊的文件路徑
//public static void fuZhiFangFa(String oldFileLuJing , String
// newFileLuJing)throws Exception{
// File oldWenJian=new File(oldFileLuJing);
// if(oldWenJian.exists()){
//// wenJianDuQuDaoDeNeiRong:
//// 文件讀取到的內(nèi)容
// FileReader wenJianDuQuDaoDeNeiRong=new FileReader(oldWenJian);
// String wenJianName=oldWenJian . getName();
// File NewWenjian=new File (newFileLuJing, wenJianName) ;
//// wenJianXieLuDeNeiRong:文件寫入的內(nèi)容
// FileWriter wenJianXieLuDeNeiRong
// =new FileWriter(NewWenjian);
// char[] ziJieShuZu=new char[30];
// int ziJieShuZuLength;
// while((ziJieShuZuLength=
//wenJianDuQuDaoDeNeiRong .read(ziJieShuZu))!=-1){
//wenJianXieLuDeNeiRong .?
//write(new String(ziJieShuZu,0,ziJieShuZuLength));
//wenJianXieLuDeNeiRong. flush();}
//wenJianXieLuDeNeiRong. close();
//wenJianDuQuDaoDeNeiRong.close();
// }else{
// System. out. println("文件不存在");
// }
// }
}




案例1:使用字節(jié)流讀取文本文件后打印到控制
臺

package IO;
import java.io.*;
import java.sql.*;
import java.util.Scanner;
public class one {
public static void main(String[] args) throws Exception {
// duQu:讀取
FileReader duQu=new FileReader("xiangDui.txt");
char [] shuZu=new char[10];
int xiaBiao;
while((xiaBiao=duQu.read(shuZu))!=-1){
System.out.print(new String(shuZu,0,xiaBiao));
}
duQu.close();
}
}



案例2:提示用戶輸入一句話,在項目根目錄建
立文本文件aa.txt,將用戶輸入的這句話打印到
aa.txt中

//在項目的相對路徑下新建一個txt文件,內(nèi)容為你對IO流字符流的總結(jié),
//使用IO流讀取該文件的內(nèi)容顯示在控制臺
package IO;
import java.io.*;
import java.sql.*;
import java.util.Scanner;
public class two {
public static void main(String[] args)throws Exception {
File wenjian=new File("src//aa.txt");
wenjian.createNewFile();
System. out . println("創(chuàng)建文件成功!");
Scanner s=new Scanner(System. in);
System. out . println("請輸入一句話");
String? neiRong=s.next() ;
FileWriter xieRu=new FileWriter(wenjian);
xieRu.write(neiRong);
xieRu.flush();
xieRu.close();
System. out . println("輸入內(nèi)容到文件,在文件中打印輸入的內(nèi)容成功");
}
}



案例3:使用字節(jié)流復(fù)制一張圖片到項目根目錄

package IO;
?
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class three {
?
public static void main(String[] args)? throws Exception{
System.out.println("開始復(fù)制...");
copyFangFa("不感興趣偵探動漫OP.gif","Copy不感興趣偵探動漫OP.gif");
System.out.println("復(fù)制成功!");
}
private static void copyFangFa(String yuanLaiWenJian
,String fuZhiWenJian) throws Exception{
File srcFile = new File(yuanLaiWenJian);
File targetFile = new File(fuZhiWenJian);
InputStream shuRuLiu =? null;
OutputStream shuChuLiu = null;
shuRuLiu = new FileInputStream(srcFile);
shuChuLiu = new FileOutputStream(targetFile);
byte[] byteShuZu = new byte[1024];
// xiaBiaoEnd:下標(biāo)的結(jié)尾
int xiaBiaoEnd = -1;
// 下面的代碼的意思是:當(dāng)沒!=-1的時候就一直循環(huán)查詢,當(dāng)查詢
// 到下標(biāo)末尾-1時,表明已經(jīng)都從頭到尾查找完了
// shuRuLiu.read(byteShuZu)也是在讀取內(nèi)容數(shù)值下標(biāo),
// 這里是int類型的字節(jié)
// 數(shù)組的下標(biāo)
while((xiaBiaoEnd = shuRuLiu.read(byteShuZu))!=-1) {
shuChuLiu.write(byteShuZu,0,xiaBiaoEnd);
}
if(shuRuLiu != null){ shuRuLiu.close();}
if(shuChuLiu != null) {shuChuLiu.close();}
}?
}
?



案例4:使用字節(jié)流剪切一個文件

package IO;
?
import java.io.*;
public class lizi4 {
?
public static void main(String[] args)? throws Exception{
File weJianLuJing=new File("D://集成開發(fā)工具/7.jpg");
//用FileInputStream聲明讀取的字節(jié)流:
FileInputStream shuRuLiu=new FileInputStream(weJianLuJing);
//用FileOutputStream聲明寫入的字節(jié)流:
//用XXX getName()得到XXX的名字,這里當(dāng)作相對路徑,這樣的話,
//XXX就會復(fù)制到相對路徑
FileOutputStream shuChuLiu=
new FileOutputStream(weJianLuJing . getName());
//用字節(jié)數(shù)組byte[]當(dāng)作容器
byte[] ziJieShuZu=new byte [1000];
int xiaBiaoLength;
// xiaBiaoLength:下標(biāo)的長度,就是數(shù)組長度
int index=0;
while((xiaBiaoLength=shuRuLiu.read(ziJieShuZu))!=-1){
// 下面會寫出下標(biāo)0到xiaBiaoLength-1(含頭含尾)的字節(jié)
shuChuLiu.write(ziJieShuZu,0,xiaBiaoLength) ;
shuChuLiu. flush();}
shuChuLiu. close();shuRuLiu.close();
weJianLuJing .delete();
//讀的同時要進(jìn)行寫入。
}
// newFileLuJing:新的文件路徑
// oldFileLuJing:舊的文件路徑
public static void fuZhiFangFa(String oldFileLuJing , String
newFileLuJing)throws Exception{
File oldWenJian=new File(oldFileLuJing);
if(oldWenJian.exists()){
// wenJianDuQuDaoDeNeiRong:
// 文件讀取到的內(nèi)容
FileReader wenJianDuQuDaoDeNeiRong=new FileReader(oldWenJian);
String wenJianName=oldWenJian . getName();
File NewWenjian=new File (newFileLuJing, wenJianName) ;
// wenJianXieLuDeNeiRong:文件寫入的內(nèi)容
FileWriter wenJianXieLuDeNeiRong
=new FileWriter(NewWenjian);
char[] ziJieShuZu=new char[30];
int ziJieShuZuLength;
while((ziJieShuZuLength=
wenJianDuQuDaoDeNeiRong .read(ziJieShuZu))!=-1){
wenJianXieLuDeNeiRong .?
write(new String(ziJieShuZu,0,ziJieShuZuLength));
wenJianXieLuDeNeiRong. flush();}
wenJianXieLuDeNeiRong. close();
wenJianDuQuDaoDeNeiRong.close();
}else{
System. out. println("文件不存在");
}
}
}

執(zhí)行前:

執(zhí)行后:


案例5.字節(jié)流復(fù)制一個文件夾(測試效率,就是求運行的時間)


package IO;
import java.io.*;
public class liZi5 {
public static void main(String[] args) throws Exception{
long startTime=System. currentTimeMillis() ;
copyFangFa(new File("D://集成開發(fā)工具/NewFile"),
new File("D://集成開發(fā)工具/NewFileCopy99"));
long endTime=System. currentTimeMillis();
System. out . println("復(fù)制花費的時間為"+(endTime-startTime));
}
//copyFangFa:復(fù)制文件夾的方法
public static void copyFangFa
(File oldWenJianJia, File CopyOldWenJianJia)throws Exception{
// 思路:
//1.寫一個復(fù)制文件夾的方法,兩個參數(shù),1個參數(shù)是你要復(fù)制的文件夾的原位置
//第二個參數(shù)是你要復(fù)制到的位置
//2.判斷原位置是不是存在,如果存在就獲取文件夾里的所有的文件
//3.獲取到所有的文件后得到的是一個文件的數(shù)組,遍歷這個數(shù)組
//判斷每個文件是文件夾還是文件,如果是文件夾,就重新調(diào)用這個方法
//進(jìn)行遞歸,直到文件的子目錄,如果是文件的話,讀取該文件的信息
//寫入到新文件夾里
CopyOldWenJianJia . mkdir();//創(chuàng)建文件夾
if(!oldWenJianJia. isHidden()){
if(oldWenJianJia.exists()){
File[] FileShuZu=oldWenJianJia. listFiles();
for(File FileShuZuXiaBiao:FileShuZu){
// FileShuZuXiaBiao:文件數(shù)組下標(biāo)
if(FileShuZuXiaBiao.isFile()){
FileInputStream fis=new?
FileInputStream(FileShuZuXiaBiao.getAbsolutePath() );
FileOutputStream fos=new FileOutputStream
(new File(CopyOldWenJianJia.getAbsolutePath(),
FileShuZuXiaBiao.getName() ));
//--long startTime=System. currentTimeMillis() ;
byte[] bs=new byte [1];
int len;
while((len=fis.read(bs))!=-1){
fos. write(bs, 0,len);
fos. flush();}
//currentTimeMillis:當(dāng)前時間轉(zhuǎn)化的總毫秒數(shù)
//--long endTime=System. currentTimeMillis();
fos. close();
fis. close();
//--System. out . println("復(fù)制花費的時間為"+(endTime-startTime));
//flush()用于清理緩存
//close()用于關(guān)閉緩存
}
else{
copyFangFa(FileShuZuXiaBiao,?
new File( CopyOldWenJianJia
+" /"+FileShuZuXiaBiao. getName()));
}
}
}}
}
}




