2013-06-18 5 views
23

이 같은 java.nio.file.Files로 파일을 복사하기 위해 노력하고있어 기존의 대체 :자바 복사 파일 및 대상

Files.copy(cfgFilePath, strTarget, StandardCopyOption.REPLACE_EXISTING); 

문제는 이클립스가 "방법 복사 (경로 말하는 것입니다, Path, CopyOption ...) 형식의 파일 (File, String, StandardCopyOption)에 적용 할 수 없습니다. "

Win7 x64에서 Eclipse 및 Java 7을 사용하고 있습니다. 내 프로젝트는 Java 1.6 호환성을 사용하도록 설정됩니다.

가이에 대한 해결책인가, 아니면 내가 해결 방법으로 이런 일을 만들 필요가 수행

File temp = new File(target); 

if(temp.exists()) 
    temp.delete(); 

감사합니다. 당신의 strTarget을지지

Path from = cfgFilePath.toPath(); //convert from File to Path 
Path to = Paths.get(strTarget); //convert from String to Path 
Files.copy(from, to, StandardCopyOption.REPLACE_EXISTING); 

유효한 경로 : 오류 메시지에 설명 된대로

답변

8

입니다. 원하는 것은 Path입니다.

그리고

이 파일 시스템 경로와 일치하는 Path 객체를 얻기 위해 당신이 할 :

Paths.get("path/to/file"); // argument may also be absolute 

이 정말 빨리 익숙해. File이 필요한 API를 계속 사용하는 경우 Path의 메소드는 .toFile()입니다. 당신은 당신이 File 객체를 반환하는 API를 사용하는 불행한 경우에 경우

주, 당신은 항상 할 수있는 :

theFileObject.toPath() 

그러나 당신의 코드에서, Path를 사용합니다. 체계적으로. 다시 생각하지 않고.

EDIT NIO를 사용하여 1.6을 사용하여 다른 사람에게 파일을 복사하는 것은 그렇게 할 수 있습니다. Closer 클래스가 Guava에 의해 inspited되어 있습니다 :

public final class Closer 
    implements Closeable 
{ 
    private final List<Closeable> closeables = new ArrayList<Closeable>(); 

    // @Nullable is a JSR 305 annotation 
    public <T extends Closeable> T add(@Nullable final T closeable) 
    { 
     closeables.add(closeable); 
     return closeable; 
    } 

    public void closeQuietly() 
    { 
     try { 
      close(); 
     } catch (IOException ignored) { 
     } 
    } 

    @Override 
    public void close() 
     throws IOException 
    { 
     IOException toThrow = null; 
     final List<Closeable> l = new ArrayList<Closeable>(closeables); 
     Collections.reverse(l); 

     for (final Closeable closeable: l) { 
      if (closeable == null) 
       continue; 
      try { 
       closeable.close(); 
      } catch (IOException e) { 
       if (toThrow == null) 
        toThrow = e; 
      } 
     } 

     if (toThrow != null) 
      throw toThrow; 
    } 
} 

// Copy one file to another using NIO 
public static void doCopy(final File source, final File destination) 
    throws IOException 
{ 
    final Closer closer = new Closer(); 
    final RandomAccessFile src, dst; 
    final FileChannel in, out; 

    try { 
     src = closer.add(new RandomAccessFile(source.getCanonicalFile(), "r"); 
     dst = closer.add(new RandomAccessFile(destination.getCanonicalFile(), "rw"); 
     in = closer.add(src.getChannel()); 
     out = closer.add(dst.getChannel()); 
     in.transferTo(0L, in.size(), out); 
     out.force(false); 
    } finally { 
     closer.close(); 
    } 
} 
+0

+1 완전히 동의했습니다. 더 이상 파일을 거의 사용하지 않습니다. – assylias

+0

언급 한 바와 같이 Java 1.6의 준수 수준으로 컴파일 할 때이 코드가 작동하는지 궁금하지만, 어쨌든 메모를 주셔서 감사합니다. –

+0

@commander_keen 1.6 JVM을 실행하기 위해 배포 할 코드를 의미합니까? – fge

55

당신은 Path 인수를 전달해야합니다. 당신이 자바 7 사용하는 경우

완전히 File 드롭 :

+0

의 Arg을, I, 그것은 완전히 처음 두 매개 변수 유형을 무시 copyOption에 문제가 ... 생각 감사 않았는지. 더위에 너무 오래 코딩 한 것처럼 보입니다. ;-) –

+0

Uff, Java 1.6으로 PC에 내 보낸 항아리를 복사 한 후 (Java 7로 개발하고 1.6으로 컴파일 할 필요가 있다고 언급 한 이유가 무엇입니까?) "스레드에서 예외"메인 "java.lang.NoSuchMethodError : java.io.File.toPath() Lja va/nio/file/Path;" 문서에 따르면 맞습니다.이 방법은 Java 7 부터만 사용할 수 있습니다. (Java 7에서 사용하려고했던 다른 것들처럼 개발/디자인 타임 중에 이것을 비판하지 않은 이유가 궁금합니다. 지금은 모든 것을 검사해야합니다. 손으로 ...) –

+0

@commander_keen'Files.copy'도 Java 6에 없습니다. – assylias

1

strTarget는 "문자열"개체가 아닌 "경로"개체 @assylias '대답 보완