这几天再次学习了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);
}
}
}
~~~