Java 在逐字符读写时,如何同步一段代码以将整个字/行写入输出文件?

Java 在逐字符读写时,如何同步一段代码以将整个字/行写入输出文件?,java,Java,我有几个输入文本文件,我从中读取到一个输出文件。每个输入文件都在一个单独的线程中读取。我想将整个单词或行写入输出文件。要写入输入文件的全部内容,我在FileWriter上同步如下: public void run() { synchronized (fw) { int character; try { while ((character= fr.read()) != -1) { fw.write(ch

我有几个输入文本文件,我从中读取到一个输出文件。每个输入文件都在一个单独的线程中读取。我想将整个单词或行写入输出文件。要写入输入文件的全部内容,我在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

如何同步书写单词或行?我需要逐字读写

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


输出文件:aaa aaa 11 bbb bbb 222 ccc

您可以使用StringTokenizer从输入文件中读取,而不是使用文件读取器逐字节读取。它允许你一次读一个完整的单词。这样,每次写入输出文件时,您都在写入一个字

编辑:因为你需要一个字节一个字节地阅读,所以这里是我的建议

使用StringBuffer保存字符,直到到达空格。当你点击一个空格时,你写出StringBuffer的内容并清除它。见下面的代码:

public void run() {
    int character;
    StringBuffer buffer = new StringBuffer();
    try {
        while ((character= fr.read()) != -1) {
            if(character == ' '){
                synchronized (fw){
                    fw.write(buffer.toString());
                }
                buffer.setLength(0);//Clears the buffer
            }
            else{
                buffer.append(character);
            }
        }  
        synchronized (fw){
            fw.write("\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

您可以通过修改

(character= fr.read()) != -1)
通过测试您的任何分隔符。当您从文件中读取空白时,您将中断while循环。您还需要在synchronized块周围进行另一个while循环,以便您的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();
        }           
    }
}

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

您是否在输出文件中寻找特定的输出顺序?您只需保持锁,直到碰到单词边界或行尾字符,然后释放它,以便其他线程有机会写入,所以我不能使用同步块,而是使用锁?同步(someobject)是“获取锁”,那么当我点击boundry这个词时,如何释放这个对象?你能给我举个例子吗?这个答案仍然是错误的,因为这里没有并发性-你只要抓住锁,在整个文件读写的时候抓住它。你仍然一次写一个字的缓冲区。要解决这个问题,你不能有StringBuffer,也不能有sb。如果他有3个输入文件,那么他有3个线程,每个线程都有上面代码的副本。因此,有3个StringBuffers在起作用。它们都有相同的FileWriter,这就是为什么它必须同步,但它们都有自己的FileReader,因为它们都指向不同的文件。它只从第一个文件写入,但我已经有了解决方案,所以无论如何,谢谢;)