java io能分析.doc

  1. 1、本文档共28页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
java io性能分析 博客分类: JavaSE ? 摘要: 本文大多技术围绕调整磁盘文件 I/O,但是有些内容也同样适合网络 I/O 和窗口输出。 第一部分技术讨论底层的I/O问题,然后讨论诸如压缩,格式化和串行化等高级I/O问题。然而这个讨论没有包含应用设计问题,例如搜索算法和数据结构,也没有讨论系统级的问题,例如文件高速缓冲。 Java语言采取两种截然不同的磁盘文件结构。一个是基于字节流,另一个是字符序列。在Java 语言中一个字符有两个字节表示,而不是像通常的语言如c语言那样是一个字节。因此,从一个文件读取字符时需要进行转换。这个不同在某些情况下是很重要的,就像下面的几个例子将要展示的那样。 低级I/O相关的问题: 缓冲 读写文本文件 格式化的代价 随机访问 高级I/O问题 压缩 高速缓冲 分解 串行化 获取文件信息 更多信息 加速I/O的基本规则 避免访问磁盘 避免访问底层的操作系统 避免方法调用 避免个别的处理字节和字符 很明显这些规则不能在所有的问题上避免,因为如果能够的话就没有实际的I/O被执行。 使用缓存减少读写次数开销 使用缓冲加速文件读取的示例: 对于一个1 MB的输入文件,以秒为单位的执行时间是: ?FileInputStream的read方法,每次读取一个字节,不用缓冲 ????????????6.9秒 ?BufferedInputStream的read方法使用BufferedInputStream????????? ????0.9秒 ?FileInputStream的read方法读取数据到直接缓冲????????????? ?????????0.4秒 或者说在最慢的方法和最快的方法间是17比1的不同。 这个巨大的加速并不能证明你应该总是使用第三种方法,即自己做缓冲。这可能是一个错误的倾向特别是在处理文件结束事件时没有仔细的实现。在可读性上它也没有其它方法好。但是记住时间花费在哪儿了以及在必要的时候如何矫正是很有用。方法2 或许是对于大多应用的 正确 方法. 方法 2 和 3 使用了缓冲技术, 大块文件被从磁盘读取,然后每次访问一个字节或字符。缓冲是一个基本而重要的加速I/O 的技术,而且有几个类支持缓冲(BufferedInputStream 用于字节, BufferedReader 用于字符)。 缓冲区越大I/O越快吗?典型的Java缓冲区长1024 或者 2048 字节,一个更大的缓冲区有可能加速 I/O但比重很小,大约5 到10%。 方法1: 读方法 第一个方法简单的使用FileInputStream的read方法: FileInputStream的read方法每次读取文件的下一个字节,触发了大量的底层运行时系统调用 优点:编码简单,适用于小文件 缺点:读写频繁,不适用于大文件 ?import java.io.*; ? public class intro1 { ??? public static void main(String args[]) { ????? if (args.length != 1) { ??????? System.err.println(missing filename); ????? ??System.exit(1); ????? } ????? try { ??????? FileInputStream fis = new FileInputStream(args[0]); // 建立指向文件的读写流 ??????? int cnt = 0; ??????? int b; ??????? while ((b = fis.read()) != -1 ) {? // FileInputStream 的read方法每次 读取文件一个字节 ????????? if (b == \n) ????? ??????cnt++; ??????? } ??????? fis.close(); ??????? System.out.println(cnt); ????? } ????? catch (IOException e) { ??????? System.err.println(e); ????? } ??? } ? } 方法 2: 使用大缓冲区 第二种方法使用大缓冲区避免了上面的问题: BufferedInputStream的read方法 把文件的字节块读入缓冲区,然后每次读取一个字节,每次填充缓冲只需要访问一次底层存储接口 优点:避免每个字节的底层读取,编码相对不复杂 缺点:缓存占用了小量内存 import java.io.*; ?public class intro2 { ?? public sta

文档评论(0)

lanhe8975915 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档