`
jiao13953900900
  • 浏览: 32144 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

黑马程序员-IO_字符流和字节流

    博客分类:
  • java
阅读更多

 

 

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

 

 

字符流和字节流

 

字符流和字节流:

 

字节流两个基类:

InputStream  , OutputStream

 

字符流两个基类:

Reader, Writer

 

先学习一下字符流的特点。

 

既然IO流是用于操作数据的,

那么数据的最常见体现形式是:文件。

 

那么先以操作文件为主来演示。

 

需求:在硬盘上,创建一个文件并写入一些文字数据。

 

找到一个专门用于操作文件的Writer子类对象。FileWriter。  后缀名是父类名。 前缀名是该流对象的功能。

 

io流中最常用的方法:

1.read();读取流中的数据

2.write();将数据写入到流中去

3.flush();刷新流

4.close();关闭流

上面这几种方法都涉及到windows系统资源调用,会抛出IOException,所以在操作过程中要进行异常处理。

 

close()和flush区别:

flush刷新后,流可以继续使用,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();
	}
}

 

 

IO异常的处理方式示例。

import java.io.*;

class  FileWriterDemo2
{
	public static void main(String[] args) 
	{
		FileWriter fw = null;
		try
		{
			fw = new FileWriter("demo.txt");//将设涉及到异常的代码放到try中。
			fw.write("abcdefg");

		}
		catch (IOException e)
		{
			System.out.println("catch:"+e.toString());
		}
		finally
		{
			try
			{
				if(fw!=null)
					fw.close();	//因为关闭流动作必须执行,所以放在finally中,且close也会抛出异常,要进行单独处理。
			}
			catch (IOException e)
			{
				System.out.println(e.toString());
			}
		}		
	}
}

 

 

演示对已有文件的数据续写。

import java.io.*;
class  FileWriterDemo3
{
	public static void main(String[] args) throws IOException
	{

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

		fw.write("nihao\r\nxiexie");//在windows中\r\n作为换行符。
		fw.close();
	}
}

 

 

读取指定文本文件中的数据,并将数据打印到控制台上。

 

第一种方式:一次读取和打印单个字符:

 

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)//当读取到文件结尾处时返回-1,可以用作循环条件。
		{
			System.out.print(ch);//为保证数据的连续性,打印时不带换行。
		}
		fr.close();
	}
}

 

 

第二种方式:通过字符数组进行读取。一次读取一段数据并存入到数组中,然后对数组进行打印。

import java.io.*;

class FileReaderDemo2 
{
	public static void main(String[] args) throws IOException
	{
		FileReader fr = new FileReader("demo.txt");
		

		//定义一个字符数组。用于存储读到字符。
		//该read(char[])返回的是读到字符个数。
		char[] buf = new char[1024];

		int num = 0;
		while((num=fr.read(buf))!=-1)
		{
			System.out.print(new String(buf,0,num));//使用String的构造方法将数组中的内容转换为字符串进行打印。
		}
		fr.close();
	}
}

 

 

上面两种方式中,使用第一种方式较为低效,因为是读一次进行写一次,执行较慢。

使用第二种方式将读取到的数据先存入到缓冲区中,然后一起进行打印,效率较高,比较常用。

 

 

将C盘一个文本文件复制到D盘。

 

复制的原理:

其实就是将C盘下的文件数据存储到D盘的一个文件中。

 

步骤:

1,在D盘创建一个文件。用于存储C盘文件中的数据。

2,定义读取流和C盘文件关联。

3,通过不断的读写完成数据存储。

4,关闭资源。

 

import java.io.*;

class CopyText 
{
	public static void main(String[] args) throws IOException
	{
		copy_2();
	}
	//使用数组缓冲区进行复制。
	public static void copy_2()
	{	//在外部创建引用,内部创建对象。
		FileWriter fw = null;
		FileReader fr = null;
		try
		{
			fw = new FileWriter("SystemDemo_copy.txt");
			fr = new FileReader("SystemDemo.java");
			//创建数组用作缓冲区
			char[] buf = new char[1024];

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

		}
		finally
		{
			if(fr!=null)
				try
				{
					fr.close();
				}
				catch (IOException e)
				{
				}
			if(fw!=null)
				try
				{
					fw.close();
				}
				catch (IOException e)
				{
				}
		}
	}

	//从C盘读一个字符,就往D盘写一个字符。
	public static void copy_1()throws IOException
	{
		//创建目的地。
		FileWriter fw = new FileWriter("RuntimeDemo_copy.txt");

		//与已有文件关联。
		FileReader fr = new FileReader("RuntimeDemo.java");

		int ch = 0;
		//读取一个字符。
		while((ch=fr.read())!=-1)
		{
			fw.write(ch);//将读取到的字符写入到流中。
		}
		
		fw.close();
		fr.close();
	}
}

 

 

 

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics