How to copy file from one location to another location?

JavaIo

Java Problem Overview


I want to copy a file from one location to another location in Java. What is the best way to do this?


Here is what I have so far:

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
public class TestArrayList {
	public static void main(String[] args) {
		File f = new File(
            "D:\\CBSE_Demo\\Demo_original\\fscommand\\contentplayer\\config");
		List<String>temp=new ArrayList<String>();
		temp.add(0, "N33");
		temp.add(1, "N1417");
		temp.add(2, "N331");
		File[] matchingFiles = null;
		for(final String temp1: temp){
			matchingFiles = f.listFiles(new FilenameFilter() {
			    public boolean accept(File dir, String name) {
			        return name.startsWith(temp1);
			    }
			});
			System.out.println("size>>--"+matchingFiles.length);

		}
    }
}

This does not copy the file, what is the best way to do this?

Java Solutions


Solution 1 - Java

You can use this (or any variant):

Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING);

Also, I'd recommend using File.separator or / instead of \\ to make it compliant across multiple OS, question/answer on this available here.

Since you're not sure how to temporarily store files, take a look at ArrayList:

List<File> files = new ArrayList();
files.add(foundFile);

To move a List of files into a single directory:

List<File> files = ...;
String path = "C:/destination/";
for(File file : files) {
    Files.copy(file.toPath(),
        (new File(path + file.getName())).toPath(),
        StandardCopyOption.REPLACE_EXISTING);
}

Solution 2 - Java

Update:

see also https://stackoverflow.com/a/67179064/1847899

Using Stream

private static void copyFileUsingStream(File source, File dest) throws IOException {
    InputStream is = null;
    OutputStream os = null;
    try {
        is = new FileInputStream(source);
        os = new FileOutputStream(dest);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = is.read(buffer)) > 0) {
            os.write(buffer, 0, length);
        }
    } finally {
        is.close();
        os.close();
    }
}

Using Channel

private static void copyFileUsingChannel(File source, File dest) throws IOException {
    FileChannel sourceChannel = null;
    FileChannel destChannel = null;
    try {
        sourceChannel = new FileInputStream(source).getChannel();
        destChannel = new FileOutputStream(dest).getChannel();
        destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
       }finally{
           sourceChannel.close();
           destChannel.close();
       }
}

Using Apache Commons IO lib:

private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
    FileUtils.copyFile(source, dest);
}

Using Java SE 7 Files class:

private static void copyFileUsingJava7Files(File source, File dest) throws IOException {
    Files.copy(source.toPath(), dest.toPath());
}

Or try Googles Guava :

https://github.com/google/guava

docs: https://guava.dev/releases/snapshot-jre/api/docs/com/google/common/io/Files.html

Solution 3 - Java

Use the New Java File classes in Java >=7.

Create the below method and import the necessary libs.

public static void copyFile( File from, File to ) throws IOException {
    Files.copy( from.toPath(), to.toPath() );
} 

Use the created method as below within main:

File dirFrom = new File(fileFrom);
File dirTo = new File(fileTo);
        
try {
        copyFile(dirFrom, dirTo);
} catch (IOException ex) {
        Logger.getLogger(TestJava8.class.getName()).log(Level.SEVERE, null, ex);
}

NB:- fileFrom is the file that you want to copy to a new file fileTo in a different folder.

Credits - @Scott: https://stackoverflow.com/questions/106770/standard-concise-way-to-copy-a-file-in-java/16600787#16600787

