Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > URL.openStream() в .jar файле не верно работает


Автор: Laky1911 22.12.2012, 16:35
Все доброго дня. Есть следующий код:
Код

package app;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class YaMapPage {
    private final static String URL_BEGIN = "http://maps.yandex.ua/?rtext=";
    private final static String URL_NO_JAMS = "&sll=30.522301%2C50.451118&sspn=0.704498%2C0.241562&rtm=atm&source=route&ll=30.522301%2C50.451118&spn=0.704498%2C0.241562&z=11&l=map";
    private final static String URL_JAMS = "&sll=30.522301%2C50.451118&sspn=0.704498%2C0.241562&rtm=dtr&source=route&ll=30.522301%2C50.451118&spn=0.704498%2C0.241562&z=11&l=map%2Ctrf&trfm=cur";
 //метод строит ссылку на яндекс карты и возвращает поток
    public InputStream getOpenStream(String start, String end, boolean jams) throws IOException {
        StringBuilder url_address = new StringBuilder(URL_BEGIN);
        url_address.append(start)
                .append("~")
                .append(end)
                .append(jams ? URL_JAMS : URL_NO_JAMS);
        URL url = new URL(url_address.toString());
        return url.openStream();
    }
//с этого метода начинается работа в классе, start и end содержать адреса (русские символы)
    public DataAboutRoute getData(String start, String end) throws IOException {
        DataAboutRoute data = new DataAboutRoute();
        BufferedReader reader = new BufferedReader(new InputStreamReader(getOpenStream(start, end, false), "UTF-8"));
        findValues(reader, data.getRoute1());
        reader = new BufferedReader(new InputStreamReader(getOpenStream(start, end, true), "UTF-8"));
        findValues(reader, data.getRoute2());
        return data;
    }

    public void findValues(BufferedReader reader, DataAboutRoute.RouteData data) throws IOException {
        String line;
        Pattern pattern = Pattern.compile("\"durationWithJams\":\\d+\\.?\\d+,\"distance\":\\d+\\.?\\d+");
        Pattern pattern_numbers = Pattern.compile("\\d+\\.?\\d+");
        Matcher matcher_line, matcher_number;
//идет поиск в потоке по регулярному выражению для получения данных
        while ((line = reader.readLine()) != null) {   
            matcher_line = pattern.matcher(line);
            if (matcher_line.find()) {
                matcher_number = pattern_numbers.matcher(matcher_line.group());
                if (matcher_number.find()) {
                    data.setDuration(Double.valueOf(matcher_number.group()));
                }
                if (matcher_number.find()) {
                    data.setDistance(Double.valueOf(matcher_number.group()));
                }
                break;
            }
        }
    }
}



Проблема вот в чем: если я запускаю из ide(intellij idea у меня), ввожу адрес, то все ОК: регулярка находит то, что нужно. Если я строю .jar файл, то при вводе вводе тех же адресов(с русскими символами) регулярное выражение не проходит. Если во время запуска со среды разработки во входящем потоке были русские символы, то во время запуска с .jar - там знаки вопросов. 
В чем может быть проблема и как ее решить?
Спасибо все за помощь

Автор: miroque 29.12.2012, 08:45
а джарник в консоле запускаешь?

Автор: Laky1911 29.12.2012, 13:48
Цитата(miroque @ 29.12.2012,  08:45)
а джарник в консоле запускаешь?

Нет, не с консоли

Автор: miroque 10.1.2013, 10:56
Цитата(Laky1911 @ 22.12.2012,  21:35)
Если я строю .jar файл, то при вводе вводе тех же адресов(с русскими символами) регулярное выражение не проходит. Если во время запуска со среды разработки во входящем потоке были русские символы, то во время запуска с .jar - там знаки вопросов. 

Честно признатся плохо понял как происходит запуск.
Одно знаю, сам сталквиваюсь с нечто подобным. Это когда в коде пишу, и вывожу информацию в консоль в базу данных и в файл сразу. Основная проблема заключается в кодировках.
Например сам код (даже в тойже IDE любой, сам текст можно писать например CP-1251), кодировка консоли какой нибудь ANSI, база данных Latin-1, файл UTF-8. И вот вроде написал

Код

log.info("Привет Мир!");


то в исходном коде, написано по русски, а вот в, консоле квадратами, в базе данных вопросиками, в файле еще какой аброкадаброй.

По моему, нужно обратить внимание на кодировки.

В моем случае это решилось тем что я в IDE - проекту сказал, файлы делай в кодировке UTF-8. И в файл я уже писал в UTF-8, базу исправил с Латин-1 на UTF-8, ну а консоль я смирился. и смотрел логи в файле.

так что возможно intellij idea делает эти преобразования за тебя, а когда из .jar то извините.

Что то в этом роде...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)