代码改变世界

BufferedWriter中write与close函数使用

2019-02-25 19:53 by 无腿鸟, 2839 阅读, 0 推荐, 收藏, 编辑

BufferedWriter 是一个缓冲字符输出流,可以将要输出的内容先缓冲到一个字符数组中,等字符数组满了才一次性写到输出流内,默认的字符数组长度为8192。使用BufferedWriter 时需要对write与close函数有一定了解,看如下代码:

StringBuffer content = new StringBuffer();
BufferedWriter bWriter =  new BufferedWriter(new FileWriter(file, false));                

content.setLength(0);
bWriter.write(content.toString());
bWriter.close();

问题:

          1. BufferedWriter write函数写入空字符串时会怎么样?

          2. BufferedWriter close函数能否关闭FileWriter的文件流 

源代码(jdk1.6)解读:

public void write(String paramString) throws IOException {
    write(paramString, 0, paramString.length());
}
public void write(String arg0, int arg1, int arg2) throws IOException {
Object arg3
= this.lock; synchronized (this.lock) {   this.ensureOpen();   int arg4 = arg1;   int arg5 = arg1 + arg2;
while (arg4 < arg5) { int arg6 = this.min(this.nChars - this.nextChar, arg5 - arg4); arg0.getChars(arg4, arg4 + arg6, this.cb, this.nextChar); arg4 += arg6; this.nextChar += arg6; if (this.nextChar >= this.nChars) { this.flushBuffer(); } } } }

       答案1:content.setLength(0) 将字符串content 的长度设置为0,content不为null,所以content.toString()为'',一个空字符串。bWriter.write写入null会报错,但是写入''时不会报错,从源代码中可以看到当写入长度为0的字符串时,arg4==arg5,循环不会执行,也不会报错,能够正常处理

     

public void close() throws IOException {

    Object arg0 = this.lock;
    synchronized (this.lock) {
      if (this.out != null) {
          try {
               Writer arg1 = this.out;
               Throwable arg2 = null;

               try {
                    this.flushBuffer();
               } catch (Throwable arg21) {
                    arg2 = arg21;
                    throw arg21;
               } finally {
                    if (arg1 != null) {
                        if (arg2 != null) {
                            try {
                                 arg1.close();
                            } catch (Throwable arg20) {
                                 arg2.addSuppressed(arg20);
                            }
                        } else {
                            arg1.close();
                           }
                    }
                 }
            } finally {
this.out = null; this.cb = null; } } } }

         答案2:当BufferedWriter 关闭时,bWriter.close函数能够关闭FileWriter的文件流。从源代码中可以看出,bWriter.close()在close时会调用关闭FileWriter文件输出流,  其中,this.out 就是FileWriter对象,是被关闭了的。

 

 

StringBuffer中delete与setLength清空字符串效率比较

2019-02-25 18:55 by 无腿鸟, 1898 阅读, 0 推荐, 收藏, 编辑
摘要:问题: StringBuffer中有delete、setLength两个方法可以快速清空字符数组。哪个效率高呢? 结论:从清空字符串角度看,两者效率都很高,比较来看,setLength效率更高。 分析如下: 这两个函数都是继承自AbstractStringBuilder类。函数原型如下: delet 阅读全文

oralce 超过1亿条数据的数据库表清理实践

2018-08-18 16:58 by 无腿鸟, 1626 阅读, 0 推荐, 收藏, 编辑
摘要:问题:当一个表的数据量超过一亿条,要删除其中的5000w条,如何处理。 如果直接使用delete语句,会涉及到到大量的磁盘IO,并产生大量的数据库日志,效率很低,删除速度慢,可能导致事务中断,甚至有服务器硬盘空间撑爆的可能。 本文提供的思路是先将数据表需要保留的数据不带索引导出,然后导入一个新表中 阅读全文
点击右上角即可分享
微信分享提示