浅谈我对IO流的了解 - 字符流


Java.io 包,该包介绍:通过数据流、序列化和文件系统提供系统输入和输出


下面了解下什么是IO流  ?

  • IO流是用来处理设备之间的数据传输。
  • JAVA对数据的操作是通过流的方式
  • 流分为输入流和输出流
  • 流按操作数据分为字节流和字符流

-------------------------------------------------------------------------------------------------------------------------------------

下面介绍字符流类, 已知字符流的基类是  Reader , Writer 

已知子类:

       BufferedReader    --------        缓冲流         --------      BufferedWriter

    CharArrayReader    --------    字符数组流      --------      CharArrayWriter

             FilterReader    --------      过滤器流        --------      FileterWriter

InputStreamReader    --------        转换流         --------      InpuStreamWriter

            PipedReader    --------       管道流          --------      PipedWriter

            StringReader    --------     字符串流  --------      StringWriter

                FileReader    --------       文件流          --------      FileWriter

-------------------------------------------------------------------------------------------------------------------------------------


下面通过 FileReader 文件流进行文件的读取演示:

import java.io.*;

class ReaderWriter
{

	/* 已知当前文件下,有一个test文本文件,通过FileWriter 文件字符流进行写入 */

	public static void main(String[] args) throws IOException {
/*
	1. 使用 IO 流 会引发一个JAVA异常体系中的,比较常见的异常IOException需要进行捕获 (这里先不处理,抛出去)

	2. 在创建FileReader 对象, 需要绑定一个文件对象,该文件不存在则会引发 java.io.FileNotFoundException (系统找不到指定的文件。) 
*/
		FileReader fr = new FileReader("11.txt");

		char[] buf = new char[1024];     //定义一个字符缓冲区,

		int len = 0;					 //用于记录文件长度

		while((len = fr.read(buf))!=-1)  //通过 read 读取数据,将读取到的数据存入到字符缓冲区,
		{			         //读取完后的read会返回剩余的文件长度,用len记录著,用于判断文件是否读取完毕。

			System.out.println(new String(buf, 0, len));  //打印每一次存储到的数据。
		}

		fr.close();  //因为FileReader底层是调用window资源,所以需要通过close方法,释放资源。因为资源是有限的,
	}
}



下面通过 FileWriter 文件流进行文件的写入演示:

import java.io.*;

class ReaderWriter
{

	/* 已知当前文件下,有一个test文本文件,通过FileWriter 文件字符流进行写入 */

	public static void main(String[] args) throws IOException {
/*
	1. 使用 IO 流 会引发一个JAVA异常体系中的,比较常见的异常IOException,需要进行捕获(这里先不处理,抛出去)

	2. 在创建FileWriter 对象,需要绑定一个文件对象,该文件不存在则会当前文件路径下,创建文件对象,如何存在,则会覆盖当前文件对象,

	3. 可以通过创建FileWriter,告诉它不用覆盖,你要续写文件 例: new FileWriter("test", true);
*/	
		FileWriter fw = new FileWriter("test.txt");

		for(int i = 1; i<6; i++)
		{
			fw.write("第"+i+"写入数据\r\n"); //通过 write 方法写入数据,需要注意的是:他写入的数据是在缓冲区里,并不是目的文件内。
			fw.flush();                     //需要通过 flush 方法进行刷新缓冲区,这样数据才百分百的写入到目的文件内。
		}
/*		
		这里需要注意是close方法底层也在调用flush方法,这让人产生错意,反正close最后都会调用flush方法,
		所以干脆不用我写 flush方法了。 这点是错误的。因为flush是即时刷新,可以保证数据的有效性,要是
		在写入的过程中,停电了,该程序没有执行到close方法就断电了,之前的写入的数据就会没有了。
		所以这里建议,写一次,刷新一次。
*/
		fw.close();  //因为FileWriter底层是调用window资源,所以需要通过close方法,释放资源。因为资源是有限的,
	}
}

使用 IO 流 会引发一个JAVA异常体系中的,比较常见的异常 IOException 

下面演示常见的 IO流 异常处理方式:

import java.io.*;

class ReaderWriter
{
/*
		对于IO流的捕获处理,我们需要对他们分开进行try...catch处理。
		每一种的异常都方式都是不一样的。
		1. 对文件对象的处理
		2. 对读写数据的处理
		3. 对文件对象关闭资源处理。
*/
	public static void main(String[] args) {
		write();
		read();
	}
	
	public static void read()
	{
		/* 下面演示读取字符流的捕获异常处理 */
			FileReader fr = null;
			try
			{
				fr = new FileReader("test.txt");
			}
			catch(FileNotFoundException e) { throw new RuntimeException("文件不存在!"); }

			char[] buf = new char[1024];
			int len    = 0;

			try
			{
				while((len = fr.read(buf))!=-1)
				{
					System.out.println(new String(buf, 0, len));
				}
			}
			catch(IOException e) { throw new RuntimeException("文件读取错误!"); }
			finally
			{
				try
				{
					if(fr!=null)
						fr.close();
				}
				catch(IOException e) { throw new RuntimeException("文件读取流关闭失败!"); }
			}
	}

	public static void write()
	{
		/* 下面演示写入字符流的捕获异常处理 */
		FileWriter fw = null;

		try
		{
			fw = new FileWriter("test.txt", true);
		}
		catch(IOException e) { throw new RuntimeException("路径错误!"); }

		try
		{
			fw.write("写入数据");
			fw.flush();
		}
		catch(IOException e) { throw new RuntimeException("数据写入错误!"); }
		finally
		{
			try
			{
				if(fw!=null)
					fw.close();
			}
			catch(IOException e) { throw new RuntimeException("文件写入流关闭失败!"); }
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值