黑马程序员——Java基础 IO流 (复习)

-----------android培训、java培训、java学习型技术博客、期待与您交流!------------

一、理解IO流

IO流是对 Input Output流的简称。

Java中对数据的操作是通过流来操作的,IO流是用来处理设备之间的数据传输。Java中用于操作流的对象都在IO包中。

流的分类:

按照流向分:输入流和输出流。

按照操作的数据分:字节流和字符流。

字符流的由来:

既然IO流是用于操作数据的,那么数据的最常见的体现形式是:文件。那么字节流读取文字字节数据后,不直接操作而是先去查指定的编码表,获取相应的文字,再对这些文字进行操作。简单的说就是:字节流+编码表

二、IO常用基类

字节流的抽象基类:

InputStream 和 OutputStream

字符流的抽象基类:

Reader  和  Writer 

1.字符流之FileWriter类

专门用于操作文件的子类对象。后缀名是其父类名,前缀名是其功能。该流对象一被初始化必须要有文件对象。

步骤:(1)创建一个FileWriter对象,并初始化。初始化的该文件会被创建到指定目录下。如果该目录下有同名文件,则覆盖。

    (2)调用 write( ) 方法,将字符串写入流中。

    (3)通过 flush( ) 方法,刷新流对象中的缓存中的数据,将数据刷到指定文件中。

    (4)关闭流资源, close( ) 方法,关闭前会刷新流对象。

flush 和 close 的区别:flush 刷新后可以继续使用流资源, close 刷新后流资源被关闭,不能继续使用。

2.IO流异常处理

(1)必须在方法一开始就建立外部引用,然后再try中对其初始化。

(2)初始化 write 方法和close 方法都会抛出异常,都要try

(3)在close方法调用时,必须先判断对象是否为空,也就是判断对象是否初始化成功。而且close方法一定要写在finally中,是必须执行的。

代码示例

import java.io.*;
class FileWriterDemo
{
	public static void main(String[] args) 
	{
		FileWriter fw = null; //外部建立引用
		try
		{
			fw = new FileWriter("java01.txt"); //将其初始化
			String s = "abcdefg";
			fw.write(s); //将字符串写入
			fw.flush();  //将流内数据刷入文件
		}
		catch (IOException e)
		{
			System.out.println("文件创建失败");
		}
		finally
		{
			try
			{
				if(fw!=null)//对文件是否创建成功进行判断
					fw.close();// close会抛异常,必须单独try
			}
			catch (IOException ie)
			{
				System.out.println("关闭资源失败");
			}
			
		}
		
	}
}

运行结果



3.对已有文件的数据续写

已有文件是指,原本在硬盘中就有的文件,我们为了保留其原始数据

(1)建立数据存放的目的地,但构造函数是其另一个重载形式。

例:FileWriter fw = new FileWriter("java01.txt",true);  这里的Java01.txt 是已有文件的文件名,true 代表这在文件末尾续写。

(2)调用write 方法

(3)调用close方法

4.字符流之FileReader类

(1)创建一个文件读取流对象,并和指定名称的文件相关联。必须保证该文件存在,如果不存在会发生FileNotFoundException异常。

(2)调用读取流read( ) 方法。该方法的返回值时int 型的。

read方法一次读一个字符,而且会自动往下读,读到末尾返回 -1 。

read 方法有两种使用方式:

FileReader  fr = new FileReader("java01.txt");

第一种方法:

  int  ch = 0;

while((ch=fr.read())!=-1) {

System.out.print((char)ch);

}

第二中方式:

通过字符数组进行读取。定义一个字符数组,用于存储读到的数据。该read(char [ ] ) 方法返回的是读到字符的个数。如果到达末尾则返回 -1 

char[ ] ch = new char[1024];  // 通常将长度定义为1024的整数倍

int  num = 0;  //定义一个变量用来存储 read方法返回的字符个数

while((num = fr.read(ch))!=-1) {  //  其中fr.read(ch); 这句话就是将读到的字符装到数组里面,如果到达末尾就返回 -1

System.out.println(new String(ch,0,num));  // String对象构造函数,可以将数组转成字符串。

}

