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

【java基础】采用字节流的文件IO演示,字节流与字符流转换,转换流的编码解码

程序员文章站 2022-06-16 20:06:29
...

摘要:下面代码将展示采用字节流进行Copy的几个方法,字符流的方法与之相似,只是字符流只能操作字符。同时也会介绍字节流与字符流转换,转换流的编码解码。

字节流采用的是:FileInputStream  和FileOutputStream

字符流采用的是:FileReader  和 FileWriter

(实际上字符流也是通过字节流的编码变成字符流的。)

若想在字节流与字符流之间进行转换,并想指定编码表,请采用如下的形式:

输入:InputStreamReader isr=new InputStreamReader(字节流输入对象,指定编码表);

输出:OutputStreamWriter osw=new OutputStreamWriter(字节流输出对象,指定编码表);

注意指定编码表是InputStreamReader和OutputStreamWriter 提供的特殊构造方法,若不填写,则java默认采用系统的编码方式,win系统是GBK,一般不填写,除非你想指定某个编码表。将字节流转换成字符流操作后,InputStreamReader和OutputStreamWriter 与FileReader  和 FileWriter的操纵完全一样。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteCopyDemo {

	public static void main(String[] args) throws IOException {
		method_4();
	}
	
	/*
	 * 下面方法未使用缓冲数组和缓冲区,非常非常地慢!这种方法千万别用!用了就被开除!!
	 */
	public static void method_4() throws IOException {
		FileInputStream fis=new FileInputStream("F:\\小黄六级stage1.mp3");
		FileOutputStream fos=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\小黄六级3.mp3");
		int len=0;
		while((len=fis.read())!=-1) {
			fos.write(len);
		}
		fis.close();
		fos.close();
	}
	
	/*
	 * 下面方法使用了缓冲区,并采用含有估计字节数的方法创建了缓冲数组,所以速度很快。
	 * 但是不建议针对大型文件使用available,否则容易爆内存!
	 */
	public static void method_3() throws IOException {
		FileInputStream fis=new FileInputStream("F:\\小黄六级stage1.mp3");
		BufferedInputStream bfis=new BufferedInputStream(fis);
		FileOutputStream fos=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\小黄六级2.mp3");
		BufferedOutputStream bfos=new BufferedOutputStream(fos);
		byte[] buf=new byte[bfis.available()];
		bfis.read(buf);
		bfos.write(buf);
		bfis.close();
		bfos.close();
	}
	/*
	 * 下面方法使用了缓冲区,未使用缓冲数组,比较快!
	 */
	public static void method_2() throws IOException {
		FileInputStream fis=new FileInputStream("F:\\小黄六级stage1.mp3");
		BufferedInputStream bfis=new BufferedInputStream(fis);
		FileOutputStream fos=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\小黄六级1.mp3");
		BufferedOutputStream bfos=new BufferedOutputStream(fos);
		int len=0;
		while((len=bfis.read())!=-1) {
			bfos.write(len);//注意:这儿就不要再使用bfos.flush()了,因为是单个的,没有必要存一下,否则非常地慢!!
		}
		bfis.close();
		bfos.close();
	}
	/*
	 * 下面方法只使用了缓冲数组,速度一般。
	 */
	public static void method_1() throws IOException {
		FileInputStream fis=new FileInputStream("F:\\小黄六级stage1.mp3");
		FileOutputStream fos=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\小黄六级.mp3");
		byte[] buf=new byte[1024];
		int len=0;
		while((len=fis.read(buf))!=-1) {
			fos.write(buf, 0, len);
		}
		fis.close();
		fos.close();
	}
}