【问题标题】:Writing to a text file while making use of Multithreading在使用多线程时写入文本文件
【发布时间】:2016-03-31 14:58:24
【问题描述】:

我正在尝试使用一个专用线程来定期覆盖文件,以便文件中唯一实际更改的内容是我在 GUI 中更改的内容。以下是相关代码:

    private ThreadClass writeToFile = new ThreadClass("toFile"){
        @Override
        public void run(){
            synchronized(lock){
                NameAddressID store[] = new NameAddressID[10];
                boolean tmpFile = true;
                Scanner loadOver;
                PrintWriter overWrite;
                while(true){

                    try {
                        if(tmpFile){
                            loadOver = new Scanner(new File("NAIList.txt"));
                            overWrite = new PrintWriter("NAIList.tmp", "UTF-8");
                        }else{
                            loadOver = new Scanner(new File("NAIList.tmp"));
                            overWrite = new PrintWriter("NAIList.txt", "UTF-8");
                        }
                        for(int i = 0; i < count-1; i++){
                            for(int j = 0; j<10; j++){
                                if(loadOver.hasNextLine()){
                                    String[] tokens = loadOver.nextLine().split(";");
                                        store[j] = new NameAddressID(tokens[0], tokens[1], tokens[2], tokens[3], tokens[4], tokens[5], Integer.valueOf(tokens[6]), Integer.valueOf(tokens[7]));
                                }else{
                                    store[j] = null;
                                }
                            }
                            for(int j = 0; j<store.length;j++){
                                if(store[j] != null){
                                    overWrite.print(store[j].getFirst()+";");
                                    System.out.print(store[j].getFirst()+" ");
                                    overWrite.print(store[j].getMiddle()+";");
                                    System.out.print(store[j].getMiddle()+" ");
                                    overWrite.print(store[j].getLast()+";");
                                    System.out.print(store[j].getLast()+" ");
                                    overWrite.print(store[j].getStreet()+";");
                                    System.out.print(store[j].getStreet()+" ");
                                    overWrite.print(store[j].getCity()+";");
                                    System.out.print(store[j].getCity()+" ");
                                    overWrite.print(store[j].getState()+";");
                                    System.out.print(store[j].getState()+" ");
                                    overWrite.print(store[j].getZip()+";");
                                    System.out.print(store[j].getZip()+" ");
                                    overWrite.println(store[j].getId());
                                    System.out.println(store[j].getId());
                                    store[j] = null;
                                    overWrite.flush();
                                }else{
                                    break;
                                }
                            }

                        }
                        saveArrayText("NAIList.tmp", overWrite);
                        for(int i = 0; i < addressList.size(); i++){
                            if(loadOver.hasNextLine()){
                                String skip = loadOver.nextLine();
                            }
                        }
                        while(loadOver.hasNextLine()){
                            int index = 0;
                            String[] tokens = loadOver.nextLine().split(";");
                            store[index++] = new NameAddressID(tokens[0], tokens[1], tokens[2], tokens[3], tokens[4], tokens[5], Integer.valueOf(tokens[6]), Integer.valueOf(tokens[7]));
                            for(int j = 0; j<store.length;j++){
                                if(store[j] != null){
                                    overWrite.print(store[j].getFirst()+";");
                                    overWrite.print(store[j].getMiddle()+";");
                                    overWrite.print(store[j].getLast()+";");
                                    overWrite.print(store[j].getStreet()+";");
                                    overWrite.print(store[j].getCity()+";");
                                    overWrite.print(store[j].getState()+";");
                                    overWrite.print(store[j].getZip()+";");
                                    overWrite.println(store[j].getId());
                                    store[j] = null;
                                    overWrite.flush();
                                    break;
                                }
                            }   
                        }
                        tmpFile = !tmpFile;
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }

                    lock.notifyAll();
                    System.out.println("Saved");
                    try {
                        lock.wait();
                        Thread.sleep(60000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    };

我知道它到达了 for 循环,在该循环中我将 store[] 中的所有元素写入一个文件,它确实将正确的数据打印到控制台。但是,只要它修改 NAIList.txt 或 NAIList.tmp,它只会使它们完全空白。我不知道为什么它不起作用,因为代码本质上是从在主线程上运行的不同方法复制而来的,它确实按我的意愿工作。

啊,忘了补充,作为我老师给我们的人为限制,在任何给定时间,我们只能在 RAM 中拥有十个 NameAddressID 对象。

编辑:固定代码,唯一改变的是overWrite.flush();被添加了两次

【问题讨论】:

  • 首先尝试将您的代码分成逻辑单元。您可以将参数传递给Runnable 的实现,您知道...而且,Java 具有锁定对象,这可能会有所帮助。简而言之:分而治之。事实上,你的代码几乎无法管理,但我相信我什至不需要告诉你。
  • 每次完成编辑时刷新流。
  • 啊,我错了,我现在试试

标签: java multithreading writetofile


【解决方案1】:

您不需要刷新 PrintWriter 吗?

查看 PrintWriter 构造函数的 javadoc:

创建一个新的 PrintWriter,不自动刷新行,使用 指定的文件。这个便利的构造函数创建了必要的 中间 OutputStreamWriter,它将使用编码字符 此 Java 虚拟机实例的默认字符集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    相关资源
    最近更新 更多