1.1、簡述
IO:input/output
IO流用來處理設備之間的數據傳輸
java對數據的操作是通過流的方式
Java用于操作流的對象都在IO包中。
1.2、結構
字節流抽象類:
InputStream,OutputStream
字符流抽象類:
Reader、Writer。
ps:由這四4個派生出來子類名稱都是以父類名作為子類名的后綴
如:InputStream的子類FileInputStream
如:Reader的子類FileReader;
1.3、分類
按操作數據方式為兩種:字節流與字符流
按流向分:輸入流,輸出流
2.1、writer
寫入字符流的抽象類。子類必須實現的方法僅有 write(char[], int, int)、flush() 和 close()。但是,多數子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。
字段摘要 | |
---|---|
PRotected Object | lock 用于同步針對此流的操作的對象。 |
構造方法摘要 | |
---|---|
protected | Writer() 創建一個新的字符流 writer,其關鍵部分將同步 writer 自身。 |
protected | Writer(Object lock) 創建一個新的字符流 writer,其關鍵部分將同步給定的對象。 |
方法摘要 | |
---|---|
Writer | append(char c) 將指定字符添加到此 writer。 |
Writer | append(CharSequence csq) 將指定字符序列添加到此 writer。 |
Writer | append(CharSequence csq, int start, int end) 將指定字符序列的子序列添加到此 writer.Appendable。 |
abstract void | close() 關閉此流,但要先刷新它。 |
abstract void | flush() 刷新該流的緩沖。 |
void | write(char[] cbuf) 寫入字符數組。 |
abstract void | write(char[] cbuf, int off, int len) 寫入字符數組的某一部分。 |
void | write(int c) 寫入單個字符。 |
void | write(String str) 寫入字符串。 |
void | write(String str, int off, int len) 寫入字符串的某一部分。 |
3.1、FileWriter
構造方法摘要 | |
---|---|
FileWriter(File file) 根據給定的 File 對象構造一個 FileWriter 對象。 | |
FileWriter(File file, boolean append) 根據給定的 File 對象構造一個 FileWriter 對象。 | |
FileWriter(FileDescriptor fd) 構造與某個文件描述符相關聯的 FileWriter 對象。 | |
FileWriter(String fileName) 根據給定的文件名構造一個 FileWriter 對象。 | |
FileWriter(String fileName, boolean append) 根據給定的文件名以及指示是否附加寫入數據的 boolean 值來構造 FileWriter 對象。 |
package com.pb.io.demo1;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.Scanner;/* * close:關閉流,會將流關閉,不能再使用 * flush:flush刷新后,流可以繼續使用, */public class WriterDemo { public static void main(String[] args) { Scanner input=new Scanner(System.in); File file=null; //文件 FileWriter fw=null; //字符輸出流 try { file=new File("d:/demo.txt"); // fw=new FileWriter(file);//如果有這個文件就會覆蓋 //如果要追加到文件內容后面就使用true fw=new FileWriter(file,true); System.out.println("請輸入內容,請輸入 over后結束"); String str=null; //接收輸入的內容 char [] buf=new char[1024];//定義緩沖區大小 do{ str=input.nextLine(); buf=str.toCharArray();//轉換為字符數組 fw.write(buf); //將字符數組寫入 fw.flush();//刷新流 }while(!str.equals("over")); } catch (IOException e) { e.printStackTrace(); }finally{ //使用finally關閉流 try { if(fw!=null) fw.close(); } catch (IOException e) { e.printStackTrace(); } } System.out.println("寫入結束"); } }
3.2、FileReader
構造方法摘要 | |
---|---|
FileReader(File file) 在給定從中讀取數據的 File 的情況下創建一個新 FileReader。 | |
FileReader(FileDescriptor fd) 在給定從中讀取數據的 FileDescriptor 的情況下創建一個新 FileReader。 | |
FileReader(String fileName) 在給定從中讀取數據的文件名的情況下創建一個新 FileReader。 |
3.3示例 單個字符讀取
package com.pb.io.demo1;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;/* * 單個字符讀取 */public class FileReaderDemo { public static void main(String[] args) { File file=null; //文件 FileReader fr=null; //字符輸入流 try { file=new File("d:/demo.txt"); fr=new FileReader(file); int len=0;//接收讀出內容 while((len=fr.read())!=-1){ System.out.println((char)len); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { //關閉流 if(fr!=null) fr.close(); } catch (IOException e) { e.printStackTrace(); } } }}
3.4、示例 數組方式讀取 建議使用
package com.pb.io.demo1;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.Arrays;/* * 通過字符數組 讀取 */public class FileReaderDemo { public static void main(String[] args) { File file=null; //文件 FileReader fr=null; //字符輸入流 try { file=new File("d:/demo.txt"); fr=new FileReader(file); //接收讀出內容數組 char [] buf=new char [1024]; //一般為1024的整數倍 int len=0; while((len=fr.read(buf))!=-1){ //讀取內容到字符數組 System.out.println(new String(buf,0,len));//讀有多少,就輸出多少 } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { //關閉流 if(fr!=null) fr.close(); } catch (IOException e) { e.printStackTrace(); } } }}
4.1、字符輸入流和字符輸入流
package com.pb.io.demo1;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.util.Scanner;public class FileWriterAndFileReader { public static void main(String[] args) { File file = new File("d://demo.txt"); Output(file); input(file); } // 寫入文件 private static void Output(File file) { FileWriter fw = null; Scanner input = new Scanner(System.in); try { fw = new FileWriter(file, true); // 聲明變量來接收用戶輸入 System.out.println("請輸入要寫入的內容:輸入over結束"); String str = null; // 聲明緩沖區 char[] buf = new char[1024]; do { str = input.nextLine(); // 接收用戶輸入 buf = str.toCharArray(); // 轉換為數組 fw.write(buf, 0, buf.length);// 寫入 } while (!(str.equals("over"))); } catch (IOException e) { e.printStackTrace(); } finally { if (fw != null) { try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } } } // 讀寫文件 private static void input(File file) { FileReader fr = null; try { fr = new FileReader(file); // 定義字符數組 char[] buf = new char[1024];// 緩沖區大小 int len = 0;// 長度讀取的字符個數 while ((len = fr.read(buf)) != -1) { System.out.println(new String(buf, 0, len)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fr != null) { try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } } }}
4.2、復制文件
package com.pb.io.demo1;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;/** * 復制的原理 將一個文件存儲到另一個文件中 邊讀邊寫 先讀再寫 * */public class CopyFileDemo { public static void main(String[] args) { File soure = new File("d://demo.txt"); File objFile = new File("e://q.txt"); copy1(soure, objFile); copy2(soure, objFile); } /* * 讀一個復制一個 */ public static void copy1(File soure, File objFile) { FileReader fr = null; FileWriter fw = null; try { // 聲明讀,寫流對象 fr = new FileReader(soure); fw = new FileWriter(objFile,true); int ch = 0; int count=0; // 開始讀 while ((ch = fr.read()) != -1) { count++; System.out.println("正在讀取"+count+"行"); fw.write(ch); fw.write("/r/n"); //換行 System.out.println("正在寫入"+count+"行"); } System.out.println("讀寫完成"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fw != null) fw.close(); } catch (IOException e) { e.printStackTrace(); } try { if (fr != null) fr.close(); } catch (IOException e) { e.printStackTrace(); } } } /* * 數組方式讀取復制 */ public static void copy2(File soure, File objFile) { FileReader fr = null; FileWriter fw = null; try { // 聲明讀,寫流對象 fr = new FileReader(soure); fw = new FileWriter(objFile,true); int ch = 0; int count=0; char [] buf=new char[1024]; // 開始讀 while ((ch = fr.read(buf)) != -1) { count++; System.out.println("正在讀取"+count+"行"); fw.write(buf,0,ch); fw.write("/r/n"); //換行 System.out.println("正在寫入"+count+"行"); } System.out.println("讀寫完成"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fw != null) fw.close(); } catch (IOException e) { e.printStackTrace(); } try { if (fr != null) fr.close(); } catch (IOException e) { e.printStackTrace(); } } }}
新聞熱點
疑難解答