Java nio charset malformedinputexception
Все включено Charset, чтобы избежать » java.НИО.кодировка.MalformedInputException: длина входного сигнала = 1″?
Я создаю простую программу wordcount на Java, которая читает текстовые файлы каталога.
тем не менее, я продолжаю получать ошибку:
из этой строки кода:
Я знаю, что, вероятно, получу это, потому что я использовал Charset это не включало некоторые символы в текстовых файлах, некоторые из которых включали символы других языков. Но я хочу включить этих персонажей.
я позже узнал на JavaDocs что Charset является необязательным и используется только для более эффективного чтения файлов, поэтому я изменил код на:
но некоторые файлы все-таки бросить MalformedInputException . Не знаю почему.
мне было интересно, есть ли все включено Charset Это позволит мне читать текстовые файлы с различных типов символов?
8 ответов
вероятно, вы хотите иметь список поддерживаемых кодировок. Для каждого файла попробуйте каждую кодировку по очереди, возможно, начиная с UTF-8. Каждый раз, когда вы ловите MalformedInputException , попробуйте следующую кодировку.
создание BufferedReader из файлов.newBufferedReader
при запуске приложения может возникнуть следующее исключение:
отличается тем, что первый использует действие по умолчанию CharsetDecoder.
действие по умолчанию для ошибок с неправильным вводом и неприменимыми символами —отчет них.
в то время как последний использует замены.
ISO-8859-1 является все включено кодировка, в том смысле, что это гарантированно не бросать MalformedInputException. Так что это хорошо для отладки, даже если ваш вход не находится в этой кодировке. Итак: —
У меня были некоторые символы двойной правой кавычки/двойной левой кавычки на моем входе, и оба US-ASCII и UTF-8 бросили на них MalformedInputException, но ISO-8859-1 работал.
Я также столкнулся с этим исключением с сообщением об ошибке,
и обнаружил, что при попытке использовать
для записи строки «orazg 54», приведенной из универсального типа в классе.
эта строка имеет длину 9, содержащую символы со следующими кодовыми точками:
111 Сто четырнадцать Девяносто семь Сто двадцать два Сто три Девять Пятьдесят три Пятьдесят два 10
однако, если BufferedWriter в классе заменяется на:
он может успешно написать эту строку без исключения. Кроме того, если я пишу ту же строку, созданную из символов, она все еще работает нормально.
ранее я никогда не сталкивался с каким-либо исключением при использовании первого BufferedWriter для записи любых строк. Это странная ошибка, которая возникает для BufferedWriter, созданного из java.НИО.файл.Файлы.newBufferedWriter(путь, параметры)
Я написал следующее, чтобы распечатать список результатов для стандартизации на основе доступных наборов символов. Обратите внимание, что он также сообщает вам, какая строка выходит из строя из номера строки на основе 0 в случае устранения неполадок, какой символ вызывает проблемы.
Ну, проблема в том, что Files.newBufferedReader(Path path) реализован следующим образом :
поэтому в принципе нет смысла указывать UTF-8 Если вы не хотите быть описательным в своем коде. Если вы хотите попробовать» более широкую » кодировку, вы можете попробовать с StandardCharsets.UTF_16 , но вы не можете быть на 100% уверены, что получите все возможные символы в любом случае.
попробуйте это.. у меня была такая же проблема, ниже реализация работала для меня
затем используйте Reader где угодно.
вы можете попробовать что-то вроде этого или просто скопировать и пропустить ниже кусок.