Solution 4 - Java

  public static void copyFile(File oldLocation, File newLocation) throws IOException {
        if ( oldLocation.exists( )) {
            BufferedInputStream  reader = new BufferedInputStream( new FileInputStream(oldLocation) );
            BufferedOutputStream  writer = new BufferedOutputStream( new FileOutputStream(newLocation, false));
            try {
                byte[]  buff = new byte[8192];
                int numChars;
                while ( (numChars = reader.read(  buff, 0, buff.length ) ) != -1) {
                    writer.write( buff, 0, numChars );
                }
            } catch( IOException ex ) {
                throw new IOException("IOException when transferring " + oldLocation.getPath() + " to " + newLocation.getPath());
            } finally {
                try {
                    if ( reader != null ){                      
                        writer.close();
                        reader.close();
                    }
                } catch( IOException ex ){
                    Log.e(TAG, "Error closing files when transferring " + oldLocation.getPath() + " to " + newLocation.getPath() ); 
                }
            }
        } else {
            throw new IOException("Old location does not exist when transferring " + oldLocation.getPath() + " to " + newLocation.getPath() );
        }
    }  

Solution 5 - Java

Copy a file from one location to another location means,need to copy the whole content to another location.Files.copy(Path source, Path target, CopyOption... options) throws IOException this method expects source location which is original file location and target location which is a new folder location with destination same type file(as original). Either Target location needs to exist in our system otherwise we need to create a folder location and then in that folder location we need to create a file with the same name as original filename.Then using copy function we can easily copy a file from one location to other.

 public static void main(String[] args) throws IOException {
        		String destFolderPath = "D:/TestFile/abc";
        		String fileName = "pqr.xlsx";
        		String sourceFilePath= "D:/TestFile/xyz.xlsx";
        		File f = new File(destFolderPath);
        		if(f.mkdir()){
        			System.out.println("Directory created!!!!");
        		}
        		else {
        			System.out.println("Directory Exists!!!!");
        		}
        		f= new File(destFolderPath,fileName);
        		if(f.createNewFile())	{
        			
        			System.out.println("File Created!!!!");
        		}	else {
        			System.out.println("File exists!!!!");
        		}
        				
        		Files.copy(Paths.get(sourceFilePath), Paths.get(destFolderPath, fileName),REPLACE_EXISTING);
        		System.out.println("Copy done!!!!!!!!!!!!!!");
        				
        
        	}

Solution 6 - Java

You can do it with the Java 8 Streaming API, PrintWriter and the Files API

try (PrintWriter pw = new PrintWriter(new File("destination-path"), StandardCharsets.UTF_8)) {
    Files.readAllLines(Path.of("src/test/resources/source-file.something"), StandardCharsets.UTF_8)
         .forEach(pw::println);
}

If you want to modify the content on-the-fly while copying, check out this link for the extended example https://overflowed.dev/blog/copy-file-and-modify-with-java-streams/

Solution 7 - Java

Files.exists()

Files.createDirectory()

Files.copy()

Overwriting Existing Files: Files.move()

Files.delete()

Files.walkFileTree() enter link description here

Solution 8 - Java

I modified one of the answers to make it a bit more efficient.

public void copy(){
    InputStream in = null;
    try {
        in = new FileInputStream(Files);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    try {
        OutputStream out = new FileOutputStream();
        try {
            // Transfer bytes from in to out
            byte[] buf = new byte[1024];
            while (true) {
                int len = 0;
                try {
                    if (!((len = in.read(buf)) > 0)) break;
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    out.write(buf, 0, len);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    } finally {
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private void moveFile() {
    copy();
    File dir = getFilesDir();
    File file = new File(dir, "my_filename");
    boolean deleted = file.delete();
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionvijaykView Question on Stackoverflow
Solution 1 - JavaMennoView Answer on Stackoverflow
Solution 2 - JavaAlexander Sidikov PfeifView Answer on Stackoverflow
Solution 3 - JavaAmimo BenjaView Answer on Stackoverflow
Solution 4 - JavaQuamber AliView Answer on Stackoverflow
Solution 5 - JavaS.SarkarView Answer on Stackoverflow
Solution 6 - JavaMarian KlühspiesView Answer on Stackoverflow
Solution 7 - JavaShinwar ismailView Answer on Stackoverflow
Solution 8 - JavaThe_Programming_Taco_NoobView Answer on Stackoverflow