IO流:傳輸資料的一套機制
I:input (輸入)
O:output(輸出)
存儲資料:記憶體 持久化存儲
持久化存儲:長期儲存
IO流分為輸入流和輸出流
IO流從功能上來說分為字元流和位元組流
字元流是隻能操作字元(txt)
位元組流:可以操作所有檔案
字元流 Reader Writer
位元組流 InputStream OutpurStream
以上4種都是抽象類,不能直接使用
輸入還是輸出是相對于記憶體來說
如果向記憶體中讀取内容,就是輸入到記憶體。輸入流
如果從記憶體中向外面寫入内容,就是輸出。
字元輸出流:FileWriter 将字元寫入到檔案中
如果想要追加資料,在構造方法後面提供 true
舉例:
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
//字元輸出流
//如果路徑有,就直接建立檔案
//如果檔案已經存在。會建立新的檔案覆寫掉以前的檔案
FileWriter fw=new FileWriter("F:\\a,txt,true");
//寫入資料到緩存區
fw.write("趁陽光正好,趁微風不燥");
//沖刷緩沖區
fw.flush();
//關閉,釋放資源
//注意:關閉會自動沖刷緩沖區,是以有時就沒必要再沖刷緩沖區
fw.close();
//清空對象
fw=null;
}
}
檔案的異常處理:
1、現在trycatch外面聲明對象,設定為null,保證對象的作用域在try…catch…finally裡面
2、建立對象,并且在finally裡面判斷是否為null。因為一旦對象為null,那麼就會出現空指針異常。
3、在finally的判斷方法中,關閉流。關閉流也需要捕獲異常,因為關閉流也不一定成功。
4、在捕獲關閉流異常的trycatch中添加finally,無論關閉流是否成功,都給對象設定為null。
5、如果寫入資料,需要去沖刷緩沖區,防止資料的丢失。
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterExceptioonTest {
public static void main(String[] args) {
// 建立對象
FileWriter fw = null;
try {
fw = new FileWriter("F:\\b.txt");
fw.write("你好,周傑倫");
// 沖刷
fw.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if (fw != null){
try {
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
fw = null;
}
}
}
}
}
JDK1.7的特性
Try with resource
try(AutoCloseable的子類/子接口){
對象可以保證自動關閉
}
注意:try小括号中内容不能是傳遞過來
import java.io.FileWriter;
public class TryWithResourceDemo {
public static void main(String[] args) {
// JDK1.7特性
// try ... with ... resouce 可以保證自動關閉
// 使用格式 try(AutoCloseable的子類或者子接口)
// 可以保證裡面的對象自動關閉
try (FileWriter fw = new FileWriter("F:\\b.txt")){
fw.write("再見,周傑倫");
}catch(Exception e){
e.printStackTrace();
}
}
}
字元輸入流:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
//字元輸入流:将檔案的内容讀取到記憶體中
//建立對象
FileReader fr=new FileReader("F:\\c.txt");
//讀取字元
//一次讀取一個字元
//如果讀到最後,沒有字元,傳回-1
//因為是從檔案中一個個讀取,是以這種寫法,效率比較低
int ch;
while((ch=fr.read())!=-1){
System.out.println((char)ch);
}
fr.close();
}
}
字元輸入流:FileReader
FileReader預設一次讀取一個字元,效率比較低下,可以通過字元數組形成一個緩沖區,進而來提升效率。
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo02 {
public static void main(String[] args) throws IOException {
// 通過字元數組作為緩沖區,讀取資料
FileReader fr = new FileReader("F:\\c.txt");
// 定義一個字元數組
char[] chs = new char[3];
// 讀一次就擷取對應字元數組長度的内容
// 如果沒有讀取到資料,那麼傳回-1
// 讀取到的字元長度
int len;
while((len = fr.read(chs)) != -1){
System.out.println(new String(chs,0,len));
}
fr.close();
}
}
練習 :copy檔案
import java.io.FileReader;
import java.io.FileWriter;
public class CopyTxt {
public static void main(String[] args) {
// 拷貝檔案 思路:先去對應的檔案中讀取内容
// 讀取一行寫入一行
// 讀取時候使用字元數組
long startTime = System.currentTimeMillis();
FileReader fr = null;
FileWriter fw = null;
try{
fr = new FileReader("F:\\667.txt");
fw = new FileWriter("F:\\a556.txt");
// 先讀再寫
// 讀取需要使用到字元數組,那麼先建立數組
char[] chs = new char[1024 * 8];
// 定義一個變量來接收實際讀取到的長度
int len;
while ((len = fr.read(chs)) != -1){
// 表示讀取到了内容 長度就是len
// 寫入到檔案中
// fw.write(new String(chs,0,len));
fw.write(chs, 0, len);
}
fw.flush();
}catch(Exception e){
e.printStackTrace();
}finally{
// fr和fw都有可能是null
if (fr != null){
try{
fr.close();
}catch(Exception e){
e.printStackTrace();
}finally{
fr = null;
}
}
if (fw != null){
try{
fw.close();
}catch(Exception e){
e.printStackTrace();
}finally{
fw = null;
}
}
}
// 複制文本花費的總時間
System.out.println(System.currentTimeMillis() - startTime);
}
}