2016-12-01 18 views
0

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

1) 1-я проблема: либо я не делаю это правильно, но как я могу скопировать концы строк правильным образом? Я своего рода ощущение, что копируя я потеряю их, не уверен, но так как я был более сосредоточен на моей другой проблеме

2) Файл я пытаюсь переименовать просто не переименовываются, поэтому в результате проблема, что все файлы, в которые я хочу вставить новый пакет, получают одинаковое имя, поэтому я остаюсь с последним файлом с неправильным именем. Что приводит к потере всех других моих файлов

private static String insertPackage(File file) throws IOException { 
    //creating package name 
    File parent = new File(file.getParent()); 
    String packageName = "package " + parent.getName() + ";\n"; 

    //copy old file 
    File buffer = new File(parent.getPath()+"\\buffer.java"); 

    Charset charset = Charset.forName("UTF-8"); 
    BufferedReader br = Files.newBufferedReader(file.toPath(),charset); 
    BufferedWriter bw = Files.newBufferedWriter(buffer.toPath(),charset); 

    bw.write(packageName,0,packageName.length()); 

    String line; 
    while((line = br.readLine()) != null){ 
     if(!line.startsWith("package ")) { 
      bw.write(line, 0, line.length()); 
     } 
    } 

    //rename new file 
    // String filepath = file.getPath(); 

    // File rename = new File(filepath); 
    boolean renamed = true; 
    if(file.delete()) { 
     renamed = buffer.renameTo(file); 
    } 

    bw.flush(); 
    bw.close(); 
    br.close(); 

    if(!renamed){ 
     return file.getPath(); 
    } 
    return ""; 
} 

возвращаемое значение только там, чтобы иметь имя, в случае, если что-то не удается. Так что сейчас все.

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

+0

Вы знаете, что IDE могут выполнять такой рефакторинг без необходимости писать сценарий? :) – zapl

ответ

0

Вы теряете разрывы строк, потому что readLine разделяет их, но вы никогда не записываете никаких файлов. Вам нужно будет добавить \n (или \r\n в зависимости от ваших потребностей) в каждую строку, которую вы пишете в новый файл. Вы можете использовать BufferedWriter#newLine для написания зависимого от платформы разделителя строк.

Новый файл не переименовывается, поскольку ваши потоки файлов по-прежнему открыты для обоих файлов при попытке переименовать его. Кроме того, File#renameTo сильно зависит от платформы (как указано в документации) и, возможно, не сможет перезаписать существующие файлы, я рекомендую вам перейти на Files#move, где вы можете указать StandardCopyOption.REPLACE_EXISTING.

Я также могу рекомендовать, чтобы полностью переключиться на API NIO, а не использовать java.io.File вообще, вместо этого использовать Path непосредственно

Следует также отметить, что это хороший выбор, чтобы использовать примерочных с-ресурсов вместо того, чтобы вручную закрыть потоков, особенно при работе с несколькими потоками сразу.

+1

Простым способом написания разрывов в линиях платформы является [BufferedWriter.newLine()] (http://docs.oracle.com/javase/8/docs/api/java/io/BufferedWriter.html#newLine--). – VGR

+0

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