안드로이드로 파일 복사하는 방법?
내 앱에서 특정 파일의 복사본을 다른 이름으로 저장하려고 합니다(사용자로부터 받은 이름).
파일 내용을 열어 다른 파일에 쓸 필요가 있습니까?
어떻게 하면 좋을까요?
파일을 복사하여 대상 경로에 저장하려면 다음 방법을 사용합니다.
public static void copy(File src, File dst) throws IOException {
InputStream in = new FileInputStream(src);
try {
OutputStream out = new FileOutputStream(dst);
try {
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
} finally {
out.close();
}
} finally {
in.close();
}
}
API 19+에서는 Java Automatic Resource Management를 사용할 수 있습니다.
public static void copy(File src, File dst) throws IOException {
try (InputStream in = new FileInputStream(src)) {
try (OutputStream out = new FileOutputStream(dst)) {
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
}
}
}
파일 채널을 사용하여 파일을 복사할 수도 있습니다.대용량 파일을 복사할 때 바이트 복사 방식보다 빠를 수 있습니다.하지만 파일이 2GB 이상이면 사용할 수 없습니다.
public void copy(File src, File dst) throws IOException {
FileInputStream inStream = new FileInputStream(src);
FileOutputStream outStream = new FileOutputStream(dst);
FileChannel inChannel = inStream.getChannel();
FileChannel outChannel = outStream.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
inStream.close();
outStream.close();
}
Kotlin 확장 기능
fun File.copyTo(file: File) {
inputStream().use { input ->
file.outputStream().use { output ->
input.copyTo(output)
}
}
}
Android O(API 26)에서는 다음과 같이 간단합니다.
@RequiresApi(api = Build.VERSION_CODES.O)
public static void copy(File origin, File dest) throws IOException {
Files.copy(origin.toPath(), dest.toPath());
}
이것들은 나에게 효과가 있었다.
public static void copyFileOrDirectory(String srcDir, String dstDir) {
try {
File src = new File(srcDir);
File dst = new File(dstDir, src.getName());
if (src.isDirectory()) {
String files[] = src.list();
int filesLength = files.length;
for (int i = 0; i < filesLength; i++) {
String src1 = (new File(src, files[i]).getPath());
String dst1 = dst.getPath();
copyFileOrDirectory(src1, dst1);
}
} else {
copyFile(src, dst);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void copyFile(File sourceFile, File destFile) throws IOException {
if (!destFile.getParentFile().exists())
destFile.getParentFile().mkdirs();
if (!destFile.exists()) {
destFile.createNewFile();
}
FileChannel source = null;
FileChannel destination = null;
try {
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destFile).getChannel();
destination.transferFrom(source, 0, source.size());
} finally {
if (source != null) {
source.close();
}
if (destination != null) {
destination.close();
}
}
}
Kotlin을 사용하면 더욱 심플해집니다.
File("originalFileDir", "originalFile.name")
.copyTo(File("newFileDir", "newFile.name"), true)
true
또는false
대상 파일을 덮어쓰기 위한 것입니다.
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-file/copy-to.html
답변하기엔 너무 늦었지만 가장 편리한 방법은
FileUtils
의
static void copyFile(File srcFile, File destFile)
예: 이것이 내가 한 일이다.
`
private String copy(String original, int copyNumber){
String copy_path = path + "_copy" + copyNumber;
try {
FileUtils.copyFile(new File(path), new File(copy_path));
return copy_path;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
`
kotlin에서는 그냥:
val fileSrc : File = File("srcPath")
val fileDest : File = File("destPath")
fileSrc.copyTo(fileDest)
복사 중 오류가 발생했을 때 입력/출력 스트림을 실제로 닫는 솔루션이 있습니다.이 솔루션은 Apache Commons IO IOTils 메서드를 사용하여 스트림의 복사와 닫힘 처리를 모두 수행합니다.
public void copyFile(File src, File dst) {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(src);
out = new FileOutputStream(dst);
IOUtils.copy(in, out);
} catch (IOException ioe) {
Log.e(LOGTAG, "IOException occurred.", ioe);
} finally {
IOUtils.closeQuietly(out);
IOUtils.closeQuietly(in);
}
}
코틀린에서: 짧은 길
// fromPath : Path the file you want to copy
// toPath : The path where you want to save the file
// fileName : name of the file that you want to copy
// newFileName: New name for the copied file (you can put the fileName too instead of put a new name)
val toPathF = File(toPath)
if (!toPathF.exists()) {
path.mkdir()
}
File(fromPath, fileName).copyTo(File(toPath, fileName), replace)
이것은 이미지나 비디오와 같은 모든 파일에 사용할 수 있습니다.
이제 코틀린에서 당신은 그저
file1.copyTo(file2)
여기서 file1은 원래 파일의 객체, file2는 복사처의 새로운 파일의 객체입니다.
언급URL : https://stackoverflow.com/questions/9292954/how-to-make-a-copy-of-a-file-in-android
'source' 카테고리의 다른 글
필터 메서드 내부의 vue 인스턴스/데이터 액세스 (0) | 2022.09.05 |
---|---|
Java 제네릭 - 클래스 가져오기? (0) | 2022.09.05 |
MySQL 오류: 키 길이가 없는 키 지정 (0) | 2022.09.05 |
MariaDB는 여러 서브쿼리가 있는 여러 행에 "삽입" (0) | 2022.09.05 |
#1273 - 불분명한 대조: 'utf8mb4_unicode_ci' cPanel (0) | 2022.09.05 |