Изменение поиска HashSet для набора строк, содержащихся в файле


Эта функция изменяет для поиска HashSet в корне класс под названием 'команды' получить набор строк, содержащихся в файле, в "plugins/UC/Commands.txt" (это то, что было поручено народом с помощью плагина). Если файл не существует, он копирует файл по умолчанию в zip-файл "Commands.txt".

Это странная просьба, и, может быть, слишком много, чтобы спросить, но я понял, что мой код намного более сложный. Если вы будете так любезны, чтобы показать мне, как лучше переписать это, я был бы очень признателен. Когда я первоначально написал это, я просто позволяю затмение напишу его сам (с помощью try/catch блоки, как сказали мне), и я мало что сделала, так это в беспорядке.

public void setComs () {
    Set<String> temp = new HashSet<String>();
    File file = null;
    InputStream dflt = null;
    InputStreamReader dfltReader = null;
    FileReader fileReader = null;
    FileOutputStream newFile = null;
    BufferedReader bufferedReader = null;
    try {
        fileReader = new FileReader("plugins" + File.separator + "UC" + File.separator + "Commands.txt");
        try {
            bufferedReader = new BufferedReader(fileReader);
            String line = null;
            while ((line = bufferedReader.readLine()) != null) {
                temp.add(line);
            }
            bufferedReader.close();
            fileReader.close();
        } catch (IOException e) {
            System.out.println("[UC] couldn't read Commands.txt.  Setting to default");
            temp.clear();
            dfltReader = new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("Commands.txt"));
            bufferedReader = new BufferedReader(dfltReader);
            String line = null;
            try {
                while ((line = bufferedReader.readLine()) != null) {
                    temp.add(line);
                }
            } catch (IOException e1) {
                System.out.println("[UC] Cannot read default commands file.  This is a critical error.  " + 
                        "Message user LRFLEW on bukkit.org if you see this");
            }
        } finally {
            try {
                fileReader.close();
            } catch (IOException e) {}
        }
    } catch (FileNotFoundException e) {
        System.out.println("[UC] couldn't find Commands.txt.  Creating a new file with default settings");
        file = new File("plugins" + File.separator + "UC");
        try {
            file.mkdir();
            file = new File("plugins" + File.separator + "UC" + File.separator + "Commands.txt");
            file.createNewFile();
            newFile = new FileOutputStream(file);
            dflt = this.getClass().getClassLoader().getResourceAsStream("Commands.txt");
            byte[] buffer = new byte[dflt.available()];
            for (int i = 0; i != -1; i = dflt.read(buffer)) {
                newFile.write(buffer, 0, i);
            }
            temp.clear();
            dfltReader = new InputStreamReader(dflt);
            bufferedReader = new BufferedReader(dfltReader);
            String line = null;
            while ((line = bufferedReader.readLine()) != null) {
                temp.add(line);
            }
            dflt.close();
            dfltReader.close();
            bufferedReader.close();
        } catch (IOException e1) {
            System.out.println("[UC] cannot make new file.  " +
                    "Either I don't have enough permissions to see the file or you need to change the permissions of the folder.  " +
                    "Loading default settings...");
            dfltReader = new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("Commands.txt"));
            bufferedReader = new BufferedReader(dfltReader);
            String line = null;
            try {
                while ((line = bufferedReader.readLine()) != null) {
                    temp.add(line);
                }
            } catch (IOException e2) {
                System.out.println("[UC] Cannot read default file.  This is a critical error.  " + 
                        "Message user LRFLEW on bukkit.org if you see this");
            }
        }

    }
    this.commands = temp;
}


1001
2
задан 26 марта 2011 в 03:03 Источник Поделиться
Комментарии
6 ответов

Я не закодированный в Java для некоторое время, поэтому я призываю вас использовать ваше собственное усмотрение при чтении. Он должен по крайней мере дать некоторые общие направления.

Я заметил, что Вы читаете строки в хэш-набор в нескольких местах, так что я начал извлекать его в отдельный метод.

void loadIntoHashSet(HashSet<string> set, Reader in)
{
BufferedReader bufferedReader = new BufferedReader(in);
String line = null;

while ((line = bufferedReader.readLine()) != null)
{
set.add(line);
}

bufferedReader.Close();
}

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

void loadDefaultsIntoHashSet(HashSet<string> set)
{
InputStreamReader dfltReader = new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("Commands.txt"));

try
{
loadIntoHashSet(temp, dfltReader);
}
catch (IOException e1)
{
System.out.println("[UC] Cannot read default commands file. This is a critical error. " +
"Message user LRFLEW on bukkit.org if you see this");
}

