2011-03-21 27 views
1

私は、例えば、.txt個のファイルが1つのローテーションc:\onelocationに存在するという要件があります。私はtxt形式で別の場所にコンテンツを書きたい。この部分はかなり簡単で簡単です。しかしここにはスピードブレーカがあります。ファイルの入出力操作

時間間隔は120秒です。上記の場所からファイルを読み込み、120秒までformate txtで別のファイルに書き出し、ファイル名をタイムスタンプとして保存します。
120秒後、そのタイムスタンプでもう1つのファイルを作成しますが、前のファイルに残っていたファイルを読み込む必要があります。

また、コードが提供されていれば、どんなアイディアを提案してもらえますか?

ありがとうDamu。

+0

タイミング要件はどのくらい厳しいですか?時には121のように書くことは許容されますか? – jmg

+0

それは時間間隔を逃してはならない – developer

+0

@jmgあなたからの手がかりを期待しています – developer

答えて

6

これはいかがですか? 120秒ごとに2つ書き込む場所を自動的に変更するライター。

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); 
     } 
    } 
} 
+0

+1は賢明な解決策です。または、それはあまりにも賢い半分のために-1でなければなりません;-)? – Raedwald

0

ファイルioはJavaで簡単ですが、ここではファイルを別のファイルにコピーした例があります。

import java.io.File; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 

public class Copy { 
    public static void main(String[] args) throws IOException { 
    File inputFile = new File("farrago.txt"); 
    File outputFile = new File("outagain.txt"); 

    FileReader in = new FileReader(inputFile); 
    FileWriter out = new FileWriter(outputFile); 
    int c; 

    while ((c = in.read()) != -1) 
     out.write(c); 

    in.close(); 
    out.close(); 
    } 
} 
+0

次回より慎重に読み進めてください...%) –

1

読み書き操作ではなく、ファイルを複製できます。

サンプルコード:

FileChannel ic = new FileInputStream("<source file location>")).getChannel(); 
FileChannel oc = new FileOutputStream("<destination location>").getChannel(); 
ic.transferTo(0, ic.size(), oc); 
ic.close(); 
oc.close(); 

HTH

+0

+1時間制限を忘れてしまいました。この解決策は簡単に変更できますが、入力ファイルの転送中にタイムアウトをサポートしません。 Icsは一度に転送されます。 – extraneon

4

は、ファイル内でカーソルを移動するためにJavaでRamdomAccessFileを使用してください。

ファイルの変更/作成(新しいファイルの場合)時間を確認する前に、2分未満の場合はコピーを開始するか、スキップしてください。

ファイルごとにno.ofバイト/行のカウンタを保持します。その位置にカーソルを移動し、そこからそれを読んでください。

関連する問題