Java IO字节流读取文件总结

 

本文对java IO流的读取文件的方式进行比较全面的总结,一个是基本的读取方式,另一个是高效的读取方式。

 

 

一.基本的读取方式:使用FileInputStream

 


package com.xykj.fileInput;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class FileInputTest {
	/**
	 * 文件读取文件FileInputStream的使用
	 * */
	public static void main(String[] args) {
		// 需要读取的文件,参数是文件的路径名加文件名
		File file = new File("D:/Hello.java");
		if (file.isFile()) {
			// 以字节流方法读取文件
			FileInputStream fis = null;
			try {
				fis = new FileInputStream(file);
				// 设置一个,每次 装载信息的容器
				byte[] buf = new byte[1024];
				// 定义一个StringBuffer用来存放字符串
				StringBuffer sb = new StringBuffer();
				// 开始读取数据
				int len = 0;// 每次读取到的数据的长度
				while ((len = fis.read(buf)) != -1) {// len值为-1时,表示没有数据了
					// append方法往sb对象里面添加数据
					sb.append(new String(buf, 0, len, "utf-8"));
				}
				// 输出字符串
				System.out.println(sb.toString());
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else {
			System.out.println("文件不存在!");
		}
	}
}






二.高效的读取方式:


FileInputStream和BufferInputStream一起使用

 

java中BufferedInputStream类相比InputStream类,提高了输入效率,增加了输入缓冲区的功能。

InputStream流是指将字节序列从外设或外存传递到应用程序的流。

BufferedInputStream流是指读取数据时,数据首先保存进入缓冲区,其后的操作直接在缓冲区中完成。

 

 


package com.xykj.fileInput;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class BufferedInputStreamTest {
	/**
	 * 高效输入流的使用 BufferedInputStream的使用
	 * */
	public static void main(String[] args) {

		// 定义一个输入流对象
		FileInputStream fis = null;

		// 定义一个存放输入流的缓冲对象
		BufferedInputStream bis = null;

		// 定义一个输出流,相当StringBuffer(),会根据读取数据的大小,调整byte的数组长度
		ByteArrayOutputStream baos = new ByteArrayOutputStream();

		try {
			// 把文件路径和文件名作为参数 告诉读取流
			fis = new FileInputStream("D:/tt.java");

			// 把文件读取流对象传递给缓存读取流对象
			bis = new BufferedInputStream(fis);

			// 获得缓存读取流开始的位置
			int len = bis.read();
			System.out.println("len=" + len);

			// 定义一个容量来盛放数据
			byte[] buf = new byte[1024];

			while ((len = bis.read(buf)) != -1) {
				// 如果有数据的话,就把数据添加到输出流
				//这里直接用字符串StringBuffer的append方法也可以接收
				baos.write(buf, 0, len);
			}

			// 把文件输出流的数据,放到字节数组
			byte[] buffer = baos.toByteArray();

			// 打印输出
			System.out.println(new String(buffer, "gbk"));

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				//关闭所有的流 
				baos.close();
				bis.close();
				fis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}

		}

	}

}



 


 

这是两种比较基本的读取文件的方式,也是要熟练掌握的。

读取文件前一般要先判断文件是否存在。

读取文件的应用:可以是普通文档的读取,不过这个使用字符流也能做到。

字节流特有的就是可以读取非文档的文件,比如图片或视频,

但也不是直接显示出来,而是用字节流从一个地方读取,再用字节流写入到另一个地方。

如果用字符流来读取图片或视频的文件再用字符流写入到另一个地方,会发现文件变小而打不开。

所有,一般来说字节流的使用会比字符流的使用更加广泛一点。