構造器 | 描述 |
---|---|
File(String pathname) | 由路徑名稱來建立 |
File(String parent, String child) | 由上層目錄路徑+文件名來建立 |
File(File parent, String child) | 由上層文件名+文件名來建立 |
File(URI uri) | 由uri來建立 |
路徑java
路徑分隔符面試
public static final String separator
,根據操做系統,動態的提供分隔符。File file1 = new File("d:\\atguigu\\info.txt"); File file2 = new File("d:" + File.separator + "atguigu" + File.separator + "info.txt"); File file3 = new File("d:/atguigu");
方法 | 描述 |
---|---|
getAbsolutePath() | 獲取絕對路徑 |
getPath() | 獲取路徑 |
getName() | 獲取名 |
getParent() | 獲取上層文件目錄路徑。若無,返回null |
length() | 獲取文件長度(即:字節數)。不能獲取目錄的長度。 |
lastModified() | 獲取最後一次的修改時間,毫秒值 |
下面兩個是針對目錄的 | |
public String[] list() | 獲取指定目錄下的全部文件或者文件目錄的名稱數組 |
public File[] listFiles() | 獲取指定目錄下的全部文件或者文件目錄的File數組 |
public boolean renameTo(File dest)
:把文件重命名爲指定的文件路徑。(實際上就是把file1的內容複製到file2,並把file1刪除)windows
對於 file1.renameTo(file2)
要求:file1存在,file2不存在數組
方法 | 描述 |
---|---|
isDirectory() | 判斷是不是文件目錄 |
isFile() | 判斷是不是文件 |
exists() | 判斷是否存在 |
canRead() | 判斷是否可讀 |
canWrite() | 判斷是否可寫 |
isHidden() | 判斷是否隱藏 |
方法 | 描述 | 注意事項 |
---|---|---|
public boolean createNewFile() | 建立文件 | 若文件存在,則不建立,返回false |
public boolean mkdir() | 建立文件目錄 | 若是此文件目錄存在,就不建立; 若是此文件目錄的上層目錄不存在,也不建立 |
public boolean mkdirs() | 建立文件目錄 | 若是上層文件目錄不存在,一併建立 |
public boolean delete() | 刪除文件或者文件夾 | Java中的刪除不走回收站 要刪除的文件目錄內不能包含文件或文件目錄 |
若是你建立文件或者 文件 目錄沒有寫盤符路徑 , 那麼 ,默認在項目路徑下。網絡
√√√按操做的數據單位不一樣分爲:字節流(8bit)、字符流(16bit)。字節流適合操做圖片、視頻等文件,字符流適合操做文本文件。多線程
按數據流的流向不一樣分爲:輸入流、輸出流。app
按流的角色不一樣分爲:**節點流、處理流。dom
節點流:直接從數據源或目的地讀寫數據。也叫文件流ide
處理流:不直接鏈接到數據源或目的地,而是「鏈接」在已存 在的流(節點流或處理流)之上,經過對數據的處理爲程序提 供更爲強大的讀寫功能單元測試
抽象基類 | 字節流 | 字符流 |
---|---|---|
輸入流 | InputStream | Reader |
輸出流 | OutputStream | Writer |
public void test1() throws IOException { //1.實例化File類,指明要操做的對象.這一步的目的是創建硬盤中的文件和Java中類的對應關係. File file = new File("hello1.txt"); //2.提供具體的流.參數的做用就是幫助咱們並鏈接上文件這個"大水庫" FileReader fileReader = new FileReader(file); //3.用流讀取到內存 //read():返回讀入的字符,是int須要轉換爲char.到了文件結尾返回-1 int read = fileReader.read(); while (read != -1) { System.out.print((char) read); read = fileReader.read(); } //4.關閉流 fileReader.close(); } //整個過程結合圖示去理解很合理
/* 優化: 1.第三部能夠在語法上的優化,可是效率實際上是同樣的 2.爲了保證關閉操做必定執行,使用try-catch-finally 3.讀入的文件必定要存在,不然會出現:FileNotFoundException */ public void test2() { FileReader fileReader = null; try { File file = new File("hello1.txt"); fileReader = new FileReader(file); //改進1 int read; while ((read = fileReader.read()) != -1){ System.out.print((char) read); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (fileReader != null) fileReader.close(); } catch (IOException e) { e.printStackTrace(); } }
//使用數組 char[] charBuffer = new char[5]; int len;//記錄每次讀入到charBuffer數組中的字符個數 while ((len = fileReader.read(charBuffer)) != -1){ for (int i = 0; i < len; i++) {//這裏要用len(讀取的字符數)二不是數組的長度 System.out.print(charBuffer[i]); } } //固然for循環也能夠換位String的構造器來把字符串數組轉換爲String String string = new String(charBuffer, 0, len); System.out.print(string);
File file = new File("hello2.txt"); FileWriter fw = new FileWriter(file); fw.write("i have a dream!"); fw.close(); //最後用try-catch處理一下異常,上面的步驟更清晰一些
public void test5() throws IOException { File srcFile = new File("hello2.txt"); File destFile = new File("hello3.txt"); FileReader fr = new FileReader(srcFile); FileWriter fw = new FileWriter(destFile); char[] charBuffer = new char[5]; int len; while ((len = fr.read(charBuffer)) != -1) { fw.write(charBuffer, 0, len);//和用String來取是相似的★★★★★ } fw.close(); fr.close(); } //最後用try-catch處理一下異常,上面的步驟更清晰一些
BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
public void test() throws IOException { //1.建立File File srcFile = new File("img1.png"); File destFile = new File("img2.png"); //2.建立流 //2.1建立文件流 FileInputStream fis = new FileInputStream(srcFile); FileOutputStream fos = new FileOutputStream(destFile); //2.2建立字節流 BufferedInputStream bis = new BufferedInputStream(fis); BufferedOutputStream bos = new BufferedOutputStream(fos); //3.複製 byte[] bytes = new byte[10]; int len; while ((len = bis.read(bytes)) != -1){ bos.write(bytes,0,len); } //4.關閉流 bis.close(); bos.close(); }
public void test1() throws IOException { //1.建立文件和流 BufferedReader br = new BufferedReader(new FileReader(new File("hello1.txt"))); BufferedWriter bw = new BufferedWriter(new FileWriter(new File("hello4.txt"))); // //2.複製 // char[] chars = new char[10]; // int len; // while ((len = br.read(chars)) != -1) { // bw.write(chars, 0, len); // } // 複製:用String來實現★★★★★★★★★★★ String data;//可是是不帶換行的,能夠用一如下兩種方法實現 while ((data = br.readLine()) != null) { // //方法一★★★★★★★★ // bw.write(data + "\n"); //方法二★★★★★★★★ bw.write(data); bw.newLine(); } //3.關閉 br.close(); bw.close(); }
public InputStreamReader(InputStream in)
默認使用utf-8字符集public InputSreamReader(InputStream in,String charsetName)
能夠本身選擇字符集。按照地區輔助記憶 | 編碼表 | 描述 |
---|---|---|
美國 | ASCII | 用一個字節的7位來表示全部英文和符號 |
歐洲 | ISO8859-1 | 用一個字節的8位表示全部歐洲語言的字母 |
中國 | GB2312 GBK |
最多兩個字節編碼全部漢字 升級版,加入了更多的漢字 |
國際通用 | Unicode UTF-8 |
Unicode編碼是對UTF-8/16的統稱 用1-4個字節表示人類全部文字 |
@Test public void test2() throws Exception { //1.造文件、造流 File file1 = new File("dbcp.txt"); File file2 = new File("dbcp_gbk.txt"); FileInputStream fis = new FileInputStream(file1); FileOutputStream fos = new FileOutputStream(file2); InputStreamReader isr = new InputStreamReader(fis,"utf-8"); OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk"); //2.讀寫過程 char[] cbuf = new char[20]; int len; while((len = isr.read(cbuf)) != -1){ osw.write(cbuf,0,len); } //3.關閉資源 isr.close(); osw.close(); }
public class Exercise { public static void main(String[] args) {//idea不支持在單元測試中輸入內容,因此改用main()來測試 BufferedReader br = null; try { InputStreamReader isr = new InputStreamReader(System.in); br = new BufferedReader(isr); while (true) { System.out.println("請輸入字符串: "); String data = br.readLine(); if ("e".equalsIgnoreCase(data)||"exit".equalsIgnoreCase(data)){ System.out.println("程序結束"); break; } String upperCase = data.toUpperCase(); System.out.println(upperCase); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
PrintStream ps = null; try { FileOutputStream fos = new FileOutputStream(new File("D:\\IO\\text.txt")); // 建立打印輸出流,設置爲自動刷新模式(寫入換行符或字節 '\n' 時都會刷新輸出緩衝區) ps = new PrintStream(fos, true); if (ps != null) {// 把標準輸出流(控制檯輸出)改爲文件 System.setOut(ps); } for (int i = 0; i <= 255; i++) { // 輸出ASCII字符 System.out.print((char) i); if (i % 50 == 0) { // 每50個數據一行 System.out.println(); // 換行 } } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (ps != null) { ps.close(); } }
引入:爲了方便地操做Java語言的基本數據類型和String的數據,可使用數據流
數據流有兩個類:(用於讀取和寫出基本數據類型、String類的數據,方便持久化)
DataInputStream 和 DataOutputStream
DataInputStream中的方法
boolean readBoolean()
char readChar()
double readDouble()
long readLong()
String readUTF()
byte readByte()
float readFloat()
short readShort()
int readInt() void
readFully(byte[] b)
DataOutputStream中的方法
將上述的方法的read改成相應的write便可
練習:將內存中的字符串、基本數據類型的變量寫出到文件中。 注意:處理異常的話,仍然應該使用try-catch-finally. */ @Test public void test3() throws IOException { //1. DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt")); //2. dos.writeUTF("劉建辰"); dos.flush();//刷新操做,將內存中的數據寫入文件 dos.writeInt(23); dos.flush(); dos.writeBoolean(true); dos.flush(); //3. dos.close(); } /* 將文件中存儲的基本數據類型變量和字符串讀取到內存中,保存在變量中。 注意點:讀取不一樣類型的數據的順序要與當初寫入文件時,保存的數據的順序一致! */ @Test public void test4() throws IOException { //1. DataInputStream dis = new DataInputStream(new FileInputStream("data.txt")); //2. String name = dis.readUTF(); int age = dis.readInt(); boolean isMale = dis.readBoolean(); System.out.println("name = " + name); System.out.println("age = " + age); System.out.println("isMale = " + isMale); //3. dis.close(); }
什麼是對象的序列化機制(面試題)
序列化的好處:可將任何實現了Serializable接 使其在保存和傳輸時可被還原。
public class ObjectInputOutputStream { /* 代碼實現String類的對象的序列化和反序列化 */ @Test//序列化 public void testObjectOutputStream(){ ObjectOutputStream oos = null; try { //1.造流和文件 oos = new ObjectOutputStream(new FileOutputStream(new File("objectString.dat"))); //2.寫出 oos.writeObject(new String("我愛你中國")); } catch (IOException e) { e.printStackTrace(); } finally { //3.關閉流 try { if (oos != null) { oos.close(); } } catch (IOException e) { e.printStackTrace(); } } } @Test public void testObjectInputStream(){ ObjectInputStream ois = null; try { ois = new ObjectInputStream(new FileInputStream(new File("objectString.dat"))); Object readObject = ois.readObject(); System.out.println(readObject); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { if (ois != null) { ois.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
public static final long serialVersionUID = xxxxxxxxL;
@Test public void test1() throws IOException { //用參數mode標識,讓類表明輸入 RandomAccessFile r = new RandomAccessFile(new File("hello1.txt"), "r"); //用參數mode標識,讓類表明輸出 RandomAccessFile rw = new RandomAccessFile(new File("hello5.txt"), "rw"); byte[] bytes = new byte[1024]; int len; while ((len=r.read(bytes)) != -1){ rw.write(bytes,0,len); } r.close(); rw.close(); }
/* 使用RandomAccessFile實現數據的插入效果 */ @Test public void test3() throws IOException { RandomAccessFile raf1 = new RandomAccessFile("hello.txt","rw"); raf1.seek(3);//將指針調到角標爲3的位置 //保存指針3後面的全部數據到StringBuilder中 StringBuilder builder = new StringBuilder((int) new File("hello.txt").length()); byte[] buffer = new byte[20]; int len; while((len = raf1.read(buffer)) != -1){ builder.append(new String(buffer,0,len)) ; } //調回指針,寫入「xyz」 raf1.seek(3); raf1.write("xyz".getBytes()); //將StringBuilder中的數據寫入到文件中 raf1.write(builder.toString().getBytes()); raf1.close(); }
public class JarTest { public static void main(String[] args) throws IOException { File srcFile = new File("s6_IO/hello1.txt"); File destFile = new File("s6_IO/hello6.txt"); FileUtils.copyFile(srcFile,destFile); } }