多线程下bufferedwriter若不关闭并不能记下所有log

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程下bufferedwriter若不关闭并不能记下所有log相关的知识,希望对你有一定的参考价值。

问题

一个很简单的多线程修改文件夹中特定文件名的程序。用bufferedwriter把待修改的文件名(包括完整地址)都记在Log里,以做检查之用。

发现如果不在最后关闭bw的话,每个文件夹只能写上最后一个文件的名字。即使bw.flush()也没有什么帮助。\\

 

package SamplePackage;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class WebdriverDemo {

    public static void main(String[] args) {
        String path = "C:\\\\Users\\\\XXX\\\\Desktop\\\\temp";
        String logPath = "C:\\\\Users\\\\XXX\\\\Desktop\\\\temp\\\\log.txt";
        reviseName(path,logPath);

    }
    
    public static void reviseName(String path, String logPath) {
        File dir = new File(path);
        File log = new File(logPath);
        
        BufferedWriter bw=null;
        try {
            bw = new BufferedWriter(new FileWriter(log,true));
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        if(dir.exists()) {
            File[] subFile = dir.listFiles();
            for(File file:subFile) {
                if(file.isDirectory()) {
                    String subpath = file.getAbsolutePath();
                    new Thread(new Runnable() {

                        @Override
                        public void run() {
                            reviseName(subpath,logPath);
                            
                        }
                        
                    }).start();
                } else{
                    String name = file.getName();
                    String parentPath = file.getAbsolutePath();
                    if(name.startsWith("Abc")){
                        try {
                            
                            bw.flush();
                            bw.write(parentPath);
                            bw.newLine();
                        } catch(Exception e) {
                            e.printStackTrace();
                        }
                        file.renameTo(new File(parentPath.replace("Abc","AAA")));
                        
                    }
                    
                }
            }
            
            try {
                if(bw!=null) {
                    bw.close();
                }
                
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
        
    }

}
View Code

 

以上是关于多线程下bufferedwriter若不关闭并不能记下所有log的主要内容,如果未能解决你的问题,请参考以下文章

单元测试多线程 程序不正常执行解决方案

socket java实现客户端多线程接受消息并发送消息给服务器,并发执行

多处理支持的并行循环不能嵌套在线程下面

BufferedWriter不能把数据发送出去,flush()也用了,只要不调用close()数据就发不出去,调用立马发送出去

java 多线程之取消与关闭

分析多线程 Java 应用程序