多线程文件操作

时间:2019-05-23 11:29:17

标签: java multithreading file io

我正在尝试使用multiThreading,我想编写一个代码,该代码必须对名为data.txt的特定文件进行某些操作。

必须有三位作家和三位读者,作家1必须从A到Z写入随机字符,作家2必须写入1到100的随机数,作家3必须从这组字符中写入随机字符字符{*%$#@!&}。

然后,读取者必须从文件data.txt中读取一个字符,然后读取者1将这个字符写入文件1.txt,读取器2将这个字符写入文件2.txt,读取器3将这个字符写入文件3.txt。

如果数据文件中没有字符可读取,则读取器必须等到写入器向数据文件中添加某些内容为止。

我写了两个类WriterInFile和ReaderFromFile来扩展Thread类,但是ReaderFromFile似乎无法正常工作(它不会从数据文件中读取任何字符,也不会向文件1.txt添加任何内容, 2.txt,3.txt)

这是ReaderFromFile类的代码:

import java.io.*;

public class ReaderFromFile extends Thread {
    private static FileReader reader;
    private int numberOfReader;


    ReaderFromFile(int numberOfReader, FileReader reader) {
        this.numberOfReader = numberOfReader;
        ReaderFromFile.reader = reader;
    }

    public void run() {
        for (int i = 0; i < 5; i++) {
            String s = null;
            try {
                s = readFrom();
        } catch (IOException e) {
            e.printStackTrace();
        }
        FileWriter writer;
        switch (numberOfReader) {
            case 1:
                try {
                    writer = new FileWriter("1.txt",true);
                    if (s != null) {
                        writer.write(s);
                    }
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            case 2:
                try {
                    writer = new FileWriter("2.txt",true);
                    if (s != null) {
                        writer.write(s);
                    }
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            case 3:
                try {
                    writer = new FileWriter("3.txt",true);
                    if (s != null) {
                        writer.write(s);
                    }
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
        }
    }
}

/**
 * @return the character that has been reed
 */
private synchronized String readFrom() throws IOException {
    String s = null;
    while (!reader.ready()) {
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    try {
        s = String.valueOf(reader.read());
    } catch (IOException e) {
        e.printStackTrace();
    }
    notifyAll();
    return s;
}


}

这是WriterInFile类:

import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;

public class WriterInFile extends Thread {
private static FileWriter writer;
private int numberOfReader;

WriterInFile(int numberOfReader, FileWriter writer) {
    this.numberOfReader = numberOfReader;
    WriterInFile.writer = writer;
}

public void run() {
    for (int i=0;i<5;i++){
        try {
            sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        switch (numberOfReader) {
            case 1:
                writeChar();
                break;
            case 2:
                writeNumber();
                break;
            case 3:
                writeShape();
                break;
        }
    }
}


private synchronized void writeChar() {
    String s = getRandomChar();
    try {
        writer.write(s);
        System.out.println(s);
    } catch (IOException e) {
        e.printStackTrace();
    }
    notifyAll();
}

private synchronized void writeNumber() {
    String s = getRandomNumber();
    try {
        writer.write(s);
        System.out.println(s);
    } catch (IOException e) {
        e.printStackTrace();
    }
    notifyAll();
}

private synchronized void writeShape() {
    String s = getRandomShape();
    try {
        writer.write(s);
        System.out.println(s);
    } catch (IOException e) {
        e.printStackTrace();
    }
    notifyAll();
}

private String getRandomChar() {
    double randomDouble = Math.random();
    randomDouble = randomDouble * 26;
    int randomInt = (int) randomDouble;
    return String.valueOf((char)(randomInt+'A'));
}

private String getRandomNumber() {
    double randomDouble = Math.random();
    randomDouble = randomDouble * 100 + 1;
    int randomInt = (int) randomDouble;
    return String.valueOf(randomInt);
}


private String getRandomShape() {
    String chars = "*%$#@!&";
    Random rnd = new Random();
    char randomChar = chars.charAt(rnd.nextInt(chars.length()));
    return String.valueOf(randomChar);
}
}

这是主文件:

public static void main(String[] args) {

        try {
            FileWriter writer = new FileWriter("data.txt");
            FileReader reader = new FileReader("data.txt");
            //creating writers
            WriterInFile writer1 = new WriterInFile(1, writer);
            WriterInFile writer2 = new WriterInFile(2, writer);
            WriterInFile writer3 = new WriterInFile(3, writer);
            // creating readers
            ReaderFromFile reader1 = new ReaderFromFile(1, reader);
            ReaderFromFile reader2 = new ReaderFromFile(2, reader);
            ReaderFromFile reader3 = new ReaderFromFile(3, reader);

            writer1.start();
            writer2.start();
            writer3.start();

            reader1.start();
            reader2.start();
            reader3.start();
            Thread.sleep(10000);
            writer.close();
            reader.close();
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }

}

0 个答案:

没有答案