java筆記——IO流練習1
阿新 • • 發佈:2019-02-12
重點說明:想要使用一個類的方法,必須瞭解它的方法有哪些,分別如何使用,有什麼用途。因此必須學會檢視Java API,這就相當於學漢字是需要查閱字典,如果單純的敲程式碼,而不知其義,就無法理解為何使用該方法。
目錄
IO練習1:
1.複製文字檔案
1)位元組流的四種方式
/*位元組流複製文字檔案一共4種方式*/ //方式一 /**基本位元組流一次讀寫一個位元組: * @throws IOException */ private static void method1() throws IOException { //1.建立基本位元組輸入流物件 FileInputStream fis=new FileInputStream("a.txt"); //2.建立基本位元組輸出流物件 FileOutputStream fos=new FileOutputStream("b.txt"); //3.開始複製 int by=0; while((by=fis.read())!=-1){ fos.write(by); } //4.釋放資源 fos.close(); fis.close(); } //方式二 /**基本位元組流一次讀寫一個位元組陣列 * @throws IOException */ private static void method2() throws IOException { //1.建立基本位元組輸入流物件 FileInputStream fis=new FileInputStream("a.txt"); //2.建立基本位元組輸出流物件 FileOutputStream fos=new FileOutputStream("b.txt"); //3.開始複製 byte[] bys=new byte[1024]; int len=0; while((len=fis.read(bys))!=-1){ fos.write(bys); } //4.釋放資源 fos.close(); fis.close(); } //方式三 /**高效位元組流一次讀寫一個位元組 * @throws IOException */ private static void method3() throws IOException { //1.建立基本位元組輸入流物件 BufferedInputStream bis=new BufferedInputStream(new FileInputStream("a.txt")); //2.建立基本位元組輸出流物件 BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("Cb.txt")); //3.開始複製 int by=0; while((by=bis.read())!=-1){ bos.write(by); } //4.釋放資源 bos.close(); bis.close(); } //方式四 /**高效位元組流一次讀寫一個位元組陣列 * @throws IOException */ private static void method4() throws IOException { //1.建立基本位元組輸入流物件 BufferedInputStream bis=new BufferedInputStream(new FileInputStream("a.txt")); //2.建立基本位元組輸出流物件 BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("b.txt")); //3.開始複製 byte[] bys=new byte[1024]; int len=0; while((len=bis.read(bys))!=-1){ bos.write(bys); } //4.釋放資源 bos.close(); bis.close(); }
2)字元流的5種方式
// 基本字元流,一次讀取一個字元 private static void method1(String srcPath, String desPath) throws IOException { FileReader fr = new FileReader(srcPath); FileWriter fw = new FileWriter(desPath); int ch = 0; while ((ch = fr.read()) != -1) { fw.write(ch); } fr.close(); fw.close(); } // 基本字元流,一次讀取一個字元陣列 private static void method2(String srcPath, String desPath) throws IOException { FileReader fr = new FileReader(srcPath); FileWriter fw = new FileWriter(desPath); char[] chs = new char[1024]; int len = 0; while ((len = fr.read(chs)) != -1) { fw.write(chs, 0, len); } fr.close(); fw.close(); } // 高效流,一次讀取一個字元 private static void method3(String srcPath, String desPath) throws IOException { BufferedReader br = new BufferedReader(new FileReader(srcPath)); BufferedWriter bw = new BufferedWriter(new FileWriter(desPath)); int ch = 0; while ((ch = br.read()) != -1) { bw.write(ch); bw.flush(); } br.close(); bw.close(); } // 高效流,一次讀取一個字元陣列 private static void method4(String srcPath, String desPath) throws IOException { BufferedReader br = new BufferedReader(new FileReader(srcPath)); BufferedWriter bw = new BufferedWriter(new FileWriter(desPath)); char[] chs = new char[1024]; int len = 0; while ((len = br.read(chs)) != -1) { bw.write(chs, 0, len); bw.flush(); } br.close(); bw.close(); } // 高效流,一次讀取一行 private static void method5(String srcPath, String desPath) throws IOException { BufferedReader br = new BufferedReader(new FileReader(srcPath)); BufferedWriter bw = new BufferedWriter(new FileWriter(desPath)); String line=null; while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); bw.flush(); } br.close(); bw.close(); } }
2.複製圖片
/*類似於文字複製,使用位元組流*/
3.把ArrayList集合中的字串資料儲存到文字檔案
public class ArrayListToFileDemo { public static void main(String[] args) throws IOException { // 建立ArrayList結合物件 ArrayList<String> array = new ArrayList<String>(); // 新增集合元素 array.add("hello"); array.add("world"); array.add("java"); // 封裝目的地 BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt")); // 遍歷集合,並把每一個元素寫入文字檔案 for (String s : array) { // 寫資料 bw.write(s); // newLine() 寫一行行分隔符。 bw.newLine(); // flush() 重新整理流。 bw.flush(); } //釋放資源 bw.close(); } }
4.從文字檔案中讀取資料(每一行為一個字串資料)到集合中,並遍歷集合
public class FileToArrayListDemo {
public static void main(String[] args) throws IOException {
//封裝資料來源
BufferedReader br=new BufferedReader(new FileReader("a.txt"));
//建立集合物件
ArrayList<String> array = new ArrayList<String>();
//讀取文字檔案,每讀取一行(每一行就是一個字串資料),就新增到集合中
String line=null;
//readLine(),讀取一行,如果已達到流的末尾,則為null
while((line=br.readLine())!=null){
array.add(line);
}
//釋放資源
br.close();
/*//可以遍歷集合,檢視是否成功
for(String s:array){
System.out.println(s);
}*/
}
}
5.複製單極資料夾
/*
* 需求:複製單級資料夾:
* 資料來源:e:\\demo
* 目的地:e:\\test
*
* 分析:
* A:封裝目錄
* B:獲取該目錄下所有文字的File陣列
* C:遍歷該File陣列,得到每一個File物件
* D:把該File進行復制
* */
public class CopyFolderDemo {
public static void main(String[] args) throws IOException {
//封裝目錄
File srcFolder=new File("e:\\demo");
File destFolder=new File("e:\\test");
//如果目的資料夾不存在就建立
if(!destFolder.exists()){
destFolder.mkdir();
}
//獲取該目錄下所有文字的File陣列
File[] fileArray = srcFolder.listFiles();
//遍歷該File陣列,得到每一個File物件
for(File file:fileArray){
String name = file.getName();
File newFile = new File(destFolder,name);
copyFile(file,newFile);
}
}
private static void copyFile(File file, File newFile) throws IOException {
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(newFile));
byte[] bys=new byte[1024];
int len=0;
while((len=bis.read(bys))!=-1){
bos.write(bys, 0, len);
}
bis.close();
bos.close();
}
}
6.複製單極資料夾中指定檔案並修改檔名稱
public class CopyFolderDemo {
public static void main(String[] args) throws IOException {
// 封裝資料來源
File srcFolder = new File("e:\\java");
// 封裝目的地
File destFolder = new File("e:\\jad");
// 獲取該目錄下java檔案的File陣列
File[] fileArray = srcFolder.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir, name).isFile() && name.endsWith(".java");
}
});
// 遍歷該File陣列,獲取每一個File物件
for (File file : fileArray) {
// 資料來源:e:\java\DataTypeDemo.java
// 目的地:e:\\jad\DataTypeDemo.java
String name = file.getName();
File newFile=new File(destFolder,name);
copyFile(file, newFile);//這一步主要是把內容複製過來
}
//在目的地目錄下改名
File[] destFileArray = destFolder.listFiles();
for(File destFile:destFileArray){
String name = destFile.getName();
String newName = name.replace(".java", ".jad");
File newFile=new File(destFolder,newName);
destFile.renameTo(newFile);
}
}
private static void copyFile(File file, File newFile) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
file));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(newFile));
byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}
bos.close();
bis.close();
}
}
7複製多極資料夾
/*
* 需求:複製多級資料夾
* 資料來源:E:\JavaSE\day21\code\demos
* 目的地:E:\\
*
* 分析:
* 1.封裝資料來源File
* 2.封裝目的地File
* 3.判斷該資料夾是檔案還是資料夾
* a:是資料夾
* 就在目的地目錄下建立該資料夾
* 獲取該File物件下所有檔案或資料夾File物件
* 遍歷得到每一個File物件
* 回到3
* b:是檔案
* 就複製(位元組流)
* */
public class CopyFoldersDemo {
public static void main(String[] args) throws IOException {
// 封裝資料來源File
File srcFile = new File("E:\\JavaSE\\day21\\code\\demos");
// 封裝目的地File
File destFile = new File("E:\\");
// 複製資料夾的功能
copyFolder(srcFile, destFile);
}
private static void copyFolder(File srcFile, File destFile) throws IOException {
// 判斷該File是檔案還是資料夾
if (srcFile.isDirectory()) {
// 如果是資料夾,就在目的地目錄下建立該資料夾
File newFolder = new File(destFile, srcFile.getName());
newFolder.mkdir();
// 然後獲取該資料夾下的所有檔案或資料夾File物件
File[] fileArray = srcFile.listFiles();
for (File file : fileArray) {
// 遞迴判斷
copyFolder(file, newFolder);
}
} else {
// 如果是檔案,就直接複製到該目錄下
File newFile = new File(destFile, srcFile.getName());
copyFile(srcFile, newFile);
}
}
private static void copyFile(File srcFile, File newFile) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
srcFile));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(newFile));
byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}
bos.close();
bis.close();
}
}