2009-07-21 4 views
127

Можно ли переименовать файл, скажем test.txt, на номер test1.txt?Переименовать файл с помощью Java

Если test1.txt существует, будет ли он переименован?

Как переименовать его в уже существующий файл test1.txt, чтобы новое содержимое test.txt было добавлено к нему для последующего использования?

+4

В последнем абзаце не описывается операция переименования вообще. В нем описывается операция добавления. – EJP

ответ

2

Насколько я знаю, переименование файла не будет добавлять его содержимое к содержимому существующего файла с целевым именем.

О переименовании файла на Java см. В документе documentation для метода renameTo() в классе File.

26

Вы хотите использовать метод renameTo на объекте File.

Сначала создайте объект File для представления адресата. Проверьте, существует ли файл. Если он не существует, создайте новый объект File для перемещаемого файла. вызовите метод renameTo в файле, который нужно перенести, и проверьте возвращаемое значение из renameTo, чтобы узнать, был ли вызов успешным.

Если вы хотите добавить содержимое одного файла в другой, доступно несколько доступных авторов. Основываясь на расширении, это звучит как обычный текст, поэтому я бы посмотрел на FileWriter.

+2

И что в этом плохого? –

+2

Это получает downvoted? Зачем? – Mnementh

+6

Не знаю, но это то же самое, что написал Пьер, без исходного кода ... –

141

http://exampledepot.8waytrips.com/egs/java.io/RenameFile.html Скопировано из

// File (or directory) with old name 
File file = new File("oldname"); 

// File (or directory) with new name 
File file2 = new File("newname"); 

if (file2.exists()) 
    throw new java.io.IOException("file exists"); 

// Rename file (or directory) 
boolean success = file.renameTo(file2); 

if (!success) { 
    // File was not successfully renamed 
} 

Чтобы добавить в новый файл:

java.io.FileWriter out= new java.io.FileWriter(file2, true /*append=yes*/); 
+15

Этот код не будет работать во всех случаях или на платформах. Переименование метода не является надежным: http://stackoverflow.com/questions/1000183/reliable-file-renameto-alternative-on-windows –

+0

Просто попробуйте. Не работает. –

3

Если это просто переименовать файл, вы можете использовать File.renameTo().

В случае, когда вы хотите добавить содержимое второго файла к первому, просмотрите FileOutputStream with the append constructor option или The same thing for FileWriter. Вам нужно будет прочитать содержимое файла, чтобы добавить и записать его, используя выходной поток/запись.

15

Переименование файла путем перемещения его к новому имени. (FileUtils от Apache Commons IO Lib)

String newFilePath = oldFile.getAbsolutePath().replace(oldFile.getName(), "") + newName; 
    File newFile = new File(newFilePath); 

    try { 
    FileUtils.moveFile(oldFile, newFile); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } 
22

Для Java 1.6 и ниже, я считаю, что самый безопасный и чистый API для этого гуавы-х Files.move.

Пример:

File newFile = new File(oldFile.getParent(), "new-file-name.txt"); 
Files.move(oldFile.toPath(), newFile.toPath()); 

Первая линия гарантирует, что расположение нового файла в том же каталоге, т.е. родительский каталог старого файла.

EDIT: Я написал это до того, как начал использовать Java 7, который ввел очень похожий подход. Поэтому, если вы используете Java 7+, вы должны увидеть и откликнуться на ответ kr37.

64

Короче:

Files.move(source, source.resolveSibling("newname")); 

Подробнее:

import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

копируется непосредственно из http://docs.oracle.com/javase/7/docs/api/index.html следующие:

Предположим, что мы хотим переименовать файл "NEWNAME", сохраняя файл в том же каталоге:

Path source = Paths.get("path/here"); 
Files.move(source, source.resolveSibling("newname")); 

Кроме того, предположим, что мы хотим, чтобы переместить файл в новую директорию, сохраняя то же имя файла, и заменить существующий файл с таким именем в каталоге:

Path source = Paths.get("from/path"); 
Path newdir = Paths.get("to/path"); 
Files.move(source, newdir.resolve(source.getFileName()), REPLACE_EXISTING); 
+1

Путь - это интерфейс, единственными реализациями которого являются WindowsPath, ZipPath и AbstractPath. Будет ли это проблемой для многоплатформенных реализаций? – Caelum

+1

Привет @ user2104648, здесь (http://tutorials.jenkov.com/java-nio/path.html) - пример того, как вы могли обрабатывать файлы в среде Linux. В принципе, вам нужно использовать java.nio.file.Paths.get (somePath) вместо использования одной из упомянутых вами реализаций – maxivis

+1

Что такое Path source = ...? –

8

Это простой способ переименования файла :

 File oldfile =new File("test.txt"); 
     File newfile =new File("test1.txt"); 

     if(oldfile.renameTo(newfile)){ 
      System.out.println("File renamed"); 
     }else{ 
      System.out.println("Sorry! the file can't be renamed"); 
     } 
3
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import static java.nio.file.StandardCopyOption.*; 

Path yourFile = Paths.get("path_to_your_file\text.txt"); 

Files.move(yourFile, yourFile.resolveSibling("text1.txt")); 

Чтобы заменить существующий файл с именем "text1.txt":

Files.move(yourFile, yourFile.resolveSibling("text1.txt"),REPLACE_EXISTING); 
0
Files.move(file.toPath(), fileNew.toPath()); 

работает, но только тогда, когда вы закрываете (или AutoClose) все используемые ресурсы (InputStream, FileOutputStream и т.д.) Я думаю, что такая же ситуация с file.renameTo или FileUtils.moveFile.

-2

Код запуска находится здесь.

private static void renameFile(File fileName) { 

    FileOutputStream fileOutputStream =null; 

    BufferedReader br = null; 
    FileReader fr = null; 

    String newFileName = "yourNewFileName" 

    try { 
     fileOutputStream = new FileOutputStream(newFileName); 

     fr = new FileReader(fileName); 
     br = new BufferedReader(fr); 

     String sCurrentLine; 

     while ((sCurrentLine = br.readLine()) != null) { 
      fileOutputStream.write(("\n"+sCurrentLine).getBytes()); 
     } 

     fileOutputStream.flush(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      fileOutputStream.close(); 
      if (br != null) 
       br.close(); 

      if (fr != null) 
       fr.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 
+2

Обычно лучше объяснять решение, а не просто публиковать несколько строк анонимного кода. Вы можете прочитать [Как написать хороший ответ] (https://stackoverflow.com/help/how-to-answer), а также [Объяснение полностью основанных на кодах ответов] (https://meta.stackexchange.com/questions/114762/explaining-whole-% E2% 80% 8C% E2% 80% 8Bcode-based-answers) –

+0

Копирование и переименование - это обычно разные операции, поэтому я считаю, что должно быть четко отмечено, что это копия.Который также оказывается ненужным медленным, поскольку он копирует символы, а не байты. –

Смежные вопросы