java之IO流(二)
阿新 • • 發佈:2019-02-13
IO:在裝置和裝置之間的一種資料傳輸!
IO流的分類:
按流的方向分:
輸入流: 讀取檔案 (e:\\a.txt):從硬碟上檔案讀取出來後輸出這個檔案的內容
輸出流: 寫檔案:將e:\\a.txt 內容讀出來--->寫到f盤下
按資料的型別劃分:
位元組流
位元組輸入流:InputStream:讀取位元組
位元組輸出流:OutputStream:寫位元組
字元流
字元輸入流:Reader:讀字元
字元輸出流:Writer:寫字元
需求:在當專案下輸出一個檔案,fos.txt檔案(文字檔案)
只要文字檔案,優先採用字元流,字元流在位元組流之後出現的
使用位元組流進行操作
無法建立位元組輸出流物件:OutputSteam :抽象類,不能例項化
又學習過File類,並且當前是對檔案進行操作,子類:FileOutputSteam進行例項化
File+InputStream
File+OutputStream
FileXXX (FileReader)
FileXXX (FileWriter)
開發步驟:
1)建立位元組輸出流物件
2)寫資料
問題:
寫一些資料,這些資料並沒有換行,如何實現換行的效果...
針對不同的作業系統,裡面的換行符合不一樣的
windows: \r\n
Linx:\n
mac:\r
一些高階記事本針對任意的換行會有換行的效果
問題:如何末尾追加資料呢
public FileOutputStream(File file, boolean append):指定為true,末尾追加資料
舉例:
InputStream抽象類:位元組輸入流
FileInputStream
構造方法:
public FileInputStream(String name)
開發步驟:
1)建立位元組檔案輸入流物件
2)讀資料
3)釋放資源
讀資料方式:
public abstract int read():一次讀取一個位元組
將當前專案下的a.txt檔案的內容讀取出來,複製到b.txt檔案中
原始檔:a.txt---> 讀取檔案的內容---->FileInputStream
目的地檔案:b.txt---->輸出檔案--->FileOutputStream
本身讀寫操作:
IO流的分類:
按流的方向分:
輸入流: 讀取檔案 (e:\\a.txt):從硬碟上檔案讀取出來後輸出這個檔案的內容
輸出流: 寫檔案:將e:\\a.txt 內容讀出來--->寫到f盤下
按資料的型別劃分:
位元組流
位元組輸入流:InputStream:讀取位元組
位元組輸出流:OutputStream:寫位元組
字元流
字元輸入流:Reader:讀字元
字元輸出流:Writer:寫字元
需求:在當專案下輸出一個檔案,fos.txt檔案(文字檔案)
只要文字檔案,優先採用字元流,字元流在位元組流之後出現的
使用位元組流進行操作
無法建立位元組輸出流物件:OutputSteam :抽象類,不能例項化
又學習過File類,並且當前是對檔案進行操作,子類:FileOutputSteam進行例項化
File+InputStream
File+OutputStream
FileXXX (FileReader)
FileXXX (FileWriter)
開發步驟:
1)建立位元組輸出流物件
2)寫資料
3)關閉資源
舉例:
public class FileOutputStreamDemo1 { public static void main(String[] args) throws Exception{ //OutputStream out =new FileOutputStream("fos.txt");// 多型 //建立位元組輸出流 //1)構造了輸出流物件 //2)指向了當前目錄下輸出fos.txt FileOutputStream f=new FileOutputStream("fos.txt"); //寫資料 //1)將檔案和和流物件不建立關係了 //2)及時釋放掉流物件所佔用的空間 f.write("hello".getBytes()); f.close(); //f.write("java".getBytes()); } }
註釋:OutputStream位元組輸出流不能建立物件,可以通過多型對子類進行例項化
關於位元組輸出流寫資料的方法
public void write(int b):一次寫一個位元組
public void write(byte[] b) :一次寫一個位元組陣列
public void write(byte[] b, int off,int len):一次寫一部分位元組陣列
舉例:
需求:輸出文字檔案,給文字檔案中新增一些資料public class FileOutputStreamDemo2 { public static void main(String[] args) throws IOException { //構造一個位元組輸出流物件 FileOutputStream f=new FileOutputStream("f2.txt"); //寫資料 f.write(97); f.write(126); f.write(127); byte[] b= {97,98,99,100}; f.write(b); f.write(b, 0, 3); f.close(); } }
問題:
寫一些資料,這些資料並沒有換行,如何實現換行的效果...
針對不同的作業系統,裡面的換行符合不一樣的
windows: \r\n
Linx:\n
mac:\r
一些高階記事本針對任意的換行會有換行的效果
問題:如何末尾追加資料呢
public FileOutputStream(File file, boolean append):指定為true,末尾追加資料
舉例:
public class FileOutputStreamDemo3 {
public static void main(String[] args) throws IOException {
FileOutputStream f=new FileOutputStream("fox3.txt",true);
//寫資料
for(int i=0;i<10;i++) {
f.write(("hello"+i).getBytes());
f.write(("\r\n").getBytes());
}
f.close();
}
}
需求:去讀取當前專案下的fis.txt這個檔案內容,將檔案的內容輸出在控制檯上InputStream抽象類:位元組輸入流
FileInputStream
構造方法:
public FileInputStream(String name)
開發步驟:
1)建立位元組檔案輸入流物件
2)讀資料
3)釋放資源
讀資料方式:
public abstract int read():一次讀取一個位元組
public int read(byte[] b):一次讀取一個位元組陣列 (讀取實際的位元組數)
舉例:
public class FileInputStreamDemo1 {
public static void main(String[] args) throws IOException {
FileInputStream f = new FileInputStream("fos.txt");
// 開始讀取:第一次讀取
// int b=f.read();
// System.out.println(b);
// System.out.println((char)(b));
// b=f.read();
// System.out.println(b);
// System.out.println((char)b);
// 重複讀太高,需要while迴圈
int b = f.read();
while (b != -1) {
System.out.println((char) b);
b = f.read();
}
}
}
public int read(byte[] b):一次讀取一個位元組陣列 (讀取實際的位元組數)
舉例:
public class FileInputStreamDemo2 {
public static void main(String[] args) throws IOException {
FileInputStream f=new FileInputStream("fos.txt");
//第一次讀取
// byte[] b=new byte[5];
// int n = f.read(b);
// System.out.println(n);
// System.out.println(new String(b));
// n=f.read(b);
// System.out.println(n);
// System.out.println(new String(b));
//程式碼重複度高
byte[] b=new byte[1024];
int len=0;
while((len=f.read(b))!=-1) {
System.out.println(new String(b,0,len));
}
}
}
複製文字檔案。將當前專案下的a.txt檔案的內容讀取出來,複製到b.txt檔案中
原始檔:a.txt---> 讀取檔案的內容---->FileInputStream
目的地檔案:b.txt---->輸出檔案--->FileOutputStream
本身讀寫操作:
讀取一個位元組,寫一個位元組,針對不會出現中文亂碼的問題..
舉例:
public class CopyDemo1 {
//封裝目的檔案和原始檔
public static void main(String[] args) throws IOException {
FileInputStream f=new FileInputStream("fos.txt");
FileOutputStream fos=new FileOutputStream("b.txt");
//邊讀邊寫
int by=0;
while((by=f.read())!=-1) {
fos.write(by);
}
System.out.println("---------");
f.close();
fos.close();
}
}
註釋:複製圖片時會出現亂碼現象,如果出現亂碼,就用位元組流來進行操作