初学IO时,看到API手册上关于IO的知识内容非常的多,难免让我们这些还没入门或是刚踏进一只脚的JAVA初学者有些畏惧,不过内容再多,我相信只要肯花时间多去练习多写代码,多花心思去体会,掌握IO并能熟练应用那肯定是迟早的事情了。
IO流的几个分类:
按流向分:
输入流: 程序可以从中读取数据的流。
输出流: 程序能向其中写入数据的流。
按数据传输单位分:
字节流: 以字节为单位传输数据的流
字符流: 以字符为单位传输数据的流
今天学到了通过字符流对文本文件的读写操作。既然是对文件的操作,就要用到FileReader 和FileWriter这么两个用来读取和写入字符文件的便捷类。
首先是写字符数据:
创建一个字符写入流对象:FileWriter fw = newFileWriter("demo.txt", true);
既然是往一个文件中写入字符数据,那么在创建对象时,要明确该文件(即用于存储文件的目的地),这里"demo.txt"是工程目录下的一个文本文件。如果该文本文件已存在,泽会被覆盖,如果不存在,则会被自动创建。第二个参数 true也可以不用加,这里表示文件可以被续写。 当字符数据被写入到指定文件中后,即写数据操作过程结束后要记得关闭数据流,使用close()方法关闭流,以免占据系统资源。
下面是写字符数据到一个指定的文本文件中的部分代码:
//创建一个可以往文件中写入字符数据的字符写入流对象
FileWriterfw = new FileWriter("demo.txt", true);
//调用writer(String )写入字符数据
//数据被写入到临时存储缓冲区中
fw.write("itheima");
//刷新流,数据将会被写入到指定文件中
fw.flush();
//关闭流,关闭之前会先刷新流。
fw.close();
说完了写字符数据,然后就是读取字符数据了。
首先也是要使用能对文件进行操作的类,这里有FileReader类,读取字符数据的方式有两种,一种是单个字符读取,另外就以数组的形式读取,后者的代码执行效率更高。这里就看看用数组读取字符数据的具体方法,看代码如下:
//记录每次取出的字符个数
inttemp = 0;
//定义一个char型的数组用来缓存读取的字符数据
char[]chs = new char[1024];
//创建一个null的字符读取流对象
FileReaderfr = null;
//对于异常的处理进行了捕获
try{
//初始化了字符读取流对象,并指定了读取的目标文件
fr= new FileReader("demo.txt");
//temp记录下了每次读取出的字符数据个数,如果读到了流的末尾泽返回-1
while((temp=fr.read(chs))!=-1)
{
//将字符数据转换成字符串的形式打印输出
System.out.print(newString(chs));
}
}catch (Exception e) {
thrownew RuntimeException("操作失败");
}
//保证关闭流的执行
finally{
//判断流对象是否为空,不为空则关闭流
if(fr!=null)
{
try{
fr.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
这里面有一个小细节的问题,就是当数组指定的长度小于被读取文件中的字符个数的时候,例如:char[]chs = new char[3];而字符数据是"abcde",那么第一次读取的字符个数temp=3,此时数组中的数据是{a,b,c},第二次再读取的字符个数temp=2,此时的数组中的数据是{d,e,c},这里数组的第三个元素c其实是上次读取到的在这次读取后没有被覆盖。
如果我们要使用这种方法将读取出的数据在存储到另外的文件中时可能会出现问题,如果是想将字符数据复制到另外一个文件中,这时候再使用write(char[] cbuf)方法将得到数组形式的数据写入一个文件中,得到的文件中的数据是"abcdec",很显然复制后的文件和源文件不一样。这时可以使用write(char[]cbuf, int off, int len)方法来解决这个问题。因为每次temp会记录下此次读取的字符数据个数,只要将上面方法中的off设置为0,len设置为temp,这样每次写入的过程只将当前读出的数据写入,而上次读出而又未被覆盖的数据不会被写进来了。
---------------------- ASP.Net+Unity开发、 .Net培训、期待与您交流! ----------------------详细请查看: www.itheima.com