黑马程序员—java基础_IO流—字符流

------- android培训java培训、期待与您交流! ----------

1.分类基类:

字符流:Reader Writer用于操作纯文本文档

2.创建一个文件并写入一些文字数据

(1)创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件,而且该文件会被创建到指定目录下,如果该目录下已有同名文件,将被覆盖。

FileWriter fw=new FileWriter(“c:\\demo.txt”);

FileWriter fw=new FileWriter("c:\\demo.txt",true)传true参数代表不覆盖已有文件,并在已有文件的末尾处进行数据续写。

(2)调用write方法,将字符串写入到流中

fw.write("abcdef");

(3)刷新流对象中的缓冲的数据

fw.flush();

(4)关闭流资源,关闭之前会刷新一次内部缓冲中的数据,将数据刷到目的地中

fw.close();

3.异常处理:在新建、写和关闭操作中都会出现IOException异常,需要进行处理

FileWriter fw = null;//FileWriter指向空
//会出问题的代码
try
{
	fw = new FileWriter("demo.txt");
	fw.write("abcdefg");

}
catch (IOException e)//捕获异常处理
{
	System.out.println("catch:"+e.toString());
}
finally//将资源关闭代码放在finally中,进行资源释放
{
	try
	{
		if(fw!=null)
			fw.close();//close异常进行独立的处理,有几个close要分别进行处理。				
	}
	catch (IOException e)
	{
		System.out.println(e.toString());
	}
			
}		
4.文件读取操作

(1)创建一个文件读取流对象,和指定名称的文件相关联,要保证文件是已经存在的,如果不存在会发生FileNotFoundException异常

FileReader fr=new FileReader(“demo.txt”);

(2)调用读取流对象的read方法

fr.read();一次读一个字符,可以采用循环语句:

while(true)
{
	int ch=fr.read();
	if(ch==-1)//最后一个字符会返回-1,可以判断结束<span style="white-space:pre">	</span>
		break;
	System.out.println("ch="+(char)ch);
}
//定义一个字符数组。用于存储读到字符。
//该read(char[])返回的是读到字符个数。
char[] buf = new char[1024];//1024的整数倍
int num = 0;
while((num=fr.read(buf))!=-1)
{
<span style="white-space:pre">	</span>System.out.println(new String(buf,0,num));
}

(3)关闭读取流

fr.close();

5.将c盘一个文本文件复制到d盘

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyText {

	/**
	 * 将C盘一个文本文件复制到D盘。
	 * 其实就是将C盘下的文件数据存储到D盘的一个文件中。
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}
	public static void copy()
	{
		//创建两个流对象,一个读一个写
		FileWriter fw = null;
		FileReader fr = null;
		try
		{
			fw = new FileWriter("d:\\SystemDemo_copy.txt");
			fr = new FileReader("c:\\SystemDemo.java");
			
			//创建一个数组存储读到的字符
			char[] buf = new char[1024];

			int len = 0;
			while((len=fr.read(buf))!=-1)
			{
				fw.write(buf,0,len);//将数组里面的字符写到字符流中
			}
		}
		catch (IOException e)
		{
			throw new RuntimeException("读写失败");

		}
		finally
		{
			if(fr!=null)
				try
				{
					fr.close();
				}
				catch (IOException e)
				{
					throw new RuntimeException("读资源关闭失败");
				}
			if(fw!=null)
				try
				{
					fw.close();
				}
				catch (IOException e)
				{
					throw new RuntimeException("写资源关闭失败");
				}
		}
	}
}
6.缓冲技术(BufferedWriter和BufferedReader)

BufferedWriter缓冲区的出现是为了提高流的操作效率而出现的,所以在创建缓冲区之前,必须要先有流对象。newLine()换行符

//创建一个字符写入流对象。
FileWriter fw = new FileWriter("buf.txt");

//为了提高字符写入流效率。加入了缓冲技术,只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。
BufferedWriter bufw = new BufferedWriter(fw);
for(int x=1; x<5; x++)
{
	bufw.write("abcd"+x);
	bufw.newLine();
	bufw.flush();
}
bufw.close();//<span style="font-family: Arial, Helvetica, sans-serif;">其实关闭缓冲区,就是在关闭缓冲区中的流对象。</span>

字符读取流缓冲区:提供一个一次读一行饿方法readLine,方便对文本数据的获取,当返回null,表示读到末尾

//创建一个读取流对象和文件相关联。
FileReader fr = new FileReader("buf.txt");
//为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。
BufferedReader bufr = new BufferedReader(fr);		
String line = null;
while((line=bufr.readLine())!=null)
{
	System.out.print(line);
}
bufr.close();
练习:通过缓冲区复制一个.java文件

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyByBuf {

	/**
	 * 通过缓冲区复制一个.java文件。
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BufferedReader bufr = null;
		BufferedWriter bufw = null;

		try
		{
			//创建读取流缓冲区并与文件BufferedWriterDemo.java相关联
			bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java"));
			//创建写入流缓冲区文件名为bufWriter_Copy.txt
			bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));

			String line = null;

			while((line=bufr.readLine())!=null)//读取一行
			{
				bufw.write(line);//将读取到的一行字符写入缓冲区
				bufw.newLine();//换行
				bufw.flush();//刷新缓冲区

			}
		}
		catch (IOException e)
		{
			throw new RuntimeException("读写失败");
		}
		finally
		{
			try
			{
				if(bufr!=null)
					bufr.close();
			}
			catch (IOException e)
			{
				throw new RuntimeException("读取关闭失败");
			}
			try
			{
				if(bufw!=null)
					bufw.close();
			}
			catch (IOException e)
			{
				throw new RuntimeException("写入关闭失败");
			}
		}
	}

}

7.装饰设计模式

当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强的功能。那么自定义的类称为装饰类。

装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。

装饰模式比继承要灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系。

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能,所以装饰类和被装饰类通常是都属于一个体系中。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值