IO流
Java裏面分爲兩種流:字節流和字符流。如果細分的話有,可分爲:4個文件流,4個緩衝流,2個轉換流,2個打印流,2個序列化流,2個數據流。
//文件流 FileInputStream //字節輸入流 FileOutPutStream //字節輸出流 FileReader //字符輸入流 FileWriter //字符輸出流 //緩衝流 BufferedInputStream //字節輸入緩衝流 BufferedOutputStream //字節輸出緩衝流 BufferedReader //字符輸入緩衝流 BufferedWriter //字符輸出緩衝流 //序列化流 ObjectInputStream ObjectOutputStream //轉換流(字符流) 將字節流轉換爲字符流 InputStreamReader OutputStreamWriter //數據流 DataInputStream DataOutputStream //打印流 PrintWriter PrintStream
輸入輸出方向
對於IO流而言,IO(input Output)輸入輸出的意思。在輸入輸出之間我們需要找一個參照物,然後判斷相對於參照物而言是輸入還是輸出。而我們一般會把內存作爲參照物。當我們打開一個應用程序時,計算機會把那個應用程序加載到內存,然後等待CPU執行,對內存就相當於輸入。當我們寫代碼時,代碼首先會進內存裏面,按下Ctrl+S時,計算機會將內存中的代碼保存到硬盤中,對內存而言就相當與輸出。帶有Input Reader輸入(讀),Output Writer輸出(寫)。
字節流和字符流
Stream表示基於字節流,Writer和Reader表示基於字符流。
用字節流FileInputStream和FileOutputStream來讀寫文件
package FileStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class File_Stream {
public static void main(String[] args) throws IOException {
Scanner sca=new Scanner(System.in);
//寫文件
System.out.print("請輸入文件名:");
String name=sca.next();
File file=new File(name+".txt");//文件名 相對路徑(項目名根目錄下)
// FileOutputStream fs=new FileOutputStream(file); //如果文件存在 覆蓋
FileOutputStream fos=new FileOutputStream(file,true);//true表示追加,如果文件存在 向裏面繼續添加內容
System.out.println("請輸入寫入的內容:");
String str=sca.next();
byte bytes[]=str.getBytes(); //FileOutputStream 是基於字節流 把要寫入的信息 保存到字節數組中
fos.write(bytes,0,bytes.length);//將字節數組中全部內容寫到文件中 從0—數組的長度
fos.close();//關閉流
System.out.println("文件寫入成功!");
//讀文件
FileInputStream fis=new FileInputStream(file);
byte bt[]=new byte[1024];//1KB 每次最多讀取的1KB 根據文件大小而定
int temp=0;
while((temp=fis.read(bt))!=-1){ //將數據保存到數組(緩衝區)中 並返回讀取的字節數 -1表示讀完了
System.out.println(new String(bt,0,temp));//輸出數組中保存內容 按照每次讀取的字節數
}
fis.close();
}
}
運行結果:
由於FileInputStream和FileOutputStream是基於字節流的,所以每次都需要定義byte數組對讀寫進行操作。
PS:如果單獨讀取一個文件時,出現了亂碼。可能是字符集不同,Eclipse默認爲GBK,IDEA默認爲UTF-8,改成對應的字符集即可。
用字節流FileInputStream和FileOutputStream來Copy文件
package FileStream;
import java.io.*;
public class File_Copy {
public static void main(String[] args) throws IOException {
File file=new File("dome.txt");
if(!file.isFile()){ //判斷文件是否存在
System.out.println("該文件不存在,無法Copy!");
return;
}
FileInputStream fis=new FileInputStream(file); //"src\\"+file.getName()
FileOutputStream fos=new FileOutputStream("src/"+file.getName());//把文件拷(輸出)到src下
byte bytes[]=new byte[1024];
int temp=0; //邊讀邊寫
while((temp=fis.read(bytes))!=-1){ //讀
fos.write(bytes,0,temp); //寫
}
fis.close();
fos.close();
System.out.println("文件拷貝成功!");
}
}
運行結果:
在Copy文件的時候,只需要將FileInputStream和FileOutputStream一起使用,邊讀邊寫,就可以達到Copy文件的目的。
每日雞湯:比你優秀的人仍在努力,比你差的人還沒放棄,你沒還有什麼藉口不堅持下去。
Over!