Задать вопрос
  • Почему программа может неправильно работать при запуске в jar?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    В программе у вас символы закодированы в utf-8, а из консоли вы считываете в cp866. Естественно, условия в if не срабатывают. Решение в лоб относительно простое - указать кодировку потока ввода:

    BufferedReader stdInBReader  =  new  BufferedReader(new InputStreamReader(System.in, "cp866"));

    Но у этого решения есть существенный минус - пропадает кроссплатформенность, основная фишка Java. Это решить уже сложнее. Придётся либо получать кодировку от пользователя в качестве параметра:

    String encoding = System.getProperty("console.encoding", "utf-8");
    BufferedReader stdInBReader  =  new  BufferedReader(new InputStreamReader(System.in, encoding));

    Теперь пользователь может указать кодировку при запуске
    java -Dconsole.encoding=cp866 Ex
    а если не укажет, то будет utf-8.

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

    import java.io.Console;
    import java.lang.reflect.Method;
    import java.lang.reflect.InvocationTargetException;
    
    public class Ex {
        private static final String encoding;
    
        static {
            String e = null;
            try {
                final Class<Console> clazz = Console.class;
                final Method method = clazz.getDeclaredMethod("encoding", new Class[0]);
                method.setAccessible(true);
                e = (String) method.invoke(null);
            }
            catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException exc) {}
            finally {
                encoding = e;
            }
        }
    
        public static void main(String[] args) throws IOException {
            BufferedReader stdInBReader  =  new  BufferedReader(new InputStreamReader(System.in, encoding));
        }
    }
    Ответ написан
    1 комментарий