這幾天再次學習了IO的相關內容,感覺比以前的思路更加清晰了點。
IO按照流的分類可以分為字節流(XXXStream)和字符流(XXXRreader、XXXWriter)。
字符流主要是操作文本文件,這個在讀取文本文件時,比較常用寫。
因此下面是關于字符流的一些讀取方法。
FileWriter的方法:
~~~
import java.io.*;
public class FileWriterDemo{
public static void main(String args[]){
//創建對象,傳入一個true,表明不覆蓋文件,在文件后面繼續添加內容。
FileWriter fileWriter = null;
try{
fileWriter = new FileWriter("demo.txt",true);
fileWriter.write("hello");
}catch(IOException e){
System.out.println("catch:"+e.toString());
}finally{
try{
if(fileWriter!=null)
fileWriter.close();
}catch(Exception e){
System.out.println("----"+e.toString());
}
}
}
}
~~~
FileReader的方法
~~~
/**
總結兩種讀取文件內容的方法。
*/
import java.io.*;
import java.lang.*;
public class FileReaderDemo{
public static void main(String args[]){
String content = ReadByCharArray("demo.txt");
System.out.println(content);
}
//通過Read()方法來一個字符一個字符的讀取
public static String ReadByOne(String fileName){
FileReader fileReader = null;
StringBuffer sb = null;
try{
fileReader = new FileReader(fileName);
sb = new StringBuffer();
int ch = 0;
while((ch=fileReader.read())!=-1){
sb.append((char)ch);
}
}catch(IOException e){
System.out.println("catch:"+e.toString());
}finally{
try{
if(fileReader!=null)
fileReader.close();
}catch(Exception e){
System.out.println("----"+e.toString());
}
}
return sb.toString();
}
//通過read(char[] ch)方法來讀取字符數組
public static String ReadByCharArray(String fileName){
FileReader fileReader = null;
String str = null;
try{
fileReader = new FileReader(fileName);
char[] ch = new char[1024];
int num = 0;
while((num=fileReader.read(ch))!=-1){
str = new String(ch,0,num);
}
}catch(IOException e){
System.out.println("catch:"+e.toString());
}finally{
try{
if(fileReader!=null)
fileReader.close();
}catch(Exception e){
System.out.println("----"+e.toString());
}
}
return str;
}
}
~~~
帶緩沖區的字符流BufferedReader及BufferedWriter的用法
~~~
/**
為了提高文件的讀寫效率,java封裝一個BufferReader和bufferWriter類。
作為文件的緩沖
BufferReader:從字符輸入流中讀取文本,緩沖各個字符,從而實現字符、數組和行的高效讀取。
BufferWriter: 將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入。
*/
import java.io.*;
public class BufferedReaderDemo{
public static void main(String args[]){
boolean flag = copyByBuffered("demo.txt","buf.txt");
System.out.println("復制成功:"+flag);
}
//通過ReadLine()方法來讀取文件的一行數據
public static String ReadByReadLine(String fileName){
FileReader fileReader = null;
StringBuffer sb = null;
BufferedReader bufr = null;
try{
fileReader = new FileReader(fileName);
bufr = new BufferedReader(fileReader);
sb = new StringBuffer();
String line = null;
while((line=bufr.readLine())!=null){
sb.append(line);
}
}catch(IOException e){
System.out.println("catch:"+e.toString());
}finally{
try{
if(bufr!=null)
bufr.close();
}catch(Exception e){
System.out.println("----"+e.toString());
}
}
return sb.toString();
}
public static boolean copyByBuffered(String readFile,String writeFile){
boolean flag = false;
BufferedReader bufr = null;
BufferedWriter bufw = null;
try{
//定義BufferedReader緩沖區,讀取文件流
bufr = new BufferedReader(new FileReader(readFile));
//定義BufferedWriter緩沖區,向指定文件中寫入。
bufw = new BufferedWriter(new FileWriter(writeFile));
String line = null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.flush();
flag =true;
}
}catch(IOException e){
e.toString();
}finally{
try{
if(bufr!=null&&bufw!=null){
bufr.close();
bufw.close();
}
}catch(Exception e){
}
}
return flag;
}
}
~~~
模擬BufferedReader中readLine()的實現方法
~~~
/**
自定義一個MyBufferedReader類,模擬其中的readLine()方法。
一次讀取一行數據,這個是基于read()方法來實現的。
自定義實現原理:
1、通過FileReader中的read()一個個讀取文件中的字符。
2、將讀取的字符存到StringBuilder中。
3、當讀到\r時,不存入StringBuilder中,繼續向下讀取。
當\n時返回字符串,
4、為了簡便,所有異常都拋出
這種自定義類,稱為裝飾設計模式
*/
import java.io.*;
class myBufferedReader{
private FileReader fr;
public myBufferedReader(FileReader fr){
this.fr = fr;
}
public String myReadLine()throws IOException{
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=fr.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
//讀取到最后,返回空
return null;
}
//關閉流
public void myClose()throws IOException{
fr.close();
}
}
public class MyBufferedReaderDemo{
public static void main(String args[])throws IOException{
myBufferedReader mbr = new myBufferedReader(new FileReader("demo.txt"));
String line = null;
while((line=mbr.myReadLine())!=null){
System.out.println(line);
}
mbr.myClose();
}
}
~~~
模擬LineNumberReader中getLineNumber()的實現方法
~~~
/**
模擬一個帶行號的文件讀取緩沖區。
實現思路:
1、mySetLineNumber(int number)方法用于設置從第number開始計數。
2、myGetLineNumber()獲取讀取文件的行號。
3、定義一個public int number = 0;
4、當遇到\n時,代表這行結束number++;
*/
import java.io.*;
class myLineNumber extends myBufferedReader{
private int number=0;
public myLineNumber(FileReader fr){
super(fr);
}
public void mySetLineNumber(int number){
this.number = number;
}
public int myGetLineNumber(){
return this.number;
}
public String myReadLine()throws IOException{
number++;
return super.myReadLine();
}
}
public class LineNumberDemo{
public static void main(String []args)throws IOException{
myLineNumber mln = new myLineNumber(new FileReader("FileReaderDemo.java"));
String line = null;
mln.mySetLineNumber(20);
while((line = mln.myReadLine())!=null){
System.out.println(mln.myGetLineNumber()+":"+line);
}
}
}
~~~