Java IO学习札记(字符/节流)


前两天学习了老师的java基础,一直没时间总结IO流,现在闲来总结一下,问题可能比较多,望谅解~

一、理解什么是IO流?

        流,可以简单的理解为“水流”,那我们知道,这个一条河有两头,发源地,河水要流向哪里,这就是目的地,而载体呢,就是我们所说的水流,好了,而且,都是朝一个方向流动的,这很容易理解。再我们来看看什么叫IO流呢?其实按照上面的理解方式,还是很好理解的。IO就是Input&Output(输入输出)的简写,IO流也叫输入输出流,显然我们在计算机世界中要进行互相的交流是通过设备之间的传递数据来完成的,那么IO流就是用来处理这些设备之间的数据传输的,载体呢,就是数据啦。

当然,以上是我个人的理解,专业的解释呢?是:流失一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据的操作。

二、IO流的分类

1、从上面流的概念不免能看出,有流出的流和流入的流,OK,java IO流按照流向分为两种:输入流和输出流

2、另外,Java IO流按照操作数据的方式分为两种流:字节流和字符流

IO流常用的基类

字节流的抽象基类InputStreamOutputStream

字符流的抽象基类ReaderWriter

注:由这资格基类派生出来的子类名称都是一起父类名作为子类名的后缀的

 eg:InputStream的子类FileInputStream ,Reader的子类FileReader

让我们看看下图,也许会更明白一点,java流类图结构(从网上copy的)



三、字符流

既然IO流是用来操作数据的,那么数据最常见的体现形式就是文本,那么就可以用字符流来操作文本了,当然字节流也是可以的,就先掌握以下字符流。

1、字符输出流Writer

1)、由JDK克制,Writer是所有的输出字符流的父类,他是一个抽象类,操作一般实现子类。

示例:在硬盘上,创建一个文件并写入一些数据。从上图中找专门操作文件的Writer子类对象==>FileWriter,其实也能从这些类名中看出,前缀是该类的功能,后缀是该类的父类。

public class FileWriterDemo
{
	public static void main(String[] args) 
	{
		//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
		//而且该文件会被创建到指定目录下。如果该目录已有同名文件,将被覆盖。
		//其实该步就是在明确数据要存放的目的地。
		FileWriter fw = null;
		try
		{
			fw = new FileWriter("demo.txt");
			//调用write方法,将字符串写入流中
			fw.write("abcdefg");
		//刷新流对象中的缓冲中的数据
		//fw.flush();
		}
		catch (IOException e)
		{
			System.out.println(e.toString());
		}
		finally
		{	
			try
			{
			if(fw != null)		
		//关闭流子源,但是关闭之前会刷新一次内部的缓冲数据,将数据刷到目的地中
		//flush区别:flush刷新后,流可以继续使用,colse刷新后,会将流关闭。
				fw.close();						
			}
			catch (IOException e)
			{
				System.out.println(e.toString());
			}
	
		}
	}
}

2、字符输入流Reader

1)、查阅JDK可知,Reader是所有的输入字符流的父类,他是一个抽象类,操作一般实现子类。

示例:读取上述创建的demo.txt文件,并将其打印到控制台。与上面对应,显然要使用的是FileReader。

public class FileReaderDemo 
{
	public static void main(String[] args) throws IOException
	{
		//创建一个文件读取流对象,和指定名称的文件向关联
		//要保证该文件是否已经存在,如果不存在,会发生FileNotFoundException异常
		FileReader fr = new FileReader("demo.txt");
	
		//调用FileReader的读取的方法
		//read方法:一次读一个字符而且会自动往下读
		//int ch = fr.read();
		//System.out.println("ch = " + (char)ch);
		/*while(true)
		{
			int ch = fr.read();
			if(ch == -1)
				break;
			System.out.println("ch = " + (char)ch);
		}
		*/
		int ch = 0;
		while((ch = fr.read())!=-1)
		{
			System.out.println("ch = " + (char)ch);
		}
		fr.close();
	}
}

四、字符缓冲流

什么是字符缓冲流呢?打个比方,我们经常喝水都是用被子喝的,喝起来一饮而尽,比较爽快,缓冲就相当于这个杯子,而字符就想到于杯子中的每一滴水,可想而知,是一滴一滴喝水解渴,还是一杯子来的爽快,显然这个缓冲为我们的字符读写提高了效率。

对上面的两个例子,稍加改动,就可以是我们的程序运行效率就有所提高了,当然,因为我们的文件不够大,效果不是很明显,但实际中我们经常操作的确实大文件,这时,这个缓冲技术就显得优势明显了,二话不说,完善一面的一例输入流,输出流道理是一样的,上代码。

public class BufferedReaderDemo 
{
	public static void main(String[] args) throws IOException
	{
		//创建一个读取流对象和文件相关联
		FileReader fr = new FileReader("demo.txt");

		//为了提高效率,加入缓冲技术,将字符读取流对象作为参数传递给缓冲对象的构造函数
		BufferedReader bufr = new BufferedReader(fr);
		String info = null;
		while((info = bufr.readLine())!=null)
		{
			System.out.println(info);
		}
		bufr.close();
		fr.close();
	}
}

字符流就总结到这了,到字节流了喽~~~

五、字节流

看例子理解吧,和上面的例子一样,就是读取文件和写入文件,将字节流放到一个文件中说明了,程序简单,不做过多说明,见注释了。

public class  FileStream
{
	public static void main(String[] args) throws IOException
	{
		//writeFile();
		//readFile_1();
		//readFile_2();
		readFile_3();
	}
	public static void readFile_3() throws IOException
	{
		FileInputStream fis = new FileInputStream("fos.txt");
		int num = fis.available();
		System.out.println("num :" + num);
		byte[] buf = new byte[num]; //定义一个刚刚好的缓冲区,不用再循环了
		//但是要慎用
		fis.read(buf);
		System.out.println(new String(buf));
		fis.close();
	}
	public static void readFile_2() throws IOException
	{
		FileInputStream fis = new FileInputStream("fos.txt");
		
		byte[] buf = new byte[1024];
		int len = 0;
		while((len = fis.read(buf))!=-1)
		{
			System.out.println(new String(buf,0,len));
		}
		fis.close();
	}

	public static void readFile_1() throws IOException
	{
		FileInputStream fis = new FileInputStream("fos.txt");
		
		int ch = 0;
		while((ch = fis.read())!=-1)
		{
			System.out.println((char)ch);
		}
		fis.close();
	}
	public static void writeFile() throws IOException
	{
		FileOutputStream fos = new FileOutputStream("fos.txt");
		
		fos.write("abcde".getBytes());

		fos.close();
	}
}

六、字节缓冲流

其实道理和字符缓冲流是一样,举一例说明,硬盘硬盘上的一个MP3文件。

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

	//通过字节流的缓冲区完成复制。
	public static void copy() throws IOException
	{
		BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("C:\\0.mp3"));
		BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("C:\\1.mp3"));

		int by = 0;
		while((by = bufis.read())!= -1)
		{
			bufos.write(by);
		}
		bufos.close();
		bufis.close();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值