String,StringBuffer和StringBuilder的关系.
先说下String和另外两者的关系吧,String其实是一个不可以改变的对象,每次对String对象进行修改的时候,其实都是创建了一个新的String对象,而每次生成新对象对系统其实都是一个损耗,系统性能都会下降,在开发中,如果要创建多次String对象,不建议使用String,而用StringBuffer就完全不一样了,他不会生成新对象,而是把原来的覆盖掉,或者说在原基础上进行修改.
那么说道这里就要说一下StringBuffer和StringBuilder的区别了,其实就是StringBuilder更加高效一点而已,StringBuilder是线程不安全的,StringBuffer是线程安全的.两者的方法基本都是相同的,StringBuffer基本用到的就是append,charAt和insert方法.附上一个最简单的代码说明一下.
public static void main(String[] args) { StringBuffer sb = new StringBuffer("abc"); sb.append("def");//append方法是在字符串末尾追加一个新串 sb.insert(6, "ghi");//insert(index,string)这个是在指定索引出添加字符串 System.out.println(sb.charAt(7));//charAt(index)方法是返回指定索引出的字符 }需要注意的就是:string类型的字符串是不可以改变的,而另外两者是可以改变的,常用方法记住就好啦,至于用到特殊的到时候再去查API.
我们再来说一下readline();
这个方法属于BufferedReader类的,是用来读取一行字符的,他读取文本文档的时候会一行一行的读取,那么怎么判定这一行读取完进行下一行呢,在我们常用的Windows系统中是通过"\r\n"进行判断的,对于苹果系统是通过"\r"来判断的.
通过IO流创建流,关闭流,我们来想一下,哪种流用完是必须要刷新的,哪种是不用的呢,在前面我介绍了两种流,字符流和字节流.需要一提的是,writeline()方法是属于BufferedWriter类的.
其实是这样子,因为字符流读取文件的时候呢,它是需要先存储到缓冲区中的,消耗系统内存,这样会提高存储效率,同时也要注意的是,字符流读取完毕要进行刷新,让缓冲区当中的字符全部写到文件中,因为只有下一次字符写入到缓冲区,缓冲区才会将本次的字符写入到文件中.
而字节流完全不用考虑这些问题,字节流是直接系统一个字节一个字节的读写,什么都不用考虑.
我们要区分开来,字节流和字符流,可能大家在读取纯文本文档的时候会遇到一个问题,我们都知道,一个中文字符是占用两个字节的,那么比如我们文档中有三个字符的中文字,那么通过字节流三个字节三个字节读取的时候会出现乱码的问题,相信到家都遇到过.
这时候我们就需要用到字符流了,字符流有自己对用的编码表,系统用什么方式读,程序就会用什么方式写,完全不用考虑乱码的问题.
下面我们来看一下字节字符流之间转化关系,用代码来说明一下
BufferedReader br = //更高效的读 new BufferedReader(new InputStreamReader(new FileInputStream("aaa.txt"))); BufferedWriter bw = //更高效的写 new BufferedWriter(new OutputStreamWriter(new FileOutputStream("bbb.txt"))); int c; while((c = br.read()) != -1) { bw.write(c); } br.close(); bw.close();这个其实并不难,我们来想象一下,把字节流比喻成小型水管,把字符流比喻成大型水管,我们把谁从小型水管运输到到大型水管,运送大型水管,这是写入的过程,最后到达目的地之后再将大型水管也就是字符流,运输给小型水管也就是字节流,写入文件,这样会大大的提高读写的效率,因为字符流是靠缓冲区来执行的,而缓冲区在内存中,内存的运算速度是相当快的.
好了,大家查漏补缺,如果我还有什么不足,请多多提意见,我会多加努力哒,这就是关于IO流啦~~~