字符流以及字符流缓冲区实例

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




你可能感兴趣的:(java基础,java基础)