2011-03-21 6 views
1

예를 들어, .txt 개의 파일이 단일 번호 c:\onelocation에 있어야합니다. txt 형식으로 다른 위치에 내용을 쓰려고합니다. 이 부분은 매우 쉽고 간단합니다. 그러나 여기에는 속도 차단기가 있습니다.파일에 대한 입출력 작업

120 초가 소요됩니다. 위의 위치에서 파일을 읽고 120 초까지 formate txt를 사용하여 다른 파일에 쓰고 타임 스탬프로 이름을 가진 파일을 저장하십시오.
120 초 후에 해당 타임 스탬프가있는 파일을 하나 더 만듭니다.하지만 이전 파일에 커서가있었습니다.

상당 할만한 코드가 제공되면 아이디어를 제안 할 수 있습니까?

감사합니다. 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; -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

읽기 및 쓰기 작업을 사용하지 않고 파일을 복제 할 수 있습니다.

샘플 코드 : 자바

+0

+1 ic 및 커서 저장시 제한 시간, 반복을 잊어 버렸습니다. 이 솔루션은 쉽게 입력 파일을 전송하는 동안 시간 제한을 지원하지 않더라도 수정할 수 있습니다. Ics는 한 번에 전송됩니다. 똑똑한 해결책을 얻으려면 +1 – extraneon

4

사용 RamdomAccessFile

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는 파일 내에서 커서를 이동합니다.

파일 수정/생성 (새 파일 인 경우) 시간을 확인하기 전에 2 분 미만이면 복사 만 시작하거나 건너 뛰십시오.

각 파일에 대해 no.of 바이트/행의 카운터를 읽게하십시오. 해당 위치로 커서를 이동하고 거기에서 읽으십시오.