Buffered Writer иногда создает символы, а не числа

Итак, у меня есть программа, которая собирает кучу данных и непрерывно объединяет данные в строку с одним пробелом между каждой записью. Во время моей процедуры закрытия я печатаю строку в текстовый файл, используя буферизованный писатель. Около 50% времени данные отображаются (в основном) в виде китайских символов. Делает ли виртуальная машина какие-то странные вещи с Unicode? Почему это происходит только иногда?

Я просмотрел другие форумы и не видел других случаев этой проблемы. Никто из других известных мне CS-специалистов не понимает, что происходит.

РЕДАКТИРОВАТЬ: данные представляют собой все целые числа в диапазоне 0-1365;

ОБНОВЛЕНИЕ: после дальнейших исследований я нашел это, что заставляет меня задуматься a может понадобиться PrintStream, а не BufferedWriter, кто-нибудь может сказать об этом? Я протестировал PrintStream, и я не смогу построить его с помощью FileWriter, как с BufferedWriter, а это означает, что мне нужно больше исследований, чтобы написать в мой txt.

ОБНОВЛЕНИЕ: при печати на консоль эта ошибка не возникает. Я приму ответ, который объясняет, как Блокнот (программа, которую я использую для открытия txt) иногда отображает числа, а иногда отображает символы.

Вот соответствующий код:

 //fields
private static BufferedWriter out;
private File saveFile;
String data;
 //inside constructor 
this.saveFile = new File("C:\\Users\\HPlaptop\\Desktop\\MouseData.txt");
                this.saveFile.delete();
                try{this.saveFile.createNewFile();}
                catch (IOException e ){System.out.println("File creation error");}
try {out = new BufferedWriter(new FileWriter("C:\\Users\\HPlaptop\\Desktop\\MouseData.txt"));}
                catch (IOException e) {System.out.println("IO Error");}
                this.control.addWindowListener(new WindowAdapter()
                {
                 public void windowClosing(WindowEvent e)
                    { //there is a method call here but the basics are below
                        out.write(data);
                    out.close();
                        System.exit(0);
                    }
                });

Вот пример набора данных, напечатанного правильно:

 1365 767 1365 767 1365 767 1364 767 1353 756 1268 692 1114 604 980 488 812 334 744 283 694 244 593 150 473 81 328 13 207 0 124 0 115 0 102 0 99 6 107 13 132 20 173 32 187 31 190 25 194 20 201 17 215 14 221 10 224 7 224 7 224 7 226 6 226 6 226 6 226 6 226 6 226 6 226 6

Этот набор данных был получен через несколько секунд, и это не то, что мне нужно.

㐀ㄹ㈠㤰㐠㔸㈠㈱㐠㠶㈠㐱㐠㘲㈠㘰㌠㠷ㄠ㔹㌠㌳ㄠ㌹㈠㘹㈠㄰㈠㠷㈠㜳㈠㐶㈠㐷㈠㐶㈠㔷㈠㌶㈠㔵㈠㐵㈠㠰㈠㤴ㄠ㔲㈠㤴㐠‶㐲‹㌱㈠㘴〠㈠㘴〠㈠㘴〠㈠㜴〠㈠㠴〠㈠㠴〠㈠㜴㠠㈠㔴ㄠ‶㐲‵㤱㈠㔴ㄠ‹㐲‵㠱㈠㜴ㄠ‶㐲‹ㄱ㈠〵ㄠ‰㔲‰〱

person Czarking    schedule 07.09.2016    source источник
comment
Также, хотя это около 50%, это не каждый раз   -  person Czarking    schedule 08.09.2016
comment
Что заставляет вас думать, что сами данные не являются странными китайскими символами? Я был бы менее склонен винить в этом BufferedWriter, чем данные.   -  person Stoud    schedule 08.09.2016
comment
хороший момент, я отредактировал свой вопрос; данные представляют собой все целые числа в диапазоне от 0 до 1356; Я не включил весь код, потому что это было бы слишком долго.   -  person Czarking    schedule 08.09.2016
comment
Определите «целые числа в диапазоне от 0 до 1356. BufferedWriter» для символьных данных, а не для целых чисел. Возможно, вы ищете BufferedOutputStream? или DataOutputStream? NB createNewFile() здесь и бессмысленно, и расточительно. new FileWriter() уже делает это, а теперь вы принудительно удаляете еще одно.   -  person user207421    schedule 08.09.2016
comment
@EJP, как указано, данные объединяются в строку перед записью.   -  person Czarking    schedule 08.09.2016
comment
@Czarking Это не отвечает на вопрос. Какие данные объединяются в строку? Если он двоичный, он не будет работать и не должен работать. Если это цифры ASCII, разделенные печатными символами, невозможно понять, как может возникнуть эта проблема. Вам нужно определить «целые числа». Как просили.   -  person user207421    schedule 08.09.2016
comment
@EJP это координатные точки, разделенные пробелом, но я также пробовал запятые   -  person Czarking    schedule 08.09.2016
comment
добавлены примеры наборов данных @Stoud   -  person Czarking    schedule 08.09.2016
comment
Печать на консоль имеет тот же результат, что и в файл?   -  person Stoud    schedule 08.09.2016
comment
Только что проверил печать на консоли, и ошибка не возникает, если я использую System.out.print, а не out.write() @Stoud   -  person Czarking    schedule 08.09.2016
comment
Какое приложение вы используете, чтобы открыть его? Попробуйте использовать альтернативный.   -  person Stoud    schedule 08.09.2016
comment
извините, что это мой скрипт или текстовый файл? @Стауд   -  person Czarking    schedule 08.09.2016
comment
Текстовый файл в C:\\Users\\HPlaptop\\Desktop\\MouseData.txt   -  person Stoud    schedule 08.09.2016
comment
о, интересно, если я открываю файл data/txt с помощью блокнота, он иногда читается как символы, но с помощью wordpad он, кажется, всегда открывается как числа, которые я подтвержу при дальнейшем тестировании. @Стауд   -  person Czarking    schedule 08.09.2016
comment
Похоже, это должно решить вашу проблему, похоже, это какая-то проблема с интерпретацией данных блокнота.   -  person Stoud    schedule 08.09.2016
comment
@Stoud Я написал ответ, объясняющий, что мы обсуждали в комментариях, но если кто-нибудь напишет ответ, объяснит, почему это иногда происходит, я соглашусь с этим.   -  person Czarking    schedule 08.09.2016


Ответы (2)


BufferedWriter не делает ошибок, и код правильный, за исключением избыточности использования

this.saveFile.delete();
 try{this.saveFile.createNewFile();}
                catch (IOException e ){System.out.println("File creation error");}

а также

new FileWriter

Ошибка чтения данных возникает при открытии файла. В зависимости от того, какая программа открывает данные, отображаются разные результаты из-за того, как программное обеспечение считывает данные. Блокнот отображал символы, потому что он интерпретировал числа как ASCII. Консоль не пыталась интерпретировать данные и просто отображала то, что в нее было записано. Использование программы, которая не пытается интерпретировать числа в файле, позволит правильно просмотреть данные.

person Czarking    schedule 08.09.2016

Поскольку вы не предоставили пример того, какие данные вы записываете в поток, вы, вероятно, столкнулись с феноменом куст спрятал факты.

person Roland Illig    schedule 07.09.2016