字符流主要是在IO流中运用到,为什么会写字符流技点呢?那是因为写到字符流和字节流就会想到IO流,在写字符流和字节流之前我们首先就要先认识IO流,我们知道什么是IO流码?其实IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象描述为流。
为什么会叫做IO流而不是叫其他的流的呢?其实IO流是输入(InputStream)和输出(OutputStream)两个的首字母组合成的,简称:IO流。
流的分类有几大种:
- 输出流和输入流
输入流和输出流相对于内存设备而言
将外设中的数据读取到内存中:输入
将内存的数写入到外设中:输出 - 字节流和字符流;
由来:其实就是字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字,在对这个文字进行操作。简单来说:字节流+编码表
字节流的两个顶层父类:1.InputStream 2.OutputStream
字符流的两个顶层父类:1.Reader 2.Writer
BufferedWriter,CharArrayWriter,FilterWriter,OutputStreamWriter,PipedWriter,PrintWriter,StringWriter 这些体系的子类都以父类名作为后缀。而且子类名的前缀就是该对象的功能。 - 节点流和处理流
按照流的角色类分,可以分为节点流和处理流。
节点流:可以从向一个特定的IO设备(如磁盘,网络)读/写数据的流。也被称为低级流。
处理流:用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能。也称为高级流
下面是一个普通的例子:
思路:需求:将一些文字存储到硬盘一个文件中。记住如果要操作文字数据,建议优先考虑字符流。而且要将数据从内存写到硬盘上要使用字符流中的输出流,Writer。硬盘的数据基本体现是文件,找到一个操作文件的Writer
//创建一个可以往文件中写入字符数据的字符输出流对象
既然是往一个文件中写入文字数据,那么在创建对象时就必须明确该文件(用于存储数据的目的地)。如果文件不存在则会自动创建,如果文件存在,则会被覆盖
如下演示图:
第一种的自动创建:
图1
图1是在Myeclipse中创建的是,文本中是没有任何数据的。
下面我将进行第二种:覆盖,我在图1中的文本天数据,看一下会是怎么样的。
图2添加好数据
一旦你在Myeclipse中在执行了一遍,你再到文件夹中找到文本,打开文本依旧没有数据的,直接会变成图1一样没有任何的数据的空白文本。为什么数据会没有呢?其实文件已经被覆盖了,在同一个代码中再执行一次文本里面的数据就会被覆盖。其实什么叫覆盖呢?覆盖就是判断一下它,有没有这个东西,有的话就干掉它再运行一遍。没有的话就自动创建。
下面一段代码其实就是调用Writer对象中的writer(string)方法,写入数据。
图3
执行效果还是空文本,为什么又会是空文本呢?我不是已经把数据写上了吗?难道没保存,其实不是的,其实数据写入到了 临时存储缓冲区中。
图4
所以我们最主要的是进行刷新一下,将数据直接写到目的地中。然后我们再把文件夹中的demo.txt文本删掉,再Myeclipse中重新执行一遍。数据就会在文本中显示出来。如下图效果:
图5
接下来我们进行关闭流,在关闭此流之前我们要先刷新它,再调用flush()刷新缓冲中的数据到目的地。将导致抛出异常IOException,它告诉我们流已经结束了,流都没有了写了数据也是没用的。如下图6所示
图6
接下来要实现的一个功能是,我要在文本中实现第一行是“abcd”第二行是“hahaha”在原来代码图3的情况下加上LINE_SEPARATOR然后会出现错误,把鼠标移到LINE_SEPARATOR它的下面,你会有很多错误出现,你点击第一条它就是拿系统的代码,图7.2就是它系统的代码。我进行更改了。
图7.1
图7.2
运行出来的效果就是如下所示
总结,其实我上面写的都是一些很基础的东西,并不是很多的难点,难点都是在基础的情况下慢慢延伸出来的,比如说我们是不是可以用try…catch输出啊捕获一下异常等,都是我们需要去延伸和挖掘的。我没有写这些是因为我觉得我应该了解更多的一些基础,那样我才会知道其他的一些难点是从哪里出来的,并不会说毫无头绪。并且有多流的方法就是很相似的,其实OutputStream和Writer是所有输出流的基类,它们的方法也是非常类似的。