1. 程式人生 > >Java基礎---字元流

Java基礎---字元流

package day21;
/*
 
位元組流:
輸入位元組流:


-----------|InputStream 輸入位元組流的基類 抽象類
--------------|FileInputStream 讀取檔案資料的輸入位元組流
--------------|BufferedInputStream 緩衝輸入位元組流   緩衝輸入位元組流的目的:為了提高讀取檔案資料的效率。該類其實內部就是維護一個8kb位元組的陣列




輸出位元組流:


----------|OutputStream 輸出位元組流的基類。抽象類。
-------------|FileOutStream  向檔案輸出資料的輸出位元組流。
-------------|BufferedOutputStream 緩衝輸出位元組流。該類出現的目的是為了提高寫資料的速率。其實該類內部也是維護了一個8kb的陣列而已


呼叫write方法的時候資料預設是向它內部的陣列中儲存的,只有呼叫flush方法或者close方法或者是8kb的位元組陣列儲存滿資料的時候才會真正的向硬碟輸出。
 */
public class Demo1 {


public static void main(String[] args) {
// TODO Auto-generated method stub


}


}




package cn.itcast.reader;




import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


public class Demo1 {


public static void main(String[] args) throws IOException {
writeTest();
readTest();
}

public static void readTest() throws IOException{
//找到目標檔案
File file = new File("F:\\a.txt");
//建立資料的輸入通道
FileInputStream fileInputStream = new FileInputStream(file);
   //讀取內容
/*
int content = 0;
while((content = fileInputStream.read())!=-1){//出現亂碼的原因:一箇中文GBK碼錶中預設是佔兩個位元組,
  System.out.println((char)content);                                       //目前你只讀取了一個位元組而已。所以不是一個完整的中文。

}
*/

byte[] buf = new byte[2];
for(int i = 0;i<3;i++){
fileInputStream.read(buf);
System.out.print(new String(buf));
}
//關閉資源流
fileInputStream.close();
}

//使用位元組流寫中文。位元組流之所以能夠寫中文是因為藉助了字串的getBytes方法對字串進行了編碼(字元----》數字)
public static void writeTest() throws IOException{


//使用位元組流寫中文。
File file = new File("F:\\a.txt");
//建立資料的輸出通道
FileOutputStream fileOutputStream = new FileOutputStream(file);

    //準備資料,把資料寫出。
String data = "大家好";
byte[] buf = data.getBytes();//把字串轉換成位元組陣列

fileOutputStream.write(buf);
//關閉資源
fileOutputStream.close();
}
}




package cn.itcast.reader;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;


/*
位元組流:位元組流讀取的是檔案中的二進位制資料,讀到的資料並不會幫你轉換成你看得懂的字元。 
 
字元流: 字元流會把讀取到的二進位制的資料進行對應 的編碼與解碼工作。   字元流 = 位元組流 + 編碼(解碼)
 
輸入字元流:
----------| Reader 輸入字元流的基類   抽象類
-------------| FileReader 讀取檔案的輸入字元流。




FileReader的用法:
1. 找到目標檔案
2. 建立資料的輸入通道
3. 讀取資料
4. 關閉資源




 */
public class Demo2 {


public static void main(String[] args) throws IOException {
readTest2();
}

//使用緩衝字元陣列讀取檔案。
public static void readTest2() throws IOException{
//找到目標檔案
File file = new File("F:\\1208project\\day21\\src\\day21\\Demo1.java");
// 建立資料的輸入通道
FileReader fileReader = new FileReader(file);
//建立緩衝字元陣列讀取檔案資料
char[] buf = new char[1024];
int length = 0 ; 
while((length = fileReader.read(buf))!=-1){
System.out.print(new String(buf,0,length));
}
}




public static void readTest1() throws IOException{
//找到目標檔案
File file = new File("F:\\1208project\\day21\\src\\day21\\Demo1.java");
//建立資料的輸入通道
FileReader fileReader = new FileReader(file);
int content = 0 ;
while((content = fileReader.read())!=-1){ //每次只會讀取一個字元,效率低。
System.out.print((char)content);
}
//關閉資源
fileReader.close();
}

}



package cn.itcast.writer;


import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;


/*
輸出字元流:


------| Writer 輸出字元流的基類。 抽象類
-----------| FileWriter 向檔案資料資料的輸出字元流


FileWriter的使用步驟:
1. 找到目標檔案。
2. 建立資料輸出通道
3. 寫出資料。
4. 關閉資源

FileWriter要注意的事項:
1. 使用FileWriter寫資料的時候,FileWriter內部是維護了一個1024個字元陣列的,寫資料的時候會先寫入到它內部維護的字元陣列中,如果需要
把資料真正寫到硬碟上,需要呼叫flush或者是close方法或者是填滿了內部的字元陣列。
2. 使用FileWriter的時候,如果目標檔案不存在,那麼會自動建立目標檔案。
3.使用FileWriter的時候, 如果目標檔案已經存在了,那麼預設情況會先情況檔案中的資料,然後再寫入資料 , 如果需要在原來的基礎上追加資料,
需要使用“new FileWriter(File , boolean)”的構造方法,第二引數為true。



練習: 使用字元流拷貝一個文字檔案(java檔案). 
接著使用字元流拷貝一個圖片(觀察圖片的大小變化,思考為什麼會這樣子??)


 */
public class Demo1 {


public static void main(String[] args) throws IOException {
writeTest1();
}

public static void  writeTest1() throws IOException{
//找到目標檔案
File file = new File("F:\\a.txt");
//建立資料輸出通道
FileWriter fileWriter = new FileWriter(file,true);
//準備資料,把資料寫出
String data = "今天天氣非常好!!";
fileWriter.write(data);  //字元流具備解碼的功能。
//重新整理字元流
// fileWriter.flush();
//關閉資源
fileWriter.close();



}
}




package cn.itcast.writer;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


//使用位元組流讀取中文
public class Demo2 {


public static void main(String[] args) throws IOException {
File file = new File("F:\\a.txt");
FileInputStream fileInputStream = new FileInputStream(file);
byte[] buf = new byte[1024];//陣列長度小於文件內容時會出現部分亂碼
int length = 0;
while((length = fileInputStream.read(buf))!=-1){
System.out.println(new String(buf,0,length)); //借用字串的解碼功能。
}


}


}




package cn.itcast.writer;


import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
 何時使用字元流?何時使用位元組流?依據是什麼?
 
使用字元流的應用場景:如果是讀寫字元資料的時候則使用字元流
使用位元組流的應用場景: 如果讀寫的資料都不需要轉換成字元的時候,則使用位元組流。
 
 */
//使用字元流拷貝檔案
public class CopyImage {


public static void main(String[] args) throws IOException {
// 找到目標檔案
File inFile = new File("F:\\1.jpg");
File outFile = new File("e:\\1.jpg");
//建立資料的輸入輸出通道
FileReader fileReader = new FileReader(inFile);
FileWriter fileWriter = new FileWriter(outFile);
//建立緩衝字元陣列進行邊讀邊寫
char[] buf = new char[1024];
int length = 0;
while((length = fileReader.read(buf))!=-1){
fileWriter.write(buf,0,length);
}
//關閉資源
fileWriter.close();
fileReader.close();


}


}




package cn.itcast.buffered;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;


/*
輸入字元流:
-------| Reader 所有輸入字元流的基類。 抽象類
----------| FileReader 讀取檔案字串的輸入字元流。
----------| BufferedReader   緩衝輸入字元流  。 緩衝 輸入字元流出現的目的是為了提高讀取檔案 的效率和拓展了FileReader的功能。  其實該類內部也是維護了一個字元陣列


記住:緩衝流都不具備讀寫檔案的能力。


BufferedReader的使用步驟:
1.找到目標檔案
2 .建立資料的輸入通道。






 */
public class Demo1 {


public static void main(String[] args) throws IOException {
// readTest1();
File file  = new File("F:\\安裝包\\Java\\day21\\src\\cn\\itcast\\buffered\\Demo1.java");
//建立資料的輸入通道。
FileReader fileReader = new FileReader(file);
String line =  null;

while((line = myReadLine(fileReader))!=null){
System.out.println(line);
}
}



//自己去實現readLine方法。
public static String myReadLine(FileReader fileReader) throws IOException{
//建立一個字串緩衝類物件
StringBuilder sb = new StringBuilder();  //StringBuilder主要是用於儲存讀取到的資料
int content = 0 ;
while((content = fileReader.read())!=-1){
if(content=='\r'){
continue;
}else if(content=='\n'){
break;
}else{
//普通字元
sb.append((char)content);
}
}
//代表已經讀取完畢了。
if(content ==-1){
return null;
}

return sb.toString();  
}







public static void readTest1() throws IOException{
//找到目標檔案
File file  = new File("F:\\a.txt");
//建立資料的輸入通道。
FileReader fileReader = new FileReader(file);
//建立緩衝輸入字元流
BufferedReader bufferedReader = new BufferedReader(fileReader);
//讀取資料
/*int content = bufferedReader.read();  //讀到了一個字元。 讀取到的字元肯定也是從Bufferedreader內部的字元陣列中獲取的到。所以效率高。
System.out.println((char)content);*/
//使用BUfferedReader拓展的功能,readLine()  一次讀取一行文字,如果讀到了檔案的末尾返回null表示。
String line =  null;
while((line = bufferedReader.readLine())!=null){ // 雖然readLine每次讀取一行資料,但是但會的line是不包含\r\n的、
System.out.println(Arrays.toString("aaa".getBytes()));
}
//關閉資源
bufferedReader.close();

}

}




package cn.itcast.buffered;


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;


/*
 
 輸出字元流:
 --------|Writer  所有輸出字元流的基類  抽象類
 -----------|FileWriter向檔案輸出字元資料的輸出字元流。
 -----------|BufferedWriter 緩衝輸出字元流   緩衝輸出字元流的作用:提高FileWriter的寫資料效率與拓展FileWriter的功能。
 BufferedWriter內部只不過提供了一個8192長度的字元陣列作為緩衝區而已,拓展了FileWriter的功能
 BuffereddWriter如何使用:
   1.找到目標檔案
   2.建立資料的輸出通道
   
   
  緩衝輸入輸出字元流使用者登入註冊。。。。
 */
public class Demo2 {
public static void main(String[] args) throws IOException{
//找到目標檔案
File file = new File("F:\\a.txt");
//建立資料的輸出通道
FileWriter fileWriter = new FileWriter(file,true);
//建立緩衝輸出流的物件
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
//寫出資料
bufferedWriter.newLine();//newLine()換行,實際上就是想檔案輸出\r\n
bufferedWriter.write("前兩天likeqin!!");
//關閉資源
bufferedWriter.flush();
//bufferedWriter.close();
}


}





package cn.itcast.buffered;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;


/*
練習: 緩衝輸入輸出字元流使用者登陸註冊...

*/
public class Login {

static Scanner scanner = new Scanner(System.in);


public static void main(String[] args) throws IOException {
while(true){
System.out.println("請選擇功能: A(註冊)   B(登陸)");
String option =  scanner.next();
if("a".equalsIgnoreCase(option)){
//註冊
reg();

}else if("b".equalsIgnoreCase(option)){
//登陸
login();

}else{
System.out.println("你的輸入有誤,請重新輸入...");
}
}
}


//登陸
public static void login() throws IOException{
System.out.println("請輸入使用者名稱:");
String userName = scanner.next();
System.out.println("請 輸入密碼:");
String password = scanner.next();
String info = userName+" "+ password;
//讀取檔案的資訊,檢視是否有該使用者的資訊存在,如果存在則登陸成功。
//建立資料的輸入通道
//建立緩衝輸入字元流
BufferedReader bufferedReader = new BufferedReader(new FileReader("F:\\users.txt"));
String line = null;

boolean isLogin = false; // 用於記錄是否登陸成功的標識, 預設是登陸失敗的。
//不斷的讀取檔案的內容
while((line = bufferedReader.readLine())!=null){
if(info.equals(line)){
isLogin = true;
break;
}
}

if(isLogin){
System.out.println("歡迎"+userName+"登陸成功...");
}else{
System.out.println("不存在該使用者資訊,請註冊!!");
}



}




//註冊
public static void reg() throws IOException{
System.out.println("請輸入使用者名稱:");
String userName = scanner.next();
System.out.println("請 輸入密碼:");
String password = scanner.next();
String info = userName+" "+ password;
//把使用者的註冊的資訊寫到檔案上
File file = new File("F:\\users.txt");
FileWriter fileWriter = new FileWriter(file,true);
//建立緩衝輸出字元流
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
//把使用者資訊寫出

bufferedWriter.write(info);
bufferedWriter.newLine();
//關閉資源
bufferedWriter.close();

}


}