IO流(需要注意的问题)

时间:2022-01-05 22:32:34

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流啦~~~