引言:Java中IO是十分重要的部分,如何正确的存储、获取数据关乎我们对这些数据的处理,可以说它们是程序处理数据的开始。
1.1.Java程序的输入输出是以“流”的方式进行,要进行IO操作也就是对IO数据流对象进行操作,首先应该先了解IO数据流的类型:
按流的的方向性不同分为:输入流 / 输出流
按流的处理数据单位不同可分为:字节流 / 字符流
按流的功能不同可以分为:节点流 / 处理流
1.2.详细说明:
输入流顾名思义就是对java程序来说,是输入的,体现的直观效果是可以从外部接受数据到程序中来处理;
输出流是对java来说是输出的,体现的直观效果是可以对外部文件写入数据。
这里需要注意的是一定是需要以java的角度来理解in和out
字节流就是以字节为单位来处理输入或是输出的数据,需要注意的是,既然是以字节为单位,那么难免遇到不止一个字节的字符会被这种处理流拆成两个部分来处理,由造成的后果需要程序员自己承担,JVM可不会背锅!
字符流就是以Unicode中的字符为单位来处理输入或是输出的数据,而且既然是以字符为单位,那么自然不需要担心本来是一个字符会被拆成两部分来处理。故本人是比较倾向于使用并建议使用字符流来处理一般的数据的。
节点流是指该对象直接对原始的数据进行操作的流,一般这样做可以使用的处理方法比较少;
处理就就是在节点流的基础上包装加工再对数据进行操作的流,这个使用可以使用的处理方法就比较多了,“包装”后的流,就可以越方便的处理数据,所以我们需要花费精力去记住都有哪些处理流。
2.1 IO流的类型:
首先是抽象类:
InputStream和OutputStream、Reader和Writer
对文件处理的节点流:
FileInputStream 和FileOutputStream、FileReader和FileWriter
带有缓冲功能的处理流:
BufferedInputStream和BufferedOutputStream、BufferedReader和BufferedWriter
在内存生成字节数据来存储数据的流:
ByteArrayInputStream和ByteArrayOtputStream
转换流(字节流转换成字符流): InputStreamReader和OutputStreamWriter
用来处理和java无关的基础数据类型的数据流:DataInputStream和DataOutputStream
控制打印数据显示位置的打印流: PrintSteam和PrintWriter
可以序列化后再处理的Object流:
ObjectInputStream和ObjectOutputStream
2.2 分析:
- 从上面所列出的流的种类可以看出,基本上所有的流都是成对出现的,一个输入一个输出,但是PrintStream和PrintWriter这个流比较特殊,只有输出而没有输入,一般用来控制打印的数据到日志文件中;
- 流中带Stream一般都是以字节为单位来处理数据,没有掌握它的使用方法的时候,难免会出现影响不到的输入输出结果;而带Reader和Writer的流一般都是以字符为单位来处理数据,这个相较于以字节来处理,出错的可能性就小很多;
- 带由Buffered的流是具有缓冲功能的流,避免了多次重复的对磁盘进行读写,而是存够一定数量的数据后再对磁盘进行读写,而且缓冲流中本身带有的处理方法也很吸引人去使用它,比如readline();
- 我们在使用流操作数据的时候个人建议使用处理流来进行操作,像用功能了,拿处理流来“包装”一下,活用这一点很关键,有时会更加高效的处理数据;
- 打印流一般是用来生成记录日志的;
- Object流似乎可用的地方不多,作为初学者可以只是大概知道有这么一个东西就好了,但是这个流要记住两个关键词:srializable和externalizable,具体什么意思,真正用到的时候再去查好了;
3 总结:
IO流的操作在java中是必须要掌握的内容,所以上述列出的各种流,能记住并熟练掌握用法是最好的,但是真的记不住也没关系,有个大概印象,在需要用的时候,看一下自习需要什么功能,然后查看对应的API文档,对照一下方法。毕竟,API文档可是java程序员的红宝书啊
