Java文件讀寫操作具體代碼實現
import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader;/**
- 一、BufferedReader類 public class BufferedReader extends Reader
- 從字符輸入流中讀取文本,緩沖各個字符,從而實現字符、數組和行的高效讀取。 可以指定緩沖區的大小,或者可使用默認的大小。大多數情況下,默認值足夠大。
- 通常,Reader 所作的每個讀取請求都會導致對底層字符或字節流進行相應的讀取請求。因此,建議用 BufferedReader包裝所有其 read()
- 操作可能開銷很高的 Reader(如 FileReader和 InputStreamReader)。
- BufferedReader流能夠讀取文本行,通過向BufferedReader傳遞一個Reader對象
- ,來創建一個BufferedReader對象,之所以這樣做是因為FileReader沒有提供讀取文本行的功能. *
- 二、InputStreamReader類 *
- InputStreamReader 將字節流轉換為字符流。是字節流通向字符流的橋梁。如果不指定字符集編碼,該解碼過程將使用平臺默認的字符編碼,如:GBK。 *
- 構造方法: *
- InputStreamReader isr = new InputStreamReader(InputStream
- in);//構造一個默認編碼集的InputStreamReader類 *
- InputStreamReader isr = new InputStreamReader(InputStream in,String
- charsetName);//構造一個指定編碼集的InputStreamReader類。 *
- 參數 in對象通過 InputStream in = System.in;獲得。//讀取鍵盤上的數據。 *
- 或者 InputStream in = new FileInputStream(String fileName);//讀取文件中的數據。可以看出
- FileInputStream 為InputStream的子類。 *
- 主要方法:int read();//讀取單個字符。 int read(char []cbuf);//將讀取到的字符存到數組中。返回讀取的字符數。 *
- 三、FileWriter(少量文字) 和 BufferedWriter(大量文字)實現簡單文件寫操作
@author hulk */ public class FileReadWriteUtil {
// "D:\demo.txt" private static String PATH = "/home/hulk/devtools/adt-bundle-linux-x86_64-20140702/workspace/JavaTest/readme.txt";// or private static boolean debugMode = true;
/**
@param args */ public static void main(String[] args) { // readSystemInputText();//讀取鍵盤輸入文字信息 // testBufferReader(); String aaaaPath = "/home/hulk/aaaa.txt"; String aaaPath = "/home/hulk/aaa.txt"; String text = readResourceFile(aaaaPath).toString();// 讀取文件資源 String appendtext = "\n\nAAAAAAAAAAAAaaaaaaaaaaaaaaaa\nBBBBBBBBBBBBBBBBbbbbbbbbbbbbb"; writeText(aaaPath, text, false); readResourceFile(aaaPath);// 讀取文件資源 }
private static void testBufferReader() { try {
readFileNoBuffer(PATH, 2048);// 不使用緩沖區 readFileByBuffer(PATH);// 使用緩沖區,適用于,讀取完整文件
} catch (IOException e) {
e.printStackTrace();
} }
public static void setDebugMode(boolean debugMode) { FileReadWriteUtil.debugMode = debugMode; }
/**
- 沒有緩沖區,只能使用read()方法,得指定要讀取的字符長度 *
@throws IOException */ public static String readFileNoBuffer(String path, int readChars)
throws IOException {
// 讀取字節流 // InputStream in = System.in;//讀取鍵盤的輸入。 InputStream in = new FileInputStream(path);// 讀取文件的數據。 // 將字節流向字符流的轉換。要啟用從字節到字符的有效轉換, // 可以提前從底層流讀取更多的字節. InputStreamReader isr = new InputStreamReader(in);// 讀取 char[] cha = new char[readChars]; int len = isr.read(cha); String text = new String(cha, 0, len); log(text); isr.close(); return text; }
/**
- 使用緩沖區 可以使用緩沖區對象的 read() 和 readLine()方法。 *
@throws IOException */ public static StringBuffer readFileByBuffer(String path) throws IOException { // 讀取字節流 InputStream in = new FileInputStream(path);// 讀取文件上的數據。 InputStreamReader isr = new InputStreamReader(in);// 將字節流向字符流的轉換 BufferedReader bufr = new BufferedReader(isr);// 創建字符流緩沖區 StringBuffer buffer = new StringBuffer(); String line; while ((line = bufr.readLine()) != null) {
buffer.append(line).append("\n"); log(line);
} isr.close(); return buffer; }
public static StringBuffer readText(String filePath) { BufferedReader br = null; StringBuffer buffer = null; try {
br = new BufferedReader(new FileReader(filePath)); String line = null; buffer = new StringBuffer(); while ((line = br.readLine()) != null) { buffer.append(line).append("\n"); log(line); }
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } }
} return buffer; }
public static StringBuffer readtextByChar(String filePath) { StringBuffer text = null; FileReader reader = null; try {
reader = new FileReader(filePath); int ch = 0; text = new StringBuffer(); while ((ch = reader.read()) != -1) { text.append((char)ch); }
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } }
} return text; }
/**
- 使用FileWriter類寫文本文件, 僅限制少量文字
- Note: //使用這個構造函數時,如果存在filePath.txt文件,則先把這個文件給刪除掉,然后創建新的filePath.txt
- @param filePath
- @param text
@return the FileWriter object, null if throws Exception */ public static FileWriter writeText(String filePath, String text) { return writeText(filePath, text, false); }
/**
- 使用FileWriter類寫文本文件
- @param filePath
- @param text
- @param append true: 如果存在filePath.txt文件,則直接在后面追加字符串; false: 直接刪除原文件
@return the FileWriter object, null if throws Exception */ public static FileWriter writeText(String filePath, String text, boolean append) { FileWriter writer = null; try {
writer = new FileWriter(filePath, append); writer.write(text);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(writer != null) { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } }
} return writer; }
/**
- 向文件寫入字符串。可以時較大字符串.
- 注意\n不一定在各種計算機上都能產生換行的效果:
- <p>可以用返回的BufferedWriter對象執行一下函數實現換行:
- BufferedWriter out = FileReadWriteUtil.writeByBuffer("/demo.txt", "AAA", true);
- out.newLine();//實現換行
- @param filePath
- @param text
@return The BufferedWriter object, null if throws Exception */ public static BufferedWriter writeBufferText(String filePath, String text, boolean append) { BufferedWriter out = null; try {
out = new BufferedWriter(new FileWriter(filePath, append)); out.write(text); out.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } }
} return out; }
public static boolean makeFile(String filePath) { File file = new File(filePath); if(!file.exists()) {
if(file.isFile()) { File p = file.getParentFile(); if(!p.exists()) { makeDir(p.getAbsolutePath()); } try { return file.createNewFile(); } catch (IOException e) { e.printStackTrace(); return false; } } else { System.out.print("Not a file path: " + filePath); return false; }
} else {
return true;
} }
public static boolean makeDir(String dir) { File p = new File(dir); if(!p.exists()) {
return p.mkdirs();
} else {
return true;
} }
/**
鍵盤輸入讀取文字信息 */ public static String readSystemInputText() { BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(System.in));
System.out.println("請輸入一系列文字,可包括空格,完成后按回車即可顯示出來:"); System.out.print("請在這里輸入文字:"); String text = null; try {
text = bufferedReader.readLine();
} catch (IOException e) {
e.printStackTrace();
} log("你輸入的文字為:" + text); return text; }
/**
- 按行讀取文件信息 *
- @param path
文件存放路徑,;如果文件在項目根目錄下,直接用文件名即可eg. "readme.txt" */ public static StringBuffer readResourceFile(String path) { StringBuffer buffer = null; try { // 讀取文件,并且以utf-8的形式寫出去 BufferedReader bufread; BufferedInputStream bis = getResourceInputStream(path); if (bis == null) return null; String read; bufread = new BufferedReader(new InputStreamReader((bis))); buffer = new StringBuffer(); while ((read = bufread.readLine()) != null) { buffer.append(read).append("\n"); log(read); } bufread.close(); bis.close(); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } return buffer; }
static BufferedInputStream getResourceInputStream(String filePath) { try { return new BufferedInputStream(new FileInputStream(filePath)); } catch (FileNotFoundException e) { e.printStackTrace(); } return null; }
private static void log(String text) { if (debugMode) { System.out.println(text); } } } </pre>