java - 对文件的 I/O 操作

标签 java io

我有一个需求,比如在一个loation c:\onelocation中有多个.txt文件。我想把内容以txt格式写到另一个位置。这部分非常简单直接。但是这里有 reducer 。

时间间隔为 120 秒。从上面的位置读取文件,并用 formate txt 将其写入另一个文件,直到 120 秒,然后将文件保存为时间戳。
120 秒后,再创建一个具有该时间戳的文件,但我们必须读取光标留在上一个文件中的文件。

请您提出任何想法,如果提供的代码也很可观。

谢谢大木。

最佳答案

这个怎么样?每 120 秒自动更改其写入位置的写入器。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeBoxedWriter extends Writer {
    private static DateFormat FORMAT = new SimpleDateFormat("yyyyDDDHHmm");

    /** Milliseconds to each time box */
    private static final int TIME_BOX = 120000;


    /** For testing only */
    public static void main(String[] args) throws IOException {
        Writer w = new TimeBoxedWriter(new File("."), "test");

        // write one line per second for 500 seconds.
        for(int i = 0;i < 500;i++) {
            w.write("testing " + i + "\n");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ie) {}
        }
        w.close();
    }

    /** Output folder */
    private File dir_;

    /** Timestamp for current file */
    private long stamp_ = 0;

    /** Stem for output files */
    private String stem_;

    /** Current output writer */
    private Writer writer_ = null;


    /**
     * Create new output writer
     * 
     * @param dir
     *            the output folder
     * @param stem
     *            the stem used to generate file names
     */
    public TimeBoxedWriter(File dir, String stem) {
        dir_ = dir;
        stem_ = stem;
    }


    @Override
    public void close() throws IOException {
        synchronized (lock) {
            if (writer_ != null) {
                writer_.close();
                writer_ = null;
            }
        }
    }


    @Override
    public void flush() throws IOException {
        synchronized (lock) {
            if (writer_ != null) writer_.flush();
        }
    }


    private void rollover() throws IOException {
        synchronized (lock) {
            long now = System.currentTimeMillis();
            if ((stamp_ + TIME_BOX) < now) {
                if (writer_ != null) {
                    writer_.flush();
                    writer_.close();
                }
                stamp_ = TIME_BOX * (System.currentTimeMillis() / TIME_BOX);
                String time = FORMAT.format(new Date(stamp_));
                writer_ = new FileWriter(new File(dir_, stem_ + "." + time
                        + ".txt"));
            }
        }
    }


    @Override
    public void write(char[] cbuf, int off, int len) throws IOException {
        synchronized (lock) {
            rollover();
            writer_.write(cbuf, off, len);
        }
    }
}

关于java - 对文件的 I/O 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5374510/

相关文章:

java - 从方法返回没有名称的数组

JavaFX 将结果集显示到现有表格 View 中

java - Java 中 "^= "运算符的用途是什么?

java - Postgresql 的 Liquibase addAutoIncrement 错误

java - 使用 toString 逐行打印到文本文件

java - byte[] 到 Java 中的文件

arrays - 在保护条件下使用 unsafePerformIO

linux - 有什么方法可以知道 iostat 的序列或随机 IO 的百分比?

c++ - 使用 Qt C++ 在 Linux 中获取通过 USB 连接的 ESC/POS 打印机的状态

java - 如何在不访问上下文的情况下从线程更新我的 Android SQLite 数据库?