dfltReader.Close();
}

Я нахожу использование для построения в чтении ресурсе трансляция будет немного непонятно и так переписал его как:

int read;

while((read = dflt.read(buffer) != -1)
{
newFile.write(buffer, 0, read);
}

5
ответ дан 26 марта 2011 в 06:03 Источник Поделиться

Брайан до сих пор некоторые отличные советы, особенно извлекать повторно функциональность. При очистке большого метода, такого как этот, мой первый шаг обычно переделывая его на более мелкие методы. Мне легче найти короткий методов концептуализации, очистки и повторного использования (если возможно).

Я настоятельно рекомендую книгу Чистый код: справочник Agile Software мастерства для большой охват писать чистыми, послушными код с самого начала. Он также предоставляет множество советов по очистке существующего кода. А примеры на Java, это относится к большинству всех языках.

2
ответ дан 26 марта 2011 в 08:03 Источник Поделиться

Соглашаясь с выше (Брайан, Дэвид, Антон), у меня сложилось впечатление, что у нас есть 4 попытки, чтобы заполнить набор из разных мест, которые играют вместе cascadingly. Но не видно, если вы посмотрите на код. Я думаю, что там должен быть метод main:

fillSet () {
if (! fillfrom (x) || fillfrom (y))
fillfrom (z) || fillfrom (a);
}

Как-то так. Вместо этого, иногда исключение игнорируется, иногда важно (файл не найден), иногда поток немедленно закрывается, иногда в конце концов. Может быть, это оправдано, но если сложить все вместе, кажется, не слишком легко.

Однако, гандикап, что это преждевременные заявления на одно место:

File file = null;
InputStream dflt = null;
InputStreamReader dfltReader = null;
FileReader fileReader = null;
FileOutputStream newFile = null;
BufferedReader bufferedReader = null;

которые могут быть легко отложены, и опять объявлен на различных этапах, что делает код более независимой от его местоположения. Вы не сохраните что-либо с единую декларацию вместо 2 или 4 заявления.

1
ответ дан 16 апреля 2011 в 05:04 Источник Поделиться

Пример с путями и файлами API от версии JDK 7 (но может быть, этот алгоритм может быть оптимизирован):

public void setComs() {
Path directory = Paths.get("plugins" + File.separator + "UC");
Path command = directory.resolve("Commands.txt");

List<String> lines;

Path defaultSettings = Paths.get(this.getClass().getClassLoader().getResource("Commands.txt").getPath());

if (!Files.exists(command)) {
System.out.println("[UC] couldn't find Commands.txt. Creating a new file with default settings");

try {
if (!Files.exists(directory)) {
Files.createDirectory(directory);
}

Path file = Files.createFile(command);

Files.write(file, Files.readAllBytes(defaultSettings));

lines = Files.readAllLines(defaultSettings, Charset.defaultCharset());

} catch (IOException e1) {
System.out.println("[UC] cannot make new file. " +
"Either I don't have enough permissions to see the file or you need to change the permissions of the folder. " +
"Loading default settings...");

lines = readDefaultSettings(defaultSettings);
}
} else {
try {
lines = Files.readAllLines(command, Charset.defaultCharset());
} catch (IOException e) {
System.out.println("[UC] couldn't read Commands.txt. Setting to default");

lines = readDefaultSettings(defaultSettings);
}
}

this.commands = lines;
}

private List<String> readDefaultSettings(Path defaultSettings) {
List<String> lines;
try {
lines = Files.readAllLines(defaultSettings, Charset.defaultCharset());
} catch (IOException e1) {
System.out.println("[UC] Cannot read default commands file. This is a critical error. " +
"Message user LRFLEW on bukkit.org if you see this");
lines = Collections.emptyList();
}
return lines;
}

1
ответ дан 27 апреля 2014 в 04:04 Источник Поделиться

Взгляните на Коммонс-Ио Либ из Джакарты Апач. 2 ниже классы выглядят крайне полезна для вас.

org.apache.commons.io.IOUtils
org.apache.commons.io.FileUtils

И я согласен с выше предложения. Сделать его более мелкозернистой. Идея иметь один метод для одной цели.

0
ответ дан 15 апреля 2011 в 07:04 Источник Поделиться

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

Properties p = new Properties();
Set<String> s = Collections.checkedSet(Collections.newSetFromMap(p), String.class);

для хранения данных в вопрос, а не преобразование существующего набора.

В свойства класса-это реализация карты интерфейс, который содержит методы для чтения и записи содержимого в файл.

Не пиши то, что тебе не нужно.

0
ответ дан 28 апреля 2014 в 01:04 Источник Поделиться