关于IO流

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

1、字符流基本认识

//这个是一个字符流读取的基本的使用方式,但是为方便阅读把异常直接抛出了
import java.io.*;

class  FileReaderDemo
{
	public static void main(String[] args) throws IOException
	{
		//创建一个文件读取流对象,和指定名称的文件相关联。
		//要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException
		FileReader fr = new FileReader("demo.txt");

		//调用读取流对象的read方法。
		//read():一次读一个字符。而且会自动往下读。
		int ch = 0;
		while((ch=fr.read())!=-1)
		{
			System.out.println(
		}
		fr.close();//关闭流,这也是会发生异常的
	}
}

这下面是一个字符流的写入方式,同样将异常直接抛出了


import java.io.*;
class  FileWriterDemo
{
	public static void main(String[] args) throws IOException
	{
		//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
		//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
		//其实该步就是在明确数据要存放的目的地。
		FileWriter fw = new FileWriter("demo.txt");

		//调用write方法,将字符串写入到流中。
		fw.write("abcde");
		//刷新流对象中的缓冲中的数据。
		//将数据刷到目的地中。
		//fw.flush();

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

2、关于字符流出现异常的处理

import java.io.*;

class  FileWriterDemo
{
	public static void main(String[] args) 
	{
		//因为fw对象后面还得用到,所以要放到try代码块的外面
		FileWriter fw = null;
		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();				
			}
			catch (IOException e)
			{
				System.out.println(e.toString());
			}
			
		}	
	}
}

3、关于字符流的缓冲区

字符读取流缓冲区:
该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。当返回null时,表示读到文件末尾。
要注意的是:readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。

//此处暂时忽略异常,直接抛出了
import java.io.*;

class  BufferedReaderDemo
{
	public static void main(String[] args) throws IOException
	{
		//创建一个读取流对象和文件相关联。
		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();
	}
}

//下面的是一个字符写入流的缓冲区
import java.io.*;

class  BufferedWriterDemo
{
	public static void main(String[] args) throws IOException
	{
		//创建一个字符写入流对象。
		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.flush();

		//其实关闭缓冲区,就是在关闭缓冲区中的流对象。
		bufw.close();
	}
}

4、应用字节流的缓冲
复制一个图片
思路:
1,用字节读取流对象和图片关联。
2,用字节写入流对象创建一个图片文件。用于存储获取到的图片数据。
3,通过循环读写,完成数据的存储。
4,关闭资源。

import java.io.*;
class  CopyPic
{
	public static void main(String[] args) 
	{
		FileOutputStream fos = null;//建立字节输出流
		FileInputStream fis = null; //字节输入流
		try
		{
			fos = new FileOutputStream("c:\\2.bmp");
			fis = new FileInputStream("c:\\1.bmp");

			byte[] buf = new byte[1024];//创建一个缓冲区
			
			int len = 0;
			while((len=fis.read(buf))!=-1)//读入数组中返回给len的是个数
			{
				fos.write(buf,0,len); //将数组中数据写入输出流
			}
		}
		catch (IOException e)
		{
			throw new RuntimeException("复制文件失败");
		}
		finally
		{
			try
			{
				if(fis!=null)
					fis.close();
			}
			catch (IOException e)
			{
				throw new RuntimeException("读取关闭失败");
			}
			try
			{
				if(fos!=null)
					fos.close();
			}
			catch (IOException e)
			{
				throw new RuntimeException("写入关闭失败");
			}
		}
	}
}

5、这是个进阶的能力,关于装饰类的使用

//这个代码的效果是每当我在控制台上输入一行字符串,然后下一个会返回该字符串的大写
import java.io.*;

class  TransStreamDemo2
{
	public static void main(String[] args) throws IOException
	{
		//System.setIn(new FileInputStream("PersonDemo.java"));//设置成从该文件里读数据
		//System.setOut(new PrintStream("zzz.txt"));//设置成数据写入该文件中

		//键盘的最常见写法。
		BufferedReader bufr = 
				new BufferedReader(new InputStreamReader(System.in));
		
		BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

		String line = null;
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
				break;
			bufw.write(line.toUpperCase());
			bufw.newLine();
			bufw.flush(); 
		}
		bufr.close();
	}
}


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值