Как объединить пути в Java?

Я поддерживаю хранимые процедуры ( MySQL имеет поддержку хранимых процедур с 5.0 ) с точки зрения безопасности - преимущества -

  1. Большинство баз данных (включая MySQL ) позволяют ограничить доступ пользователей к выполнению хранимых процедур. Четкое управление доступом к безопасности полезно для предотвращения эскалации атак привилегий. Это предотвращает возможность взлома приложений, которые могут быть запущены SQL, непосредственно из базы данных.
  2. Они абстрагируют исходный SQL-запрос из приложения, поэтому для приложения доступно меньше информации о структуре базы данных. Это затрудняет понимание людьми базовой структуры базы данных и разработку подходящих атак.
  3. Они принимают только параметры, поэтому существуют преимущества параметризованных запросов. Конечно, IMO вам все равно нужно дезинфицировать ваш вход, особенно если вы используете динамический SQL внутри хранимой процедуры.

Недостатки -

  1. Они (хранимые процедуры) трудно поддерживать и стремиться к размножению очень быстро. Это делает их проблемой.
  2. Они не очень подходят для динамических запросов - если они созданы для принятия динамического кода в качестве параметров, тогда многие преимущества сбрасываются.

329
задан Rodrigue 21 August 2017 в 22:53
поделиться

3 ответа

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

при использовании Java 7 или Java 8 необходимо сильно рассмотреть использование java.nio.file.Path ; Path.resolve может использоваться для объединения одного пути с другим, или со строкой. Paths класс помощника полезен также. Например:

Path path = Paths.get("foo", "bar", "baz.txt");

, Если необходимо обслужить pre-Java-7 среды, можно использовать java.io.File , как это:

File baseDirectory = new File("foo");
File subDirectory = new File(baseDirectory, "bar");
File fileInDirectory = new File(subDirectory, "baz.txt");

, Если Вы хотите его назад как строку позже, можно звонить getPath(). Действительно, если бы Вы действительно хотели подражать Path.Combine, Вы могли бы просто записать что-то как:

public static String combine(String path1, String path2)
{
    File file1 = new File(path1);
    File file2 = new File(file1, path2);
    return file2.getPath();
}
384
ответ дан Jon Skeet 23 November 2019 в 00:48
поделиться

Основной ответ должен использовать объекты Файла. Однако Commons IO действительно имеет класс FilenameUtils , который может сделать такого рода вещь, такой как concat () метод.

42
ответ дан JodaStephen 23 November 2019 в 00:48
поделиться

Это решение предлагает интерфейс для присоединения к фрагментам пути от Строки [] массив. Это использует java.io. Файл. Файл (Строковый родитель, Строковый ребенок) :

    public static joinPaths(String[] fragments) {
        String emptyPath = "";
        return buildPath(emptyPath, fragments);
    }

    private static buildPath(String path, String[] fragments) {
        if (path == null || path.isEmpty()) {
            path = "";
        }

        if (fragments == null || fragments.length == 0) {
            return "";
        }

        int pathCurrentSize = path.split("/").length;
        int fragmentsLen = fragments.length;

        if (pathCurrentSize <= fragmentsLen) {
            String newPath = new File(path, fragments[pathCurrentSize - 1]).toString();
            path = buildPath(newPath, fragments);
        }

        return path;
    }

Затем можно просто сделать:

String[] fragments = {"dir", "anotherDir/", "/filename.txt"};
String path = joinPaths(fragments);

Возвраты:

"/dir/anotherDir/filename.txt"

0
ответ дан 23 November 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: