Java.net.URI (). getPath () возвращает значение null, а строка содержит двоеточие?

Чтобы быть точным, рассмотрим следующий пример строки:

String str = ":Royal%2Bweddings%3A%2Bceremony%2BThe%2Bsymbolism";
java.net.URI(str).getPath();

Здесь, поскольку str содержит двоеточие :, URI().getPath() возвращает ноль, но если я удалю двоеточие, возвращаемое значение будет таким, как я ожидал.

Итак, как мне заставить URI().getPath() не фильтровать двоеточие и оставить его как есть?

URI (). GetPath () Returns the decoded path component of this URI.. Если действительный путь не может быть декодирован, вы получите нулевое значение.

sorifiend 29.05.2018 05:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
1 076
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете попытаться «уйти» от символа двоеточия следующим образом (используя URLEncoder, как предлагает Страшный вомбат):

import java.net.*;
import java.io.*;

public class MyClass {

public static void main(String args[]) {
    try { 
        String str = "https://www.jdoodle.com/online-ja:va-compiler"; 
        String escapedStr = URLEncoder.encode(str, "UTF-8");
        System.out.println(escapedStr);
        String uriPath = new java.net.URI(escapedStr).getPath();
        System.out.println(uriPath);

    } catch (URISyntaxException |  UnsupportedEncodingException e) { 
        e.printStackTrace(); // just for the sake of this example, this should be logged properly
    }
}

}

И вывод:

https%3A%2F%2Fwww.jdoodle.com%2Fonline-ja%3Ava-compiler // note the UTF-8 representation for potentially problematic characters
https://www.jdoodle.com/online-ja:va-compiler

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

public class Escaping {

private static final String COLON = ":";
private static final String ESCAPE_COLON = ".colon.";

public static void main(String args[]) {
    String str = "This is my : String : with colons"; 
    String escapedStr = str.replaceAll(COLON,ESCAPE_COLON);
    System.out.println(escapedStr);
    // perfrom whatever action you need with the 'problematic' colon characters
    // ...
    // ...
    System.out.println(escapedStr.replaceAll(ESCAPE_COLON,COLON));
    }
}

И вывод:

This is my .colon. String .colon. with colons
This is my : String : with:

Рекомендации:

хотя ваш ответ сработал, но что, если мой str содержал .colon., тогда это было бы недостатком, верно?

ITried 29.05.2018 05:26
.colon. был выбран для этого примера произвольно. Вы можете заменить его на все, что пожелаете. ..colon.. тоже может подойти. Если мой ответ был полезен - рассмотрите возможность голосования или выбора его в качестве ответа на свой вопрос. Спасибо за внимание.
Rann Lifshitz 29.05.2018 05:28

Прежде всего, немного о вашем коде. Он не компилируется, потому что вам нужно использовать new для создания нового объекта:

String str = ":Royal%2Bweddings%3A%2Bceremony%2BThe%2Bsymbolism";
new java.net.URI(str).getPath();

Этот код не возвращает null - вместо этого он выдает описательное исключение:

java.net.URISyntaxException: Expected scheme name at index 0: :Royal%2Bweddings%3A%2Bceremony%2BThe%2Bsymbolism

Конструктор URI принимает полный URI, а двоеточие имеет особое значение, но перед ним должен стоять префикс с именем протокола, например http: или file:.

Если вы хотите использовать эти специальные символы внутри пути, вам необходимо URL-кодировать путь - это нормальная практика для включения специальных символов в URL или URI:

String str = ":Royal%2Bweddings%3A%2Bceremony%2BThe%2Bsymbolism";
str = URLEncoder.encode(str, "UTF-8"); // <---- URL encoding
System.out.println(new java.net.URI(str).getPath());

Вам не нужно придумывать собственную схему кодирования с собственными заменами - URL-адрес является стандартом. И вам также не нужно декодировать, это автоматически выполняется getPath().

Однако в вашем случае ваш путь уже частично закодирован по URL-адресу и уже содержит двоеточие: Royal+weddings:+ceremony+The+symbolism.

Вам нужно URL-кодировать весь путь за один раз:

String encoded = URLEncoder.encode(":Royal+weddings:+ceremony+The+symbolism", "UTF-8");

Тогда вы устроились.

Другие вопросы по теме