欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java开发笔记(八十八)文件字节I/O流

程序员文章站 2022-07-11 08:13:42
前面介绍了如何使用字符流读写文件,并指出字符流工具的处理局限,进而给出随机文件工具加以改进。随机文件工具除了支持访问文件内部的任意位置,更关键的一点是通过字节数组读写文件数据,采取字节方式比起字符方式有下列两个好处:1、文件长度以字节为单位计量,可以分配等长的字节数组,却无法分配合适长度的字符数组, ......

前面介绍了如何使用字符流读写文件,并指出字符流工具的处理局限,进而给出随机文件工具加以改进。随机文件工具除了支持访问文件内部的任意位置,更关键的一点是通过字节数组读写文件数据,采取字节方式比起字符方式有下列两个好处:
1、文件长度以字节为单位计量,可以分配等长的字节数组,却无法分配合适长度的字符数组,因此采用字节方式便于从文件中读取数据。
2、字符流工具主要以字符为单位处理数据,意味着它适合用来读写文本文件,不适用于二进制文件(包括图片文件、音频文件、视频文件等等),而字节方式不存在此类限制。
虽说随机文件工具已经实现了以字节方式读写文件,但它更适合大文件的任意位置读写,倘若用于一般文件的处理就显得大材小用了。毕竟杀鸡焉用牛刀,何况牛刀也太笨重了,远不如普通的刀子灵活。可是字符流工具力有不逮,随机文件工具又未恰到好处,难不成还有更方便易用的工具吗?其实文件读写可以抽象为对某个设备的输入输出操作,写文件相当于向文件输出数据,读文件相当于从文件输入数据。类似的操作还有很多,例如打印文件可看作是向打印机输出待打印的文本,敲代码可看作是从键盘输入每个按键对应的字符。java把这些相关的输入输出操作统一为i/o流,其中字母i表示输入input,字母o表示输出output。先前介绍的filereader和filewriter属于i/o流中的字符流,而以字节为单位的则是i/o流中的字节流,字节流本身是个大家族,它有两个基类,分别是输入流inputstream和输出流outputstream,由这两个类派生出丰富多样的输入输出流,各自用于不同的业务场景。
文件字节流是输入输出流当中最常见的一种,它包括文件输出流fileoutputstream和文件输入流fileinputstream,其中fileoutputstream用来将数据写入文件,fileinputstream用来从文件读取数据,并且二者都采取字节数组保存信息。文件输出流的构造方法支持直接填入文件路径,其对象可调用write方法把字节数组写入文件,也可调用close方法关闭文件,用起来fileoutputstream像是file与filewriter的结合体,当然就更加好用。同时不管是输出流还是输入流,它们都实现了autocloseable接口,故而支持try-with-resources方式的资源自动释放。下面是利用文件输出流fileoutputstream写文件的代码例子:

	private static string mfilename = "d:/test/aae.txt";
	// 利用文件输出流写入文件。注意fileoutputstream处理的是字节信息
	private static void writefile() {
		string str = "白日依山尽,黄河入海流。\n欲穷千里目,更上一层楼。";
		// 根据指定路径构建文件输出流对象
		try (fileoutputstream fos = new fileoutputstream(mfilename)) {
			fos.write(str.getbytes()); // 把字节数组写入文件输出流
			// 在try(...)里面创建的输入输出流,程序会在处理完成后自动关闭,所以下面的close方法不必显式调用
			//fos.close(); // 关闭文件输出流
		} catch (exception e) {
			e.printstacktrace();
		}
	}

 

依此类推,文件输入流的构造方法同样支持直接填入文件路径,也拥有read读文件方法和close关闭文件方法,像是file与filereader的结合体。另外fileinputstream有几个方法值得一提,一个是skip方法,它命令当前位置跳过若干字节,注意该方法跳过的是字节数而非字符数。另一个是available方法,它返回文件当前位置后面的剩余部分大小,刚创建文件输入流对象之时调用available方法,得到的就是文件大小;如果先调用skip方法再调用available方法,得到的数值为文件大小减去跳过的字节数。下面是利用文件输入流读文件的代码例子:

	// 利用文件输入流读取文件
	private static void readfile() {
		// 根据指定路径构建文件输入流对象
		try (fileinputstream fis = new fileinputstream(mfilename)) {
			// 分配长度为文件大小的字节数组。available方法返回当前位置后面的剩余部分大小
			byte[] bytes = new byte[fis.available()];
			fis.read(bytes); // 从文件输入流中读取字节数组
			string content = new string(bytes); // 把字节数组转换为字符串
			system.out.println("content="+content);
			// 在try(...)里面创建的输入输出流,程序会在处理完成后自动关闭,所以下面的close方法不必显式调用
			//fis.close(); // 关闭文件输入流
		} catch (exception e) {
			e.printstacktrace();
		}
	}

  

更多java技术文章参见《java开发笔记(序)章节目录