java - 如何在逐个字符读写时同步代码块以将整个字/行写入输出文件?

标签 java

我有几个输入文本文件,我将它们读取到一个输出文件。每个输入文件都在单独的线程中读取。我想将整个单词或行写入输出文件。为了写入输入文件的全部内容,我在 FileWriter 上同步,如下所示:

public void run() {
    synchronized (fw) {
        int character;
        try {
            while ((character= fr.read()) != -1) {
                fw.write(character);    
            }           
            fw.write("\n");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

其中 fw 是 FileWriter,fr FileReader。

如何同步写字或行?我需要一个字符一个字符地读写。

单词示例:file1: aaa bbb ccc;文件2:AAA BBB CCC;文件3:11222

输出文件:aaa AAA 11 bbb BBB 222 ccc CCC

最佳答案

修改即可得到你想要的

(character= fr.read()) != -1)

通过测试任何分隔符。当您从文件中读取空格时,就会跳出 while 循环。您还需要另一个 while 循环围绕同步块(synchronized block),以便您的 run 方法重复尝试获取锁,但也允许其他线程进入。

public void run() throws IOException {
    boolean reading = true;
    StringBuilder buffer = new StringBuilder();
    while(reading) {   
        int character = fr.read();
        if(character == -1) {   
            reading = false;
            character='\n';
        }   
        buffer.append((char)character);
        if (character == ' ' || character == '\t' || character == '\n') {
            synchronized(fw) {
                fw.write(buffer.toString()); 
            }
            buffer = new StringBuilder();
        }           
    }
}

但请注意,您正在同步读取和写入。由于读取是在同步块(synchronized block)中进行的,因此一次只有一个线程从文件中读取。更好的设计是每个线程缓冲读取的字符,然后写出整个单词。

关于java - 如何在逐个字符读写时同步代码块以将整个字/行写入输出文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34252768/

相关文章:

java - 如何通过 CXF、Spring 和 Jackson 使用多个 JSON 提供程序

java - spring-xd如何使用source :file read line one by one

java - 在 Java 中运行 Python 脚本

java - 反序列化包含一些不可反序列化对象的数组(抢救可反序列化部分)

java - 在 firebase 的节点内添加列表

java - CheckSum 8 异或错误结果

java - 如何访问打印机的状态?

java - 如何右键单击/从 JLabel 复制图像

java - 为什么我无法通过无线 ADB 安装此 Android 程序?

java - 如何在Android Studio中正确导入Android项目?