【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();
}
}