1.字符流的使用(字符流在文本中的使用效率稍微高效点)
2.字符的使用方式大致和字节流的使用方式想类似,最大的不同在于继承结构的不同;字符流继承read,write;
3.再次强调资源流使用完成之后需要释放资源,如果不释放资源,那么输出流可能不会将结果完全的刷回至磁盘上,有时可能导致复制完成之后的文件打开的内容为空;
4.出现这种可以调用输出流的flush()方法,如果是关闭流或默认调用此方法;如果使用前面的方法依旧没有完全的关闭资源流。
package com.ydlclass.feature;
import org.junit.Test;
import java.io.*;
import java.util.Random;
public class IOTest {
String tarPath;
public String getTarPath() {
return tarPath;
}
public void setTarPath(String tarPath) {
this.tarPath = tarPath;
}
@Test
public void testCharStream(){
try(Reader inputStream1 = new FileReader("D:\\Product.log");//保证能够自动关闭资源流
Writer outputStream1 = new FileWriter("E:\\Product.log");)
{
if (new Random().nextInt(10) > 2){//随机值大于2时,由于抛出异常,之后的内容不会被执行;
//但是finally关键字之后的内容会接着执行,但是输入数输出流为null,所以可能会报出空指针异常的问题;
throw new IOException();
}
File file = new File("E:\\CloudMusic\\MV\\new.mp4");
if (!file.exists()) {
file.createNewFile();
}
long start = System.currentTimeMillis();
byte[] bytes = new byte[1024 * 1024];//将每次运货箱的大小提升;这样只需要进行比较少的i/o操作就可以完成;
// 如果还想优化新能,那么可以使用多线程;或者使用nio
char[] chs = new char[1024*1024];
int len;
while ((len = inputStream1.read(chs)) != -1){
outputStream1.write(chs);
}
long end = System.currentTimeMillis();
System.out.println("单字节搬运:" + (end - start));
//上面的io是通过一个字节一个字节的读取文件,即使是8m左右大小的文,耗时大概是60分钟,可见io的效率不高;
//简单的优化
} catch (IOException e){
e.printStackTrace();
}
}
}