read 及 close 方法同样也会抛异常,所以也必须要try


三、字符流的缓冲区

 1.为什么会出现字符流缓冲区

字符流缓冲区技术,是为了提高对数据读写的效率,所以在创建缓冲区钱必须现有流对象。缓冲区必须要结合流才能使用,在流的基础上对流的功能进行增强。

2.缓冲区有哪些?

缓冲区对应的类有两个:BufferedReader   和 BufferedWriter

3.缓冲区使用的步骤

BufferedWriter步骤:

(1)创建写入流对象

(2)创建缓冲区,并将流对象作为参数传递给缓冲区构造函数。(缓冲区没有空参构造函数)

(3)刷新

(4)关闭缓冲区,其实关闭缓冲区就是关闭流对象。

BufferedWriter 中:newline() 方法,写入一个行分隔符,具有跨平台性。

BufferedReader步骤:

(1)创建一个读取流对象,并和文件相关联。

(2)为了提高效率加入缓冲区技术,将字符读取流对象作为参数,传递给缓冲区构造函数。

(3)关闭缓冲区

BufferedReader 中:readLine( )   一次读一行文本,是高效方法。该方法返回值类型是String ,当读完时返回null 


四、装饰设计模式

当想要对已有的对象进行功能增强时,可以定义一个类,将已有的对象传入构造函数,基于已有对象的功能,并提供增强功能。那么自定义的该类就称为装饰类。

装饰类通常会通过构造函数接收被装饰的对象,并基于被装饰对象的功能,提供增强功能。

装饰和继承的区别:

装饰模式比继承更灵活,为了避免继承体系的臃肿,而且还降低类与类之间的关系,提高了扩展性。

装饰类因为增强已有对象,具备的功能和被装饰的类是相同的,只不过提供了更强的功能。所有装饰类和被装饰类通常都属于一个体系中。


五、字节流

字节流有两个基类:InputStream  读  和 OutputStream 写

当我们不操作文本文件的时候,就要用到字节流来实施操作。

字节流不需要刷新,但仍需要close 

注意:字节流操作的是字节数组。不管你想写入字符串还是其他,都必须将其转换为字节数组,然后在用write方法写入。字节流的读写操作与字符流类似,但所操作的对象必须是byte类型。复制媒体文件一定要用字节流。

available() 方法:返回了字节数组的长度,类型为int 。


字节流缓冲区:

BufferedInputStream  和  BufferedOutputStream 

字节流缓冲区用法和字符流缓冲区差不多


六、转换流

键盘录入:System.in

转换流两个:InpuerStreamReader   和  OutputStreamWriter

流操作的基本规律:只要明确源和目的,就可以方便的操作流对象

(1)明确源和目的地。源:输入流     ;目的:输出流

(2)明确操作的数据是不是纯文本?是:字符流  ;不是:字节流

(3)当明确体系后,在明确要使用哪个具体对象,通过设备来区分。源设备:键盘、内存、硬盘 ; 目的设备:控制台、内存、硬盘

(4)要不要使用缓冲区,一般都使用。

例:需求:将键盘录入的数据存到一个文本文件中

源:InputStream            Reader

是不是纯文本?是,选Reader

设备:键盘,System.in    因为是Reader ,所有用到转换流

需要提高效率吗?要!

BufferedReader  bufr  = new BufferedReader(new InputStreamReader(System.in));

设备:OutputSteam        Writer

是不是纯文本?是,选Writer

设备:硬盘,直接使用FileWriter

要不要提高效率?要!

BufferedWriter    bufw =  new BufferedWriter(new FileWriter("demo.txt"));

扩展:想要录入的数据按照指定的编码表,将数据存到文件中,由于FileWriter是使用系统默认码表,这时,要按照指定码表,就必须用到转换流。

那么代码变成:BufferedWriter  bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("demo.txt"),"UTF-8"));


记住:转换流是字符和字节之间的桥梁,通常涉及到字节、字符的转换时使用。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
08-10
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值