java io流简单笔记
IO流
網圖
看JDK文檔更清晰
看JDK文檔更清晰
看JDK文檔更清晰
看JDK文檔更清晰
原理
參考博文(https://blog.csdn.net/sinat_37064286/article/details/86537354)詳細
所謂的輸出流和輸入流是相對于代碼程序而言的
- 輸入流:從別的地方(本地文件,網絡上的資源等)獲取資源 輸入到 我們的程序中
- 輸出流:從我們的程序中 輸出到 別的地方(本地文件), 將一個字符串保存到本地文件中,就需要使用輸出流。
根據處理單位又分為字符流和字節流
- 1字符 = 2字節 、 1字節(byte) = 8位(bit) 、 一個漢字占兩個字節長度 。
按功能不同分為 節點流、處理流
4個基本的抽象流類型,所有的流都繼承這四個
-
? 輸入流 輸出流
字節流 InputStream outputStream
字符流 Reader Writer
字符流的由來: Java中字符是采用Unicode標準,一個字符是16位,即一個字符使用兩個字節來表示。為此,JAVA中引入了處理字符的流。因為數據編碼的不同,而有了對字符進行高效操作的流對象。本質其實就是基于字節流讀取時,去查了指定的碼表。
字符輸出流
部分類:
FileWriter
-
用來寫入字符文件的便捷類
- public class Test1 {public static void main(String[] args) throws Exception {FileWriter fileWriter=new FileWriter("A/testA11",true); //如果沒有這個文件的話就自動新建,true表示追加,而不是覆蓋原有數據String str1="asdfghjkl/";fileWriter.append(str1);fileWriter.flush(); // 刷新該流的緩沖//fileWriter.close(); //先強制刷新緩存,在關閉 使用流必須要關閉buffW();}
BufferedWriter
-
將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入。
- //BufferedWriter(Writer out)//創建一個使用默認大小輸出緩沖區的緩沖字符輸出流。//BufferedWriter(Writer out, int sz)//創建一個使用給定大小輸出緩沖區的新緩沖字符輸出流。/*** BufferedWriter 簡單使用,建議看文檔* @throws Exception*/static void buffW() throws Exception {FileWriter fileWriter=new FileWriter("A/testA11");BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);char[] chars={'1','2','3','4','5','6','7'};for (int i=0;i<3;i++){bufferedWriter.write(chars,0,chars.length); //寫入緩存,bufferedWriter.newLine(); //寫入一個行終止,也就是換行bufferedWriter.write('i'); //再寫入bufferedWriter.newLine();bufferedWriter.flush();}bufferedWriter.close();// 1234567// i// 1234567// i// 1234567// i}
CharArrayReader
-
此類實現一個可用作 Writer 的字符緩沖區。緩沖區會隨向流中寫入數據而自動增長。
-
在此類上調用 close() 無效,并且在關閉該流后可以調用此類中的各個方法,而不會產生任何 IOException。
-
例子
static void charAW() throws Exception {///FileWriter fileWriter=new FileWriter("A/testA11");CharArrayWriter charArrayWriter=new CharArrayWriter();for (int i=0;i<3;i++){// System.out.println(charArrayWriter.append(String.valueOf(i))); 0 01 012charArrayWriter.append(String.valueOf(i));}charArrayWriter.close(); //沒有用,charArrayWriter還是可以正常使用charArrayWriter.write('a');System.out.println(charArrayWriter.toString()); //012a String類型System.out.println(charArrayWriter.toCharArray()); // 012a char[]類型System.out.println("重置前"+charArrayWriter.size()); //重置前4//那close()沒用,緩存滿了怎么辦呢charArrayWriter.reset(); //緩存重置System.out.println("重置后"+charArrayWriter.size()); // 重置后0}
FilterWriter
PrintWriter
-
向文本輸出流打印對象的格式化表示形式。此類實現在 PrintStream 中的所有 print方法。它不包含用于寫入原始字節的方法,對于這些字節,程序應該使用未編碼的字節流進行寫入。
-
與 PrintStream 類不同,如果啟用了自動刷新(換行),則只有在調用 println、printf 或 format 的其中一個方法時才可能完成此操作,而不是每當正好輸出換行符時才完成。
-
例子
static void priW() throws Exception {//FileWriter fileWriter = new FileWriter("A/testA11");//PrintWriter printWriter = new PrintWriter(fileWriter);PrintWriter printWriter = new PrintWriter("A/testA11");for (int i = 0; i < 3; i++) {printWriter.println("數據" + i);//數據0//數據1//數據2}printWriter.close();}
字符輸入流
部分類:
FileReader
-
用來讀取字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節緩沖區大小都是適當的。
-
例子
static void filS() throws Exception {FileReader fileReaderA = new FileReader("A/testA11");char[] ch = new char[1024];while ((fileReaderA.read(ch)) != -1) {}System.out.println(ch);fileReaderA.close(); }
BufferedReade
-
從字符輸入流中讀取文本,緩沖各個字符,從而實現字符、數組和行的高效讀取。
-
建議用 BufferedReader 包裝所有其 read() 操作可能開銷很高的 Reader(如 FileReader 和 InputStreamReader)
-
例子
static void buffS() throws Exception {FileReader fileReader = new FileReader("A/testA11");FileWriter fileWriter = new FileWriter("B/testB1");BufferedReader bufferedReader = new BufferedReader(fileReader);BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);char[] ch = new char[1024];String ch1;//bufferedReader.skip(2); //要跳過幾個字符//while ((bufferedReader.read(ch))!=-1){//復制文件內容 A/testA11》》B/testB1while ((ch1 = bufferedReader.readLine()) != null) {fileWriter.append( ch1);fileWriter.flush();}//System.out.println(ch);//數據0//數據1//數據2fileReader.close();fileWriter.close(); }
字節輸入流
部分類:
- FileInputStream從文件系統中的某個文件中獲得輸入字節。
字節輸出流
部分類:
FileOutputStream
-
文件輸出流是用于將數據寫入 File或 FileDescriptor 的輸出流。
-
例子
static void onpS() throws Exception {FileOutputStream fileOutputStream=new FileOutputStream("A/testA11");byte[] ch={'a','b','c','d','e','f','g'};fileOutputStream.write(ch);fileOutputStream.close();}
h
File
文件和目錄路徑名的抽象表示形式。
例子
- static void file() throws Exception {File file1=new File("B/C/c/v");File file2=new File("B/s");File file=new File("C/v/testA12.txt");File file3=new File("A/testA12.txt");//file2.mkdir(); //單級(一個目錄)//file1.mkdirs(); //在B目錄下創建新目錄C 多級//如果指定的文件不存在并成功地創建,則返回 true;如果指定的文件已經存在,則返回 false//目錄是已存在的,如果路徑是不存在的會報異常(系統找不到指定的路徑。)// file.createNewFile();// System.out.println(File.separatorChar); // separator 同功能,返回類型不同;與系統有關的默認名稱分隔符。// System.out.println(File.pathSeparatorChar); // pathSeparator ; 與系統有關的路徑分隔符。// System.out.println(file.getName()); //獲取文件名(包括后綴)// System.out.println(file.getParent()); // C\v 返回此抽象路徑名父目錄的路徑名字符串;如果此路徑名沒有指定父目錄,則返回 null。// System.out.println(file.getAbsoluteFile()); //獲取文件絕對路徑// System.out.println(file.getPath()); //C\v\testA12.txt 將此抽象路徑名轉換為一個路徑名字符串。所得字符串使用 默認名稱分隔符分隔名稱序列中的名稱// System.out.println(file.isAbsolute()); //測試此抽象路徑名是否為絕對路徑名// System.out.println(file.isDirectory()); //測試此抽象路徑名表示的文件是否是一個目錄// System.out.println(file.isFile()); //測試此抽象路徑名表示的文件是否是一個標準文件// System.out.println(file.isHidden()); // 測試此抽象路徑名指定的文件是否是一個隱藏文件// File file41=new File("A/testA1");// File file42=new File("A/testA122");//相差2位//// //按字母順序比較兩個抽象路徑名// //如果該參數等于此抽象路徑名,則返回零;// // 如果此抽象路徑名在字母順序上小于該參數,則返回小于零的值;// //如果此抽象路徑名在字母順序上大于該參數,則返回大于零的值// System.out.println(file41.compareTo(file42)); //-2// String pattern = "yyyy-MM-dd HH:mm:ss";// //文件最后一次被修改的時間// //2021-05-04 14:14:12// System.out.println(new SimpleDateFormat(pattern).format(new Date(file3.lastModified())));//返回由此抽象路徑名表示的文件的長度 ,以字節為單位System.out.println(file3.length()); //123456我 返回9 包括結束符}
序列化與反序列化
static void obj() throws Exception {A a = new A();a.setId(1);a.setName("張三");a.setAge(23);A a2 = new A(2, "李四", 22);A a21 = new A(3, "李五", 23);A a22 = new A(4, "李六", 24);//序列化// ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream("A/testA12.txt"));// objectOutputStream.writeObject(a);// objectOutputStream.writeObject(a2);// objectOutputStream.writeObject(a21);// objectOutputStream.writeObject(a22);// objectOutputStream.close();//反序列化FileInputStream fileInputStream=new FileInputStream("A/testA12.txt");ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);// A aa = (A) objectInputStream.readObject();//// A aa1 = (A) objectInputStream.readObject();A aa =null;for (int i=0;i<fileInputStream.available();i++){aa = (A) objectInputStream.readObject();System.out.println(aa.toString());aa=null;}objectInputStream.close();}///要序列化的類 //實現Serializable接口 class A implements Serializable {private Integer id;private String name;private Integer age;public A() {}public A(Integer id, String name, Integer age) {this.id = id;this.name = name;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "A{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';} }transient 不需要序列化的屬性使用關鍵字
好像忘了寫什么?想不起來了
總結
以上是生活随笔為你收集整理的java io流简单笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html+css:display:fle
- 下一篇: 智能好用还免费的修图工具,赶紧收藏起来吧