首页 > 编程语言 >Java的IO性能调整

Java的IO性能调整

时间:2023-07-31 22:03:11浏览次数:36  
标签:文件 Java 字节 字符 缓冲 性能 IO 缓冲区 方法


摘要:

本文大多技术围绕调整磁盘文件 I/O,但是有些内容也同样适合网络 I/O 和窗口输出。

第一部分技术讨论底层的I/O问题,然后讨论诸如压缩,格式化和串行化等高级I/O问题。然而这个讨论没有包含应用设计问题,例如搜索算法和数据结构,也没有讨论系统级的问题,例如文件高速缓冲。

Java语言采取两种截然不同的磁盘文件结构。一个是基于字节流,另一个是字符序列。在Java语言中一个字符有两个字节表示,而不是像通常的语言如c语言那样是一个字节。因此,从一个文件读取字符时需要进行转换。这个不同在某些情况下是很重要的,就像下面的几个例子将要展示的那样。

低级I/O相关的问题:

  • 缓冲
  • 读写文本文件
  • 格式化的代价
  • 随机访问

高级I/O问题

  • 压缩
  • 高速缓冲
  • 分解
  • 串行化
  • 获取文件信息
  • 更多信息

加速I/O的基本规则

  • 避免访问磁盘
  • 避免访问底层的操作系统
  • 避免方法调用
  • 避免个别的处理字节和字符

很明显这些规则不能在所有的问题上避免,因为如果能够的话就没有实际的I/O被执行。

使用缓存减少读写次数开销

使用缓冲加速文件读取的示例:

这个巨大的加速并不能证明你应该总是使用第三种方法,即自己做缓冲。这可能是一个错误的倾向特别是在处理文件结束事件时没有仔细的实现。在可读性上它也没有其它方法好。但是记住时间花费在哪儿了以及在必要的时候如何矫正是很有用。方法2 或许是对于大多应用的 "正确" 方法.

方法 2 和 3 使用了缓冲技术, 大块文件被从磁盘读取,然后每次访问一个字节或字符。缓冲是一个基本而重要的加速I/O 的技术,而且有几个类支持缓冲(BufferedInputStream 用于字节, BufferedReader 用于字符)。

缓冲区越大I/O越快吗?典型的Java缓冲区长1024 或者 2048 字节,一个更大的缓冲区有可能加速 I/O但比重很小,大约5 到10%。

方法1: 读方法

第一个方法简单的使用FileInputStream的read方法:

方法 2: 使用大缓冲区

第二种方法使用大缓冲区避免了上面的问题:

方法 3: 直接缓冲

方法4: 缓冲整个文件

对于一个1 MB的输入文件,以秒为单位的执行时间是:FileInputStream的read方法,每次读取一个字节,不用缓冲             6.9秒 BufferedInputStream的read方法使用BufferedInputStream              0.9秒 FileInputStream的read方法读取数据到直接缓冲                       0.4秒或者说在最慢的方法和最快的方法间是17比1的不同。

这个方法很方便,在这里文件被当作一个字节数组。但是有一个明显得问题是有可能没有读取一个巨大的文件的足够的内存。

缓冲的另一个方面是向窗口终端的文本输出。缺省情况下, System.out ( 一个PrintStream) 是行缓冲的,这意味着在遇到一个新行符后输出缓冲区被提交。

标签:文件,Java,字节,字符,缓冲,性能,IO,缓冲区,方法
From: https://blog.51cto.com/u_3124497/6913774

相关文章

  • Android permission 访问权限大全
    Androidpermission访问权限大全AndroidAndroidpermission0Commentsandroidmanifest.xml中声明相关权限请求,完整列表如下:android.permission.ACCESS_CHECKIN_PROPERTIES允许读写访问”properties”表在checkin数据库中,改值可以修改上传(Allowsread/writeaccess......
  • android学习之TransitionDrawable …
    Drawable的例子,体现出Drawable的强大功能。AndroidSDK中说明了Drawable主要的作用是:在XML中定义各种动画,然后把XML当作Drawable资源来读取,通过Drawable显示动画。下面举个使用TransitionDrawable的例子,创建一个Android工程,然后再这个工程的基础上修改,修改过程如下:1、去掉layout......
  • 注意!JAVA中的值传递
    前言:今天在解决一个问题时,程序总是不能输出正确值,分析逻辑思路没问题后,发现原来是由于函数传递导致了这个情况。LeetCode113问题:给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。示例 输入:root=[5,4,8,11......
  • Java面试题 P22:Redis篇:Redis做为缓存,Redis的数据淘汰策略是什么?
          ......
  • Java面试题 P20:Redis篇:Redis做为缓存,数据的持久化是怎么做的?
    Redis做为缓存,数据的持久化是怎么做的?在Redis中提供了两种数据持久化的方式:1、RDB  2、AOF       ......
  • Java面试题 P19:Redis篇:Redis做为缓存,mysql的数据如何与redis进行同步呢(双写一致)
    双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。     共享锁:读锁代码 排他锁,写数据。读锁和写锁的值要一致。   MQ异步消息通知:    ......
  • IoToS-App 0.6.0 移动端业务实现 文档开源
    IoTOS-App v0.6.0    本次更新主要适配移动端卡号查询、智能诊断、用量记录、批量业务办理、会话记录功能实现。   www.iotos.top文档页面网站源代码已开源,感兴趣的可用于搭建简单文档网站等,vue、markdown、html语法适配。文档网站源码地址:  https://gitee.com/c......
  • JavaScript基础01
    javaScript作用1.嵌入动态文本于HTML页面。2.对浏览器事件做出响应。3.读写HTML元素。4.在数据被提交到服务器之前验证数据。5.检测访客的浏览器信息。控制cookies,包括创建和修改等。6.基于Node.js技术进行服务器端编程。js主要的内容ECMAScript语法变量......
  • Java面试题 P18:Redis篇:Redis使用场景-缓存-缓存雪崩
          缓存雪崩:是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量的请求到达数据库,带来巨大压力。                            ......
  • 【腾讯云Cloud Studio实战训练营】Cloud Studio 快速搭建学习分享
    零、前言最近接触到了一款开发神器,云端IDE,相比于传统的IDE,云端IDE可以更大程度的提升用户工作的效率。带大家一起了解CloudStudio的神奇之处。一、CloudStudio1.1、CloudStudio是什么云IDECloudStudio作为腾讯云出品的一款在线云端开发工具,它可以帮助用户减少安装IDE......