黑马程序员技术交流社区

标题: IO小问题求解? [打印本页]

作者: HeiMaYSL    时间: 2012-5-16 20:17
标题: IO小问题求解?

import java.io.*;
class test2
{
        public static void main(String[] args)
        {
                //字节写入文件
                writeFile();
                //字节读取文件
                readFile3();
        }       
                //读取字节方法2
        public static void readFile2() throws IOException
        {
                FileInputStream fil=new FileInputStream("demo.txt");//读取指定的文件
                byte[] buf=new byte[1024];  问这里为什么是1024的大小,比较合适?求详解?
                int len=0;
                while ((len=fil.read(buf))!=-1)
                {
                        System.out.println(new String(buf,0,len)); //打印该数组,从0到结束。并转成新的字符串。
                }
                fis.close();//关闭资源。
        }
//写入字节流文件
        public static void writeFile() throws IOException
        {
                FileOutputStream fos=new FileOutputStream("demo.txt");//写入指定的文件
                fos.write("abdckjiedf".getBytes());  //将写入字节文件,注意,要把字符串转成字节。
                fos.close();//关闭资源。
        }
}
作者: 赵玮_Tom    时间: 2012-5-16 20:24
本帖最后由 赵玮_Tom 于 2012-5-16 20:26 编辑

楼主多虑了,你定义多长的数组都无所谓,只不过不要走两个极端:a)如果定义数组长度过大,你的内存是否吃得消?b)定义长度过短,读写次数会较频繁,比如你定义了一个长度为1的数组,呵呵,效率反而会降低。
之所以定义1024长度,是因为1024个字节正好是1kb,大小适中,并且容易计算。当然,你完全可以定义长度为1000或者2000,没问题的。
作者: 永恒之翼网络    时间: 2012-5-16 20:50
   "byte[] buf=new byte[1024];  问这里为什么是1024的大小,比较合适?求详解?"
我的理解是:1024byte 正好是1KB,我们平时上网时,上传和下载都是以KB为单位的所以把缓存的大小定义为1024byte或者它的整数倍符合实际需求。举例,以网上的网速1M为例,它的下载速度是100KB左右,这样把流的缓存定义为30*1024byte比较合适,但是如果你定义为1024byte以下,比如100byte,这样就会浪费网速,定义为1M网速跟不上,就会造成数据丢失。
作者: 高云飞    时间: 2012-5-16 21:18
我试验过的,有时间看看我这个帖子,对你有用的是,数组定义过小,会频繁读写,时间就长了,而定义过大的话,会浪费内存,而且,如果是复制文件的话,相比原文件会多一些没有实际意义的数据,比如说歌曲,我复制一个2m的歌曲,用4096大小的数组,最后比原文件大3k,如果继续增大数组,复制出来的新歌曲,最后那一段多出来的时间是空白的。可以参考我这个帖子:http://bbs.itheima.com/thread-13883-1-1.html
作者: 高云飞    时间: 2012-5-16 21:20
而且,一般情况下,1024大小的数组效率就很高了,我试过定义比这个更大的数组,快不了多少。可以说1024数组是时间和内存的比较合适的选择。
作者: 袁錦泰    时间: 2012-5-17 00:00
请阅读下面的换算公式:
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
当然,还有更大的计数单位和其他形式的换算方法,这里不再赘述
下面我为你简单说一下原因:
1.计量存储和传输的计量是以字节为单位
2.缓冲区(数组)容量并非固定不变,可以自行定义
3.为提高计算机的运算效率,将其定义为计算机最为熟悉的长度-->1024B,这是程序优化的一部分
我想你看到上面这几种换算形式与上面两位仁兄的回答,你的这个问题应该可以解决了
如果有不明白的地方可以恢复我,我再为你做进一步说明
作者: 黑马罗坚    时间: 2012-5-17 03:37
113M文件
File流  通过数字做缓存
缓存
32b 大小多2b 59893豪秒 62893豪秒
1kb   文件大小多 550b左右  5960豪秒  4305豪秒 5000豪秒 3945豪秒 5355豪秒 4460豪秒
8kb   文件大小多4k左右 1110豪秒 1020豪秒 910豪秒 32b  大小多2b  59893豪秒
Buffered流
默认缓冲区  大小没变  20485豪秒 16955豪秒  11203豪秒
读写 1k  1885豪秒  19910豪秒  24330豪秒 24330豪秒
buffer默认缓冲区  file 缓冲区1k(byte数组) 文件大小跟没用buffered包装的1k缓冲区大小一样
2440毫秒  1250豪秒  1330豪秒
buff和file缓冲区都是1024*8 文件大小跟没包装的8k一样 跟buff缓冲区1k file缓冲区8K速度一样
1300豪秒  1005毫秒 1265豪秒 990豪秒 1175豪秒 985豪秒

通过上面的测试  通过buffered包装以后不定义数组当缓冲区的话数度还是会很慢 当然比没包装的又没用数组当缓存区的话快了几倍
加了buffered包装流数组缓存1k的话比没加buffered的也快了2倍左右
加了buffered的数组8k跟没加的速度差不多

只有用数组做缓存的话才会加大文件的大小 不过应该对文件没影响吧 还是可以播放  
  

作者: HeiMaYSL    时间: 2012-5-17 11:55
赵玮_Tom 发表于 2012-5-16 20:24
楼主多虑了,你定义多长的数组都无所谓,只不过不要走两个极端:a)如果定义数组长度过大,你的内存是否吃得 ...

哦了,问题已解决。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2