java 快速io_如何快速理解Java的IO流

初学者觉得IO流复杂是很正常的,归根结底是没有理解JavaIO框架的设计思想:可以沿着这条路想一想:

1,学IO流之前,我们写的程序,都是在内存里自己跟自己玩。比如,你声明个变量,创建个数组,创建个集合,模拟一个链表,使用一些常用API,现在回想一下,是不是在只是自己在内存里玩一玩?计算机组成包括运算器,控制器,存储器,输入设备,输出设备。那么你前面的工作,仅仅够你的程序和内存以及CPU打交道,如果你需要操作外部设备呢?比如键盘,显示器,再比如,最常见的外设:硬盘?

2,所以程序设计语言必须要提供程序与外部设备交互的方式,这就是IO框架的由来。我们需要和外部设备进行数据的交互。那么,计算机是通过什么和外部进行交互的呢?很简单就能想到:数据线。数据线里传播的是什么呢?一个词:比特流。比特就是bit的谐音,计算机中“位”的意思,代表0或1。1位或者1bit,就是一个0或一个1。但是,毕竟0或1不能表示什么,所以计算机更常见的基本单位是字节,也就是用8位0或1组成的一段数据。以上是对比特流的由来做一个简单地解释。

3,既然计算机和外界进行信息的输入和输出交互,用的是比特流,那么很容易就能想到IO流名字的由来了。就是比喻输入输出的数据像流一样。我们可以这么认为,任何外部设备与内存之间输入输出的操作,都是需要输入输出流(IO流)来完成的,这里的IO流,指的就是比特流。这些外部设备,包括,键盘(标准输入设备),显示器(标准输出设备),音响,甚至你玩游戏用的游戏手柄,以及各种各样的信号传感器,都可以叫做外部设备,和这些设备之间进行数据交互,显然不可能靠之前学习的那些数组,集合,常用类,String等等来完成。而是要靠和外界数据交换的类来完成。靠什么来进行数据交换,就是前面说的,比特流,或者说IO流。

4,那么,既然要学习IO流,就得针对某一个输入输出设备来学习。哪种输入输出设备最常见?当然是硬盘。硬盘在这里的含义也可以理解为文件系统。(Java程序是运行在某操作系统平台上的应用软件JVM上的,实际上Java程序可见的并不是硬盘,而是操作系统提供的文件系统,因此此处可直接理解为文件系统)。因此,我们学习IO流的时候,基本上是学习的Java如何操作文件系统,除了文件系统,我们还能够了解Java操作标准输入输出设备,如http://System.in和System.out。

5,知道了学习的方向,是要使用Java操作文件系统,那么首先要学习的就是文件的表示,即File类。然后,我们要操作做文件,虽然我们大部分操作都是操作文件系统,但是IO流的概念不仅仅局限在操作文件上,前面我一经提到了。我们要能操作所有的输入输出,因此,API提供了两个顶层抽象类,用来表示所有的输出输出:InputStream,OutputStream。并且,这两个类表示字节的输入输出。那么,当我们要操作文件的时候,就需要具体的对文件系统操作的IO类,于是我们需要学习FileInputStream和FileOutputStream,它们是文件输入输出字节流。

6,学了文件IO字节流之后,我们会发现有时候用起来没那么高效,具体原因查看源代码。这里只提醒一句:带缓冲区的流对象,可以一次读一个缓冲区,不带缓冲区的流对象,只能一个字节一个字节的读,非常低效。所以又有了BufferedInputStream和BufferedOutputSteam。

7,说到操作文件,就不得不提到文件的分类和编码格式。文件分为二进制文件和文本文件,二进制文件是用记事本看不懂的,他们的编码格式是特殊的,比如pdf文件,exe文件。记事本打开后人能看懂的只有纯文本文件,我们处理文件,就免不了处理一些文本文件。如果是英语国家的人还好说,因为他们是用的常用字符用一张ASCII码表就能表示得出来,用一个字节就能表示一个字母。但是显然,对非英语国家的人来说,一个字节的大小无法表示他们所有的文字。因此,人们需要有能够处理字符的类,或者说这个类提供一个功能,就是把输入的字节转成字符,把要输出的字符转成计算机可以识别的字节。所以,你需要两个转换流:InputStreamReader和OutputStreamWriter。这两个类的作用分别是把字节流转成字符流,把字符流转成字节流。但是这两个流需要套在现成的字节流上才能使用,当中用到的设计模式也就是常说的装饰模式。

