标签:blog http java os 使用 io 文件 for 数据
字节流和字符流的区别,字节流一次读取一个字节,字符流一次读取的是一个Unicode码,读取了2个字节。
可以以文本编辑器打开的可以使用字符流读取,否则用字符流读取可能就会出错。图像文件就需要用字节流读取,不能用字符流操作。
字节流的基类是InputStream和OutputStream,字符流的基类是Reader和Writer。
读取并复制图片的代码,读取到缓存,一边读一边写。 ps:文件的相对路径要写什么看看System.getProperty("user.dir")就知道了,这个是基础路径。
public class FileIOTest { public static void main(String [] args) throws IOException{ int BYTE_SIZE = 1; int SAVE_SIZE = 1024; int i = 0; byte[] buff = new byte[BYTE_SIZE]; // 每次读的缓存 byte[] save = new byte[SAVE_SIZE]; // 保存前缓存 BufferedInputStream bf = new BufferedInputStream(new FileInputStream(new File("src/pattern/decorator/a.jpeg"))); FileOutputStream fs = new FileOutputStream(new File("src/pattern/decorator/b.jpeg")); while (bf.read(buff) != -1) { // 一个字节一个字节读 save[i] = buff[0]; if (i == SAVE_SIZE - 1) { // 达到保存长度时开始保存 fs.write(save, 0, SAVE_SIZE); save = new byte[SAVE_SIZE]; i = 0; } else { i++; } } // 最后这段如果没达到保存长度,需要把前面的保存下来 if (i > 0) { fs.write(save, 0, i); } fs.close(); bf.close(); } }
流的关闭应该放到finally中,上面的是不太合适的。
下面是关于大文件读取的一些数据,原文为:
http://aronlulu.iteye.com/blog/1018370
读取文件大小:1.45G
第一种,OldIO:
耗时70.79s
第二种,newIO:
耗时47.24s
第三种,RandomAccessFile:
耗时46.65
第四种,MappedByteBuffer:
耗时:36
前三种读法对应的资源占用图如下:
相对于最后一种内存直接映射方式前面的测试其实无意义,基本秒杀。。。。。
对于很大的文件直接分块映射时内存会不够,这是因为MappedByteBuffer未被释放造成的,sun未提供直接回收MappedByteBuffer区域的方法,这个时候有两种方法解决,第一种比较愚笨的:
第二种网上找来的,利用反射调用clean方法:
以上两种方法感觉都别扭,还有就是可以自己分割成物理文件再循环调用,这个也不太美观。
速度也会减慢好多。
标签:blog http java os 使用 io 文件 for 数据
原文地址:http://www.cnblogs.com/lnlvinso/p/3933772.html