Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试同时读取时,Java滚动文件创建失败_Java_Nio_Filechannel - Fatal编程技术网

尝试同时读取时,Java滚动文件创建失败

尝试同时读取时,Java滚动文件创建失败,java,nio,filechannel,Java,Nio,Filechannel,我正在使用java.util日志类创建一个滚动文件追加器。我想创建一个日志读取器,当数据写入这些日志时读取这些日志 滚动日志appender代码本身运行良好。但一旦启动读卡器线程,就不会创建新文件,即如果滚动日志附加器设置为使用5个文件,它将创建1og.0、log.1、log.2等,但如果读卡器线程启动,它将只创建log.0,不会创建其他文件。我在java日志和log4j中都注意到了这一点 我正在使用nio来读取日志读取器。所以我的疑问是,在同一个文件上创建另一个FileChannel是否会产生

我正在使用java.util日志类创建一个滚动文件追加器。我想创建一个日志读取器,当数据写入这些日志时读取这些日志

滚动日志appender代码本身运行良好。但一旦启动读卡器线程,就不会创建新文件,即如果滚动日志附加器设置为使用5个文件,它将创建1og.0、log.1、log.2等,但如果读卡器线程启动,它将只创建log.0,不会创建其他文件。我在java日志和log4j中都注意到了这一点

我正在使用nio来读取日志读取器。所以我的疑问是,在同一个文件上创建另一个FileChannel是否会产生一些问题?或者我错过了一些导致问题的nio基础知识

这是密码

public class Test {

     private static final long initialTime = System.currentTimeMillis();
     private static Logger logger = Logger.getLogger(Test.class.getName());
     public static void main(String[] args) {

        logger.setLevel(Level.INFO);
        try {
            BufferedReader reader = new BufferedReader(
                                            new InputStreamReader(
                                                    new FileInputStream(
                                                            new File(System.getProperty("user.dir")+File.separator+"input.dat"))));

             FileHandler handler = new FileHandler("log/test.log", 1024, 5, true);
             handler.setFormatter(new SimpleFormatter());
             logger.addHandler(handler);
             logger.setUseParentHandlers(false);
             //If I comment the next two lines the rolling appender works as expected both in java logging
             //and when using log4j. however once I start the log reader only one file is created.
             Thread logReader = new Thread(new LogReader("log/test.log.0"));
             logReader.start();
            while(reader.ready())
            {
                String strToLog = reader.readLine();
                logger.info(strToLog);
                //Only want to run this for 10 secs.
                if(System.currentTimeMillis() - initialTime > 10000)
                    System.exit(0);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally{

        }
    }

}
class LogReader implements Runnable {


    private final int BUFFER_SIZE = 1024;

    private RandomAccessFile file;

    private FileChannel chan;

    private long offset;

    private ByteBuffer buf;

    private Charset charset = Charset.forName("UTF-8");

    private String filename = "output.log";

    public LogReader(String logfile) throws IOException {
        System.out.println("Starting log reader from " + logfile);
        file = new RandomAccessFile(logfile, "r");
        offset = file.length();
        chan = file.getChannel();
        chan.position(offset);
        buf = ByteBuffer.allocateDirect(BUFFER_SIZE);
        System.out.println("Started log reader from " + logfile);
    }

    public void run() {
        //Even if I have nothing here..the problem exists..
        }
}

我认为RandomAccessFile可能存在一些并发性问题


我建议您使用不同的类来阅读该文件。例如java.io.FileReader

是的,问题在于RandonAccess文件