programing

"java.nio.charset"을 피하기 위한 모든 포함 문자 집합.잘못된 입력 예외:입력 길이 = 1인치?

kingscode 2022. 11. 8. 21:28
반응형

"java.nio.charset"을 피하기 위한 모든 포함 문자 집합.잘못된 입력 예외:입력 길이 = 1인치?

자바에서 디렉토리의 텍스트 기반 파일을 읽어내는 간단한 워드 카운트 프로그램을 만들고 있습니다.

그러나 다음과 같은 오류가 계속 발생합니다.

java.nio.charset.MalformedInputException: Input length = 1

다음 코드 행에서 가져옵니다.

BufferedReader reader = Files.newBufferedReader(file,Charset.forName("UTF-8"));

내가 이걸 받는 건 아마 내가 이걸 썼기 때문이란 걸 알아Charset텍스트 파일에 일부 문자가 포함되지 않았고 일부에는 다른 언어의 문자가 포함되었습니다.하지만 나는 그 캐릭터들을 포함시키고 싶다.

나중에 JavaDocs에서 알게 된 사실은Charset는 옵션이며 파일을 보다 효율적으로 읽기 위해서만 사용되기 때문에 코드를 다음과 같이 변경했습니다.

BufferedReader reader = Files.newBufferedReader(file);

하지만 일부 파일들은 여전히 이 파일을MalformedInputException.왜인지 모르겠다.

여러 종류의 문자를 포함한 텍스트 파일을 읽을 수 있는 기능이 있습니까?

감사해요.

지원되는 인코딩 목록이 필요할 수 있습니다.각 파일에 대해 UTF-8로 시작하는 각 인코딩을 차례로 시도합니다.MalformedInputException다음 인코딩을 시도합니다.

Files.newBufferedReader에서 BufferedReader 작성

Files.newBufferedReader(Paths.get("a.txt"), StandardCharsets.UTF_8);

응용 프로그램을 실행할 때 다음과 같은 예외가 발생할 수 있습니다.

java.nio.charset.MalformedInputException: Input length = 1

그렇지만

new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"),"utf-8"));

잘 동작합니다.

다른 점은 CharsetDecoder 디폴트액션을 사용하는 것입니다.

부정한 입력 오류 및 비대응 문자 오류에 대한 기본 액션은 이러한 오류를 보고하는 입니다.

후자는 REPLACE 액션을 사용합니다.

cs.newDecoder().onMalformedInput(CodingErrorAction.REPLACE).onUnmappableCharacter(CodingErrorAction.REPLACE)

ISO-8859-1은 Malformed Input Exception을 슬로우하지 않는다는 점에서 모든 것을 포함하는 문자 집합입니다.따라서 입력이 이 문자 집합에 없는 경우에도 디버깅에 유용합니다.그래서:-

req.setCharacterEncoding("ISO-8859-1");

입력에 오른쪽 따옴표/왼쪽 따옴표 이중 따옴표 문자가 몇 개 있었는데 US-ASCII와 UTF-8 모두 MalformedInputException을 입력했지만 ISO-8859-1이 작동했습니다.

또, 에러 메세지와 함께, 이 예외도 발생했습니다.

java.nio.charset.MalformedInputException: Input length = 1
at java.nio.charset.CoderResult.throwException(Unknown Source)
at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
at sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.io.OutputStreamWriter.write(Unknown Source)
at java.io.BufferedWriter.flushBuffer(Unknown Source)
at java.io.BufferedWriter.write(Unknown Source)
at java.io.Writer.write(Unknown Source)

사용하려고 할 때 이상한 버그가 발생한다는 것을 알게 되었습니다.

BufferedWriter writer = Files.newBufferedWriter(Paths.get(filePath));

클래스의 범용 타입에서 스트링 "orazg 54" 캐스트를 작성합니다.

//key is of generic type <Key extends Comparable<Key>>
writer.write(item.getKey() + "\t" + item.getValue() + "\n");

이 문자열의 길이는 9이며, 코드 포인트는 다음과 같습니다.

111 114 97 122 103 9 53 52 10

단, 클래스의 BufferedWriter가 다음으로 대체되는 경우:

FileOutputStream outputStream = new FileOutputStream(filePath);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));

예외 없이 이 String을 쓸 수 있습니다.또한 문자에서 동일한 String create를 작성해도 정상적으로 동작합니다.

String string = new String(new char[] {111, 114, 97, 122, 103, 9, 53, 52, 10});
BufferedWriter writer = Files.newBufferedWriter(Paths.get("a.txt"));
writer.write(string);
writer.close();

지금까지 첫 번째 BufferedWriter를 사용하여 문자열을 쓸 때 예외가 발생한 적이 없습니다.java.nio.file에서 생성된 BufferedWriter에서 발생하는 이상한 오류입니다.Files.newBufferedWriter(패스, 옵션)

이거 먹어봐..같은 문제가 있었습니다.아래의 실장에서는 문제가 발생하지 않았습니다.

Reader reader = Files.newBufferedReader(Paths.get(<yourfilewithpath>), StandardCharsets.ISO_8859_1);

원하는 위치에 Reader를 사용합니다.

외부:

CsvToBean<anyPojo> csvToBean = null;
    try {
        Reader reader = Files.newBufferedReader(Paths.get(csvFilePath), 
                        StandardCharsets.ISO_8859_1);
        csvToBean = new CsvToBeanBuilder(reader)
                .withType(anyPojo.class)
                .withIgnoreLeadingWhiteSpace(true)
                .withSkipLines(1)
                .build();

    } catch (IOException e) {
        e.printStackTrace();
    }

ISO_8859_1은 나에게 효과가 있었다!쉼표로 구분된 값이 있는 텍스트 파일을 읽고 있었습니다.

사용 가능한 문자 집합을 기준으로 표준화할 결과 목록을 인쇄하기 위해 다음과 같이 작성했습니다.또, 문제의 원인이 되고 있는 문자를 트러블 슈팅 하고 있는 경우에 대비하여, 0 베이스의 회선 번호로부터 장해가 발생하는 회선이 표시됩니다.

public static void testCharset(String fileName) {
    SortedMap<String, Charset> charsets = Charset.availableCharsets();
    for (String k : charsets.keySet()) {
        int line = 0;
        boolean success = true;
        try (BufferedReader b = Files.newBufferedReader(Paths.get(fileName),charsets.get(k))) {
            while (b.ready()) {
                b.readLine();
                line++;
            }
        } catch (IOException e) {
            success = false;
            System.out.println(k+" failed on line "+line);
        }
        if (success) 
            System.out.println("*************************  Successs "+k);
    }
}

는 '아,아,아,아,아...Files.newBufferedReader(Path path)합니다.

public static BufferedReader newBufferedReader(Path path) throws IOException {
    return newBufferedReader(path, StandardCharsets.UTF_8);
}

하는 것은 가 없습니다.UTF-8코드에 설명이 필요한 경우를 제외하고요. 넓은' 때는 '더 넓은' 글자를 .StandardCharsets.UTF_16하지만 가능한 모든 캐릭터를 얻을 수 있다고 100% 확신할 수는 없습니다.

UTF-8은 폴란드어 문자와 함께 사용할 수 있습니다.

이런 걸 시도해 볼 수도 있고, 그냥 복사해서 밑에 붙일 수도 있어요.

boolean exception = true;
Charset charset = Charset.defaultCharset(); //Try the default one first.        
int index = 0;

while(exception) {
    try {
        lines = Files.readAllLines(f.toPath(),charset);
          for (String line: lines) {
              line= line.trim();
              if(line.contains(keyword))
                  values.add(line);
              }           
        //No exception, just returns
        exception = false; 
    } catch (IOException e) {
        exception = true;
        //Try the next charset
        if(index<Charset.availableCharsets().values().size())
            charset = (Charset) Charset.availableCharsets().values().toArray()[index];
        index ++;
    }
}

언급URL : https://stackoverflow.com/questions/26268132/all-inclusive-charset-to-avoid-java-nio-charset-malformedinputexception-input

반응형