java-File類-字節流
阿新 • • 發佈:2018-01-21
獲取 而是 結構 logs pen exc 文件的 weight 但是
一 File
1.1 遞歸子目錄
獲取所有子目錄中的內容
import java.io.File; public class GetAllFiles { /** * @param args */ public static void main(String[] args) { /* * File類的listFiles()列出當前目錄下文件以及文件夾。 * * 需求:能不能列出當前目錄下的子目錄中的所有內容。 思路: 1,在遍歷當前目錄時,會獲取到當前的所有的文件以及文件夾, * 2,要遍歷子目錄需要對獲取到的當前的file對象進行判斷,只有是目錄才可以作為子目錄進行繼續遍歷。*/ File dir = new File("E:\\test"); listAll(dir); } public static void listAll(File dir) {// dir:接收目錄以及子目錄。 System.out.println("dir:" + dir.getName()); File[] files = dir.listFiles(); for (File file : files) { if (file.isDirectory()) {//如果遍歷到當前的file對象是個目錄,繼續遍歷。 listAll(file); } else { System.out.println("file:"+file.getName()); } } } }
1.2 使用隊列遍歷
import java.io.File; import java.util.LinkedList; public class GetAllFileByQueue { /** * @param args*/ public static void main(String[] args) { /* * 遍歷文件夾,不用遞歸咋辦? * 思路: * 1,可以通過對每一個目錄進行for循環,但是目錄層級很多,for會死掉。 * 2,每遍歷到一個目錄,不對其進行遍歷,而是先臨時存儲起來。 相當於把所有目錄(無論同級不同級)都存儲起來。 * 3,遍歷容器時取到就是目錄,然後對目錄遍歷即可。 4,從容器中取到目錄遍歷時發現內部還有目錄,一樣將這些目錄存儲到容器中。 * 5,只要不斷的遍歷這個容器就哦了。 * * 通過圖解:發現這個容器只要是一個簡單的隊列就可以解決這個問題。 */ File dir = new File("E:\\test"); System.out.println(dir.getName()); Queue<File> queue = new Queue<File>(); // 1,對dir進行當前目錄的遍歷。 File[] files = dir.listFiles(); for (File file : files) { // 2, 如果有子目錄,存儲到隊列中。 if (file.isDirectory()) { queue.myAdd(file); } else { System.out.println(file.getName()); } } System.out.println("---------------------"); //3,遍歷隊列容器。因為子目錄都在隊列中。 while(!queue.isNull()){ File subDir = queue.myGet();//從隊列中取出子目錄。 System.out.println(subDir.getName()); //4,遍歷子目錄。 File[] subFiles = subDir.listFiles(); for(File subFile : subFiles){ if(subFile.isDirectory()){//如果子目錄中還有子目錄,繼續存儲到隊列中。 queue.myAdd(subFile); }else{ System.out.println(subFile.getName()); } } } } } /** * 隊列結構。先進先出。 */ class Queue<E> { private LinkedList<E> link; /** * 提供了構造隊列對象的構造器。 */ public Queue() { link = new LinkedList<E>(); } /** * 添加元素的方法。 */ public void myAdd(E obj) { link.addFirst(obj); } /** * 獲取的方法。 */ public E myGet() { return link.removeLast(); } /** * 判斷隊列是否有元素。 */ public boolean isNull() { return link.isEmpty(); } }
1.3 文件數據寫入
public class FileOutputStreamDemo { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { //需求:將數據寫入到文件中。 //創建臨時目錄, File dir = new File("tempfile"); if(!dir.exists()){ dir.mkdir(); } //創建存儲數據的文件。 File file = new File(dir,"file.txt"); //創建一個用於操作文件的字節輸出流對象。一創建就必須明確數據存儲目的地。 //輸出流目的是文件,會自動創建。如果文件存在,則覆蓋。 FileOutputStream fos = new FileOutputStream(file); //調用父類中的write方法。 byte[] data = "abcde".getBytes(); fos.write(data); //關閉流資源。 fos.close(); } }
續寫&和換行
private static final String LINE_SEPARATOR = System.getProperty("line.separator"); /** * @param args * @throws FileNotFoundException */ public static void main(String[] args) throws Exception { //需求:將數據續寫到已有文件中。 //FileOutputStream(File file, boolean append) 續寫。 //在下一行寫入新的數據。 File file = new File("tempfile\\file.txt"); FileOutputStream fos = new FileOutputStream(file, true); String str = LINE_SEPARATOR+"itcast"; fos.write(str.getBytes()); fos.close(); }
1.4 異常處理
java-io流入門 這裏面有異常的結構圖
public class FileOutputStreamDemo3 { /** * @param args * @throws FileNotFoundException */ public static void main(String[] args) { File file = new File("k:\\file.txt"); FileOutputStream fos = null; try { fos = new FileOutputStream(file); fos.write("abcde".getBytes()); } catch (IOException e) { System.out.println(e.toString() + "----"); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { throw new RuntimeException(""); } } }
1.5 文件的讀
第一種
public static void main(String[] args) throws IOException { // 2,需求:讀取文件中的數據,顯示在屏幕上。 File file = new File("tempfile\\file.txt"); //創建一個字節輸入流對象,必須明確數據源,其實就是創建字節讀取流和數據源相關聯。 FileInputStream fis = new FileInputStream(file); //讀取數據。使用 read();一次讀一個字節。 int ch = 0; while((ch=fis.read())!=-1){ System.out.println("ch="+(char)ch); } // 關閉資源。 fis.close(); }
第二種
public static void main(String[] args) throws IOException { /* * 演示第二個讀取方法, read(byte[]); */ File file = new File("tempfile\\file.txt"); // 創建一個字節輸入流對象,必須明確數據源,其實就是創建字節讀取流和數據源相關聯。 FileInputStream fis = new FileInputStream(file); //創建一個字節數組。 byte[] buf = new byte[1024];//長度可以定義成1024的整數倍。 int len = 0; while((len=fis.read(buf))!=-1){ System.out.println(new String(buf,0,len)); } fis.close(); }
1.6 復制文件
第一種
public static void main(String[] args) throws IOException { /* * 練習:復制文件。 * 原理;讀取一個已有的數據,並將這些讀到的數據寫入到另一個文件中。 */ //1,明確源和目的。 File srcFile = new File("E:\\1.mp3"); File destFile = new File("E:\\copy_2.mp3"); //2,明確字節流 輸入流和源相關聯,輸出流和目的關聯。 FileInputStream fis = new FileInputStream(srcFile); FileOutputStream fos = new FileOutputStream(destFile); //3, 使用輸入流的讀取方法讀取字節,並將字節寫入到目的中。 int ch = 0; while((ch=fis.read())!=-1){ fos.write(ch); } //4,關閉資源。 fos.close(); fis.close(); }
圖解
第二種
public static void main(String[] args) throws IOException { File srcFile = new File("E:\\1.mp3"); File destFile = new File("E:\\copy_1.mp3"); // 2,明確字節流 輸入流和源相關聯,輸出流和目的關聯。 FileInputStream fis = new FileInputStream(srcFile); FileOutputStream fos = new FileOutputStream(destFile); // 3,定義一個緩沖區。 byte[] buf = new byte[1024]; int len = 0; while ((len = fis.read(buf)) != -1) { fos.write(buf, 0, len);// 將數組中的指定長度的數據寫入到輸出流中。 } // 4,關閉資源。 fos.close(); fis.close(); }
圖解
java-File類-字節流