黑马程序员————Java基础日常笔记---IO流一

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

黑马程序员————Java基础日常笔记---IO流一

1.1 IO的由来:

先什么是IO流呢?
java对数据的操作; 
IO流用来处理设备之间的数据传输, 并且操作流的对象都在IO包中, 
而对数据的操作: 读和写;
IO流按照操作的数据分为:字节流与字符流(InputStream,OutputStream和Reader,Writer)
        按流向分:输入流,输出流, 
字符流: 字节流+编码表;

好处:可以在内部去融合编码表,

就是你读到的字节数据,你到底是查那个GBK,还是UTF-8,,可以由你来指定,

所以来处理文字的时候,就可以变得方便,

字符流对象里面融合了编码表,只有文字识别的编码,如果处理图片的话,就用字节流,

通用字节流。

1.2 FileWriter

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

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

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

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

代码如下:

<span style="font-size:12px;">import java.io.*;
class FileWriterDemo 
{
	public static void main(String[] args) throws IOException
	{
		//创建一个FileWriter对象,该对象一被初始化必须要明确要操作的文件。
		//new在内存中产生一个对象,同时在指定的目录下, 会产生一个指定名称的文件。
		//而且该文件会被创建到指定的目录下, 如果该目录下已有同名的文件,将被覆盖
		//其实该步就是在明确数据要存放的目的地。
		FileWriter fw=new FileWriter("E:\\demo.txt");//写字得先有纸
		
		//调用write方法,将字符串写入到流中,
		fw.write("abcde");

		//刷新流对象中的缓冲中的数据
		//将数据刷到目的地中(指定的目录demo.txt)。
		//fw.flush();
		
		fw.write("hehe");
		//fw.flush();
		/*
		关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据
		将数据刷到目的地中,
		和flush区别:flush刷新后 流可以继续使用,close刷新后,会将流关闭。
		*/
		fw.close();//关闭此流,但要先刷新它。

		//fw.write("hehe");fw.flush();关闭了流,如果还调用write方法,这里会出现异常
	}
}</span><span style="font-size: 14px;">
</span>
运行结果:

Windows本身就具备这个动作,java也可以操作, 说明java在调用windows系统的这个写的动作,这个就是所说的流资源。

其实, java不可以往系统中写数据的, windows和UNIX系统写数据的方式不同,所以Java靠系统内部的方式来完成数据的书写,

java在调用windows系统的这个写的动作来完成数据的建立,

使用之后, 就要释放出来,那么久有个动作一定要做, close(),

在关闭之前, 需要先调用一次flush().然后把资源到底层关闭就ok;

然而在调用底层资源的时候,容易发生异常,那么该如何处理呢?

1.3 IO异常处理

思路分析: 1,有三个代码块, try中的代码块, 其他的代码块中访问不到,所以在外边建立引用, 在try中建立初始化,这样fw就作用于整个函数,

2,这个对象没有创建成功, 初始化抛出异常, 就代表着初始化失败了, 对象不存在,被catch捕获,所以 不可以调用 close(),
3, 有多个资源, 就需要分别的去关 资源

代码如下:

//IO流异常处理
import java.io.*;
class FileWriterDemo1 
{
	public static void main(String[] args) //throws IOException
	{
		FileWriter fw=null;//fw就作用于整个函数,
		try
		{
			fw=new FileWriter("E:\\demo.txt");// FileNotFoundException
			//fw=new FileWriter("demo.txt");
			fw.write("abcdefg");
			
		}
		catch (IOException e)
		{
			System.out.println("catch1"+e.toString());
		}
		finally{//有多个流,需要分别的去关资源 ,
			try
			{
				if(fw!=null)
					fw.close();
			}
			catch (IOException e)
			{
				System.out.println("catch2"+e.toString());
			}
			
		}
	}
}
结果:

但是发现,如果是写入同一个文件的话, 会将以前的数据覆盖。

1.4 文件的续写

在文件的基础上加数据,

代码如下:

//文件的续写
import java.io.*;
class FileWriterDemo2
{
	public static void main(String[] args) //throws IOException
	{
		FileWriter fw=null;//fw就作用于整个函数,
		try
		{
			fw=new FileWriter("E:\\demo.txt",true);// FileNotFoundException
			//fw=new FileWriter("demo.txt");
			fw.write("可以续写了");
			
		}
		catch (IOException e)
		{
			System.out.println("catch1"+e.toString());
		}
		finally{//有多个流,需要分别的去关资源 ,
			try
			{
				if(fw!=null)
					fw.close();
			}
			catch (IOException e)
			{
				System.out.println("catch2"+e.toString());
			}
			
		}
	}
}

运行结果:

1.5 文本文件的读取

第一种读取方式:使用read()方法读取文本文件数据

第二种读取方式:想读多个方式二:通过字符数组进行读取,定义一个字符数组,用于存储读到的字符,
读read(char[])返回的是读到字符的个数

代码如下:

import java.io.*;
class FileReaderDemo 
{
	public static void main(String[] args) 
	{
		//创建一个文件读取流对象,和指定名称的文件相关联
			//要保证该文件是已经存在的,如果不存在,会发生FIleNotFoundException
			FileReader fr=null;
		try
		{
			fr=new FileReader("demo.txt");
			//作为整数读取的字符,如果已到达流的末尾,则返回 -1
			//调用读取流对象的read方法
			//read(),一次读一个字符,而且会自动往下读。
			//int ch=fr.read();
			//想读多个方式一:
			/*
			int ch=0;
			while((ch=fr.read())!=-1)
				System.out.println("ch="+(char)ch);
			*/
			//想读多个方式二:通过字符数组进行读取
			//定义一个字符数组,用于存储读到的字符,
			//读read(char[])返回的是读到字符的个数
			//char[] buf=new char[3];
			char[] buf=new char[1024];
			int num=0;
			while((num=fr.read(buf))!=-1){
				//System.out.println("num="+num+"......"+new String(buf));
				System.out.println("num="+num+"......"+new String(buf,0,num));
			}
		}
		catch (IOException e)
		{
			System.out.println(e);
		}
		finally{
			try
			{
				if(fr!=null)
					fr.close();
			}
			catch (IOException e)
			{
				System.out.println(e);
			}
		}
	}
}
方式一结果:
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值