8,还是回到文件系统,我们最常见的是和文件系统打交道,有时读取文本文件能不能用一种方便的方式呢?当然,大牛们替你想到并提供了。FileReader和FileWriter这两个流对象可以直接把文件转成读取、写入流。让你省去了创建字节流,再套上转换流的步骤。看看这类名起的,实际上很形象,Reader和Writer,明摆着告诉你“阅读和书写”都是“人可以做的”也就是他们表示的是字符流。同理上面的InputStreamReader和OutputStreamWriter,表示的是把字节流转成人可读的,把字节流转成人可写的。

9,同上面说的缓冲区的作用,再把Reader和Writer做成高效的,就需要BufferedReader和BufferedWriter,把它们套在Reader和Writer上,就能实现高效的字符流。

10,讲到这里,IO流的大概思想已经说的的差不多了,是不是觉得之前混乱的那些类,现在知道他们的作用和设计思想以后,稍稍清晰了许多呢?可以简单的记,字节流是基础,字符流是对于字符功能的增强,操作文件系统有现成的File开头类。另外,还有许多类是“在内存里自己和自己玩的”比如ByteArrayReader/Writer,PipedWriter/Reader,以及其他带有某些功能的类,比如序列化流,比如数据输入输出流,等等。用到了再具体分析即可。这里先写到这里了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Effective C++ 学习笔记(11)

确定基类有虚析构函数 class A{public: A() { cout<<"A constructor"<<endl; }~A() { cout<<"A destructor"<<endl; }};class B: public A{public: B() { cout<<"B constru…

微软职位内部推荐-Software Development Engineer 2

微软近期Open的职位:SDE IIOrganization Summary:Engineering, Customer interactions & Online (ECO) is looking for a great "Software Development Engineer" to join our team. Customer support is a strategic differentiator for Microsoft and we are i…

C#判断某软件是否安装

代码 privatevoidbutton1_Click(objectsender, EventArgs e) { if(checkAdobeReader() true) { MessageBox.Show("有安裝 Adobe Reader "); } else{ MessageBox.Show("沒有安裝 Adobe Reader "); } …

男朋友和女朋友的区别。。。

1 区别于这耳光来的也是猝不及防。。。2 铲屎官做的一个防止猫咪抢食的装置大概就是这只橘猫保持苗条的秘籍吧3 学生时代的爱情大概就是这样吧。。4 这样的哥哥给我来一打&#xff01;5 据我多年经验&#xff0c;应该是溺水身亡了6 治婊专家陈豪&#xff0c;专业补刀二十年&…

如何在 C# 循环中捕获局部变量?

咨询区 Morgan Cheng&#xff1a;我遇到了一个有趣的问题&#xff0c;它的代码大概是这样的。List<Func<int>> actions new List<Func<int>>();int variable 0; while (variable < 5) {actions.Add(() > variable * 2); variable; }foreach (v…

java创建计数器变量,用于检查变量(计数器)最大长度的Java方法

Kindly please anyone who knows is the any method to knowwhat is the limit of length of a counter?Depsite from initiliazed variables types (either int, byte, long etc)is there any way for me to check my variable (counter)s max lenght?Please share the info…

【原创】Newlife.XCode的常见功能使用(一)查询与数据初始化

本博客所有文章分类的总目录&#xff1a;http://www.cnblogs.com/asxinyu/p/4288836.html Newlife XCode组件相关文章目录&#xff1a;http://www.cnblogs.com/asxinyu/p/4329747.html 1.前言 声明&#xff1a;此Newlife.XCode非Mac的XCode&#xff0c;避免误会。 1.QQ群:16008…

IronRuby - 如何在VS2010下调试IronRuby代码

在OpenExpressApp &#xff0d; 使用VS2010的CodedUI来做自己的自动化测试框架中介绍了我将使用IronRuby进行测试框架的编写。虽然Ruby已经非常的流行&#xff0c;我所在公司有的项目也深入的应用过&#xff0c;但它对于我来说还是非常新的&#xff0c;对它的认识也就是快速的看…

python七夕快乐图片_提前祝七夕快乐图片

1.微信朋友圈圣诞快乐图片制作 轻松获得无数点赞朋友圈是当下人们经常浏览的社交空间&#xff0c;倘若自己的发文得到很多点赞&#xff0c;这就成了一件很有面子的事情。今天小编要教大家的就是微信朋友圈圣诞快乐图片制作&#xff0c;学会后就不愁在朋友圈吸引眼球获得点赞啦&…

AgileConfig轻量级配置中心1.4.0发布,重构了发布功能

加入 NCC 先说一个事&#xff0c;AgileConfig 在 7 月底终于通过了 NCC 社区的审核&#xff0c;正式成为了 NCC 大家庭的一员。这对 AgileConfig 来说是一个里程碑&#xff0c;希望加入 NCC 后能更好的帮助到大家。同时责任也更大了&#xff0c;本人会一如既往的对这个项目维护…

你为什么不爱发朋友圈了?

全世界只有3.14 % 的人关注了爆炸吧知识想发自拍、想秀恩爱、想分享生活状态但一想到别人指手画脚的评论发朋友圈这件事便索然失味人生是不是已经了无生趣了呢关注以下这几个优质订阅号远离朋友圈的日子令你耳目一新不信你就扫码试试RSS精选ID&#xff1a;KindleNewsRSS精选是一…

控制台编写JAVA程序教程_写一个java程序的步骤是什么?写java程序技巧

写Java程序是要按照步骤来的&#xff0c;这样才能写好一个java程序&#xff0c;那么接下来&#xff0c;我们就来给大家讲解一下写一个java程序的步骤是什么?(1)创建Java项目&#xff1a;“FileNewProjectJava Project”;(2)创建Java源程序&#xff1a;“FileNewOtherClass”;(…

IE6下z-index犯癫不起作用bug的初步研究

by zhangxinxu from http://www.zhangxinxu.com 本文地址&#xff1a;http://www.zhangxinxu.com/wordpress/?p471 一、匆匆带过的概念 关于CSS中层级z-index的定义啊什么的不是本文的重点&#xff0c;不会花费过多篇幅详细讲述。这里就简单带过&#xff0c;z-index伴随着层的…

C#读取INI文件

虽然微软早已经建议在WINDOWS中用注册表代替INI文件&#xff0c;但是在实际应用中&#xff0c;INI文件仍然有用武之地&#xff0c;尤其现在绿色软件的流行&#xff0c;越来越多的程序将自己的一些配置信息保存到了INI文件中。 INI文件是文本文件,由若干节(section)组成,在每个带…

本地打开extjs api docs 的方法

将docs目录下 index.html 中的 <script type"text/javascript"src"../adapter/ext/ext-base.js">替换为 <script type"text/javascript"src"../adapter/jquery/jquery-1.4.2.min.js"></script><script type&quo…

独孤思维:穷b只对小概率惶恐不安,对100%确定却视而不见

穷b只对小概率事件惶恐不安&#xff0c;而对于100%确定的事情却视而不见。 穷逼有一个特点&#xff0c;喜欢把外界问题当作自己最大的挡箭牌&#xff1a; 对于小概率发生的事件&#xff0c;惶恐不安&#xff0c;避而远之&#xff0c;而对于100%确定的事情&#xff0c;却装作视…

电子报账系统源码_亲清直播间 | “互联网+财税”引领企业专票电子化变革

2019年11月27日&#xff0c;国务院常务会议要求“ 2020年年底前实现增值税专用发票电子化”&#xff0c;这标志着将增值税专用发票电子化工作正式提上日程。2020年8月3日&#xff0c;国家税务总局发布《关于进一步支持和服务长江三角洲区域一体化发展若干措施的通知》(税总函〔…

Dapr牵手.NET学习笔记:想入非非的服务调用

demo运行环境&#xff1a;Windows10&#xff0c;Docker(dapr_zipkin&#xff0c;dapr_redid&#xff0c;dapr_placement)安装&#xff1a;dapr init卸载&#xff1a;dapr uninstall&#xff0c;然后删除 C:\Users\当前用户\.daprdapr在部署时是通过给服务挂载一个sidecar&#…

老婆晚上不想睡?这个操作你要会!

1 会跪键盘吗&#xff1f;2 吃鸡时捡装备的你3 这是个失败之作4 是时候让你见识什么叫真正的技术了 5 别人的老师 6 陷入僵橘7 恐高者慎看你点的每个赞&#xff0c;我都认真当成了喜欢

java中JOptionPane类_java:JOptionPane类消息框总结

最近在写projet时经常用到JOptionPane的消息提示框&#xff0c;今天在这里做一个总结。主要用到四种消息提示框方法&#xff1a;showMessageDialog()&#xff1a;消息对话框showOptionDialog()&#xff1a;选择对话框showInputDialog()&#xff1a;输入对话框showConfirmDialog…