I/O的簡介

  • 文本咱們能讀懂的均可以認爲是字符流,文章 java文件都是字符流數據java

    • 流的分類 輸入流 輸出流數組

  • 1。輸出流 Writer:關於字符流的父類,抽象類。與之相對的輸入流 Reader緩存

  • 1、字符流eclipse

        • 字符流的命名規則:若是是輸出流那麼就以Writer結尾,若是是輸入流就以Reader結尾性能

案例1編碼

使用字符流向一個文件輸入Hello 沃得;spa

publicstaticvoid main(String[] args) {指針

File file =new File("test.txt");對象

System.out.println(file.length());排序

Writer writer = null;

try {

//I/O流是須要關閉的,若是不這樣作就不能關閉資源

writer = new FileWriter(file);

writer.write("hellow");

} catch (IOException e) {

 

e.printStackTrace();

}finally {

//判斷writer不是空 防止空指針異常

if(writer != null) {

try {

//writer.close的功能和flash同樣都是清除緩存

writer.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

主要考慮異常的處理,writer的聲明方法也須要仔細查看,根據寫入的數據類型決定選擇哪一個方法來寫入內容



文件的追加:

publicstaticvoid main(String[] args) {

Filefile =new File("test.txt");

System.out.println(file.length());

Writer writer = null;

try {

//I/O流是須要關閉的,若是不這樣作就不能關閉資源

//後面的布爾值若是爲true則是在文件後面追加內容

writer = new FileWriter("text2.txt",true);

for(inti = 0; i < 100; i++) {

writer.write("halloword");

//每次寫夠10個哈嘍沃得就清除一下緩存

if(i % 10 == 0) {

System.out.println("\n");

writer.flush();

}

}

} catch (IOException e) {

 

e.printStackTrace();

}finally {

//判斷writer不是空 防止空指針異常

if(writer != null) {

try {

//writer.close的功能和flash同樣都是清除緩存

writer.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}













字符輸出流的換行:

  • 在寫入的內容中的換行符\n前加上\r才能實現換行

try {

//I/O流是須要關閉的,若是不這樣作就不能關閉資源

//後面的布爾值若是爲true則是在文件後面追加內容

writer = new FileWriter("text2.txt",true);

for(inti = 0; i < 100; i++) {

writer.write("halloword\r\n");

//每次寫夠10個哈嘍沃得就清除一下緩存

if(i % 10 == 0) {

System.out.println("");

writer.flush();

}

}

} catch (IOException e) {

 

e.printStackTrace();

}

writer的寫入方法

writer = new FileWriter("text3.txt",true);

char[] c = {'a','b','c','d','e','f','g'};

writer.write(c, 2, 3);





























  • 字符的輸入流:

publicstaticvoid main(String[] args) {

File file =new File("test.txt");

Readerreader =null;

try {

reader = new FileReader(file);

//單個字符的讀取,讀取的字符被轉換爲ASCII

/*

* 經過char能夠將得到的ASCII強轉爲char的字符型,

* read()方法在讀取到最後的時候值會變成-1,因此能夠用while

* 循環遍歷文本中的內容,這種單個字符的讀取性能不高。通常不用

*/

intc;

try {

while((c = reader.read()) != -1) {

System.out.print((char)c+"\r\n");

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally {

if(reader != null) {

try {

reader.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}



  • 字符輸入流2:用數組讀取內容

publicstaticvoid main(String[] args) {

File file =new File("test.txt");

Reader reader = null;

try {

reader = new FileReader(file);

//定義一個數組,這個方法是較爲經常使用的方法

char[] arr = newchar[10];

//向字符數組填數據

try {

intlen = 0;

//intlen = reader.read(arr);

//System.out.println("len的值"+len+"讀取的內容"+Arrays.toString(arr));

輸出結果爲len的值10 讀取的內容...arr數組內的10個元素) 若是數組中的元素不夠10個,則長度變爲文本內容長度,

* 元素有多長替換多長的,空出來的數組下標位置,仍是爲之前的元素值

* 知道最後徹底沒有元素了,讀取長度變爲-1

* while循環得到文本中的全部內容,因爲最後一次讀取,不必定能讀取夠

* 定義的數組長度,因此在將其轉成字符串的使用用String(數組名,取值開始位置,取值結束位置)

* 將結束位置設置爲從read()方法得到的長度。直到其返回爲-1while結束循環。

*/

while((len = reader.read(arr)) != -1) {

String str = new String(arr,0,len);

System.out.print(str);

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally {

try {

reader.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}





  • 文件的拷貝

    publicstaticvoid main(String[] args) {

    * 1.經過輸入流將文件讀取到字符串中;

    File file =new File("D:\\Users\\Administrator\\eclipse-workspace\\7.13\\src\\ExtendOne.java");

    Reader reader = null;

    File file1 = new File("javaCopy.java");

    Writer writer = null;

    try {

    intlen;

    //建立字符輸入流的對象

    reader = new FileReader(file);

    try {

    //建立字符輸出流的對象

    writer =new FileWriter(file1);

    } catch (IOException e1) {

    // TODO Auto-generated catch block

    e1.printStackTrace();

    }

    char[] arr = newchar[10];

    try {

    while((len = reader.read(arr)) != -1){

    //把輸入流讀取到的數據寫入字符輸出流,輸出流被寫入玩後須要writer.flush()清除緩存;

    writer.write(arr, 0, len);

    }

    writer.flush();

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    } catch (FileNotFoundException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }finally {

    //須要將打開的輸入輸出流關閉

    //原則爲:先打開的後關閉,後打開的先關閉.都須要異常處理

    //兩個異常處理能夠一塊,在同一個try內判斷是否爲空並關閉對象便可。

    if(writer != null) {

    try {

    writer.close();

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    if(reader != null) {

    try {

    reader.close();

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }

    }

      • 字節流的高效緩衝字節流

publicstaticvoid main(String[] args) {

//定義一個高效緩衝字節流,能夠複製圖片

BufferedInputStream in =null;

BufferedOutputStream out = null;

try {

//建立一個高效緩衝字節流對象

//和輸入輸出流同樣都是須要關閉的,先開的後關,後開的先關

in =new BufferedInputStream(new FileInputStream("E:\\Program Files\\冒泡排序.jpg"));

out = new BufferedOutputStream(new FileOutputStream("maopao.jpg"));

//定義一個字節數組

byte[] bs = newbyte[1024];

//定義一個標誌

intlen;

try {

while((len = in.read(bs)) != -1) {

out.write(bs,0,len);

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally {

if(out != null) {

try {

out.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if(in != null) {

try {

in.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

 

}

字符流和字節流的轉換橋樑:

  • 字符流操做文本,字節流操做二進制,字節是最小的基本單位,一個字符佔兩個字節。

  • OutputStreamWriter:是字符流轉換爲字節流的橋樑,可以使用指定的charset將要寫入流中的字符編碼成字節。

      • 編碼:不一樣的編碼格式獲得的值不一樣!utf-8表和GBK,能夠經過右鍵工程選擇Propertise菜單進入編碼格式編輯菜單。設置的編碼格式若是和寫入時保存的文件格式不一樣則會產生亂碼,所以須要進行編碼設置。字符流通向字節流的橋樑能夠指定存儲編碼

相關文章
相關標籤/搜索