黑马程序员_java_IO流_FileWriter_FileReader_BufferedWriter_BufferedReader_IO异常

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



一、IO概述


IO流用来处理设备之间的数据传输
java对数据的操作是通过流的方式
java用于操作流的对象都在IO包中
流按照操作数据分为两种流:字节流和字符流
流按流向分为:输入流,输出流






二、FileWriter类的基本应用


/*
IO有四个基类字节流两个基类:
InputStream  OutputStream


字符流两个基类
Reader Writer


字符流的特点:
既然IO流是用于操作数据的。
那么数据的最常见体现形式就是:文件


那么先以操作的文件为主来演示。
需求:
在硬盘上,创建一个文件并写入一些文字数据。
找到一个专门用于操作文件的Writer子类对象。  FileWriter. 后缀名是父类名,前缀名是该流对象的功能。




*/
import java.io.FileWriter;
import java.io.IOException;


class FileWriterDemo 
{
	public static void main(String[] args) throws IOException
	{
		/*
		创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件
		而且该文件会被创建多指定目录下,如果该目录下已有同名文件,将被覆盖。
		其实该步就是在明确数据要存放的目的地
		*/
		FileWriter fw = new FileWriter("hello.txt");
		
		//调用write方法,将字符串写入到流中
		fw.write("大家好");


		/*
		刷新对象中的缓冲区中的数据。
		将数据刷到目的地中。
		*/
		//fw.flush();


		/*
		关闭流资源,但是关闭之前会刷新一次内部的缓冲区中的数据。
		将数据刷新到目的地中。和flush区别:flush刷新后,流可以继续使用。close刷新后,会将流关闭。
		*/
		fw.close();
	}
}


三、FileReader类的基本应用


import java.io.FileReader;
import java.io.IOException;
import java.io.FileNotFoundException;


class FileReaderDemo 
{
	public static void main(String[] args) 
	{
		//创建一个文件读取流对象,和指定名称的文件想关联。
		//要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException
		FileReader fr = null;
		//diYi(fr);
		diEr(fr);
	}


	//第一种读取方式,运用字符读取
	public static void diYi(FileReader fr)
	{
		try
		{
			fr = new FileReader("Demo.txt");
			int num = 0; //定义变量。记录读取的元素个数
			try
			{
				//调用读取流的read方法,   read();一次读取一个字符,而且会自动往下读。
				while((num = fr.read()) != -1) //只要文本中还有文字就一直读取
				{
					System.out.println("cha" + (char)num); //把读取的文字强转成字符打印输出
				}
			}
			catch (IOException e) //处理异常
			{
				System.out.println(e.toString());
			}
			
		}
		catch (FileNotFoundException e) //处理异常
		{
			System.out.println(e.toString());
		}
		finally
		{
			if(fr != null) //如果fr不为空才会往下执行
				try
				{
					fr.close(); //关闭资源
				}
				catch (IOException e) //处理异常
				{
					System.out.println(e.toString());
				}
		}
	}


	//第二种读取方式,运用字符读取
	public static void diEr(FileReader fr)
	{
		try
		{
			fr = new FileReader("demo.txt"); //对fr进行实例化


			//定义一个字符数组,用于存储读到的字符
			//该read(char[])返回的是读取到的字符串的个数
			char[] ch = new char[1024]; 
			int num = 0; //记录住打印的字符个数
			try
			{
				while((num = fr.read(ch)) != -1) //判断。只要字符还有就一直打印
				{ 
					System.out.println(new String(ch, 0, num)); //把int强转成字符串打印输出
				}	
			}
			catch (IOException e) //处理异常
			{
				System.out.println(e.toString());
			}
			
		}
		catch (FileNotFoundException e) //处理异常
		{
			System.out.println(e.toString());
		}
		finally
		{
			if(fr != null) //判断只要fr是否被初始化过
				try
				{
					fr.close(); //关闭资源
				}
				catch (IOException e) //处理异常
				{
					System.out.println(e.toString());
				}
		}
	}


}



四、BufferedWrider类的基本应用


/*
缓冲区的出现是为了提高流的操作效率而出现的。
所以咋i创建缓冲区执勤啊,必须要现有流对象。
该缓冲区中提供了一个跨平台的换行符
newLine();
*/
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;


class BufferedWriterDemo
{
	public static void main(String[] args)
	{
		//创建一个字符写入流对象
		FileWriter fw = null;


		//为了提高字符写入了效率,加入了缓冲技术。
		//只要将需要被提高效率的流对象作为参数传递个缓冲区的构造函数即可。
		BufferedWriter bufw = null;
		try
		{
			fw = new FileWriter("Demo.txt");
			bufw = new BufferedWriter(fw);
			for(int i = 0; i < 6; i++)
			{
				bufw.write("abcd" + i);
				bufw.newLine();
			}
		}
		catch (IOException e)
		{
			throw new RuntimeException("读入失败");
		}
		finally
		{
			if(bufw != null);
			try
			{
				//记住,只要用到缓冲区,就要记得刷新。
				bufw.close();
			}
			catch (IOException e)
			{
				throw new RuntimeException("读入失败");
			}
		}
	}
}


五、BufferedReader类的基本应用


/*
字符串读取流缓冲区
该缓冲区提供了一个一次读一行的方法readLine(), 方便于对文本数据的获取。
当返回null时,表示读到文件末尾。
readLine方法返回的时候只返回回车符之前的数据内容,并不返回回车符
*/
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;


class BufferedReaderDemo 
{
	public static void main(String[] args) 
	{
		//创建一个读取流对象和文件关联
		FileReader fr = null;


		//为了提高效率,假如缓冲区技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。
		BufferedReader bufr = null;
		try
		{
			fr = new FileReader("Demo.txt");
			bufr = new BufferedReader(fr);
			String num = null; //定义一个空的字符串
			while((num = bufr.readLine()) != null) //判断当读取到空的时候停止循环
			{
				System.out.println(num);	
			}
		}
		catch (IOException e) //处理异常
		{
			throw new RuntimeException("读取失败");
		}
		finally
		{
			if(bufr != null) //判断bufr是否被实例化
				try
				{
					bufr.close(); //关闭资源
				}
				catch (IOException e) 
				{
					throw new RuntimeException("读取失败"); //处理异常
				}
		}
	}
}



六、IO异常的处理方式


/*
IO异常的处理方式
*/
import java.io.FileWriter;
import java.io.IOException;


class FileWriterDemo1 
{
	public static void main(String[] args) 
	{
		//创建文本
		FileWriter fw = null;


		//把可能会出现的异常进行try{}chach{}捕获处理
		try
		{
			fw = new FileWriter("demo.txt"); //对文本进行初始化
			fw.write("大家好"); //往文本中添加内容
		}
		catch (IOException e)
		{
			System.out.println(e.toString()); //处理异常
		}
		finally
		{
			//因为关闭资源的时候有可能出现异常。必须对其进行捕获
			try
			{
				if(fw != null) //判断一下。只有当文本创建成功后才能进行关闭
					fw.close(); //关闭资源
			}
			catch (IOException e)
			{
				System.out.println(e.toString());
			}
		}
	}
}


七、装饰类概述


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


示例代码:
class Person //定义一个类
{
	public void chiFan()
	{
		System.out.println("chifan");
	}
}


class SuperPerson //对类进行装饰
{
	private Person p;
	SuperPerson(Person p)
	{
		this.p = p;
	}


	public void chiFan()
	{
		System.out.println("抽根烟");
		p.chiFan();
		System.out.println("躺一会");
	}
}


class  
{
	public static void main(String[] args) 
	{
		Person p = new Person();
		p.chiFan();
		SuperPerson sp = new SuperPerson(p);
		sp.chiFan();
	}
}





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


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


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






八、给读取内容添加行号自定义


import java.io.Reader;
import java.io.FileReader;
import java.io.IOException;


class MyLineNumberReader
{
	private int numberReader;
	private Reader r;
	MyLineNumberReader(Reader r)
	{
		this.r = r;
	}


	//写一个读取行的函数
	public String myReadLine() throws IOException
	{
		//读取行之前想让行号自增
		numberReader++;
		//建一个容器
		StringBuffer sb = new StringBuffer();
		int num = 0; //记录取出的长度
		while((num = r.read()) != -1) //只要还有字符就一直读下去。
		{
			if(num == '\r')
				continue;
			else if(num == '\n')
				return sb.toString(); //如果碰到换行符。就把数据反出去
			else
				sb.append((char)num); //如果没有以上情况。就把数据存入到容器中
		}
		if(sb.length() != 0) //只要容器中还有数据。就把数据反出去
			return toString();
		return null; //如果没有数据则返回空
	}


	//提供关闭资源的方法
	public void myClose() throws IOException
	{
		r.close();
	}


	//提供修改行号的方法
	public void setLineNumberReader(int numberReader)
	{
		this.numberReader = numberReader;
	}


	//获取行号
	public int getNumberReader()
	{
		return numberReader;
	}
}


class MyNumberReaderDemo
{
	public static void main(String[] args)
	{
		//和要读取的数据建立关联
		FileReader fr = null;
		MyLineNumberReader mr = null;
		try
		{
			fr = new FileReader("BufferedCopy.java");
			mr = new MyLineNumberReader(fr);
			mr.setLineNumberReader(200);
			String len = null;
			while((len = mr.myReadLine()) != null)
			{
				System.out.println(mr.getNumberReader() + "::::" + len);
			}
		}
		catch (IOException e)
		{
			throw new RuntimeException("读取失败");
		}
		finally
		{
			if(mr != null)
				try
				{
					mr.myClose();
				}
				catch (IOException e)
				{
					throw new RuntimeException("读取失败");
				}
		}
	}
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章