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

package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;


public class TestTest {

    public static void main(String[] args) throws IOException {
//        BufferedReader br=Files.newBufferedReader(Paths.get("data/tmp2.txt"));
        BufferedReader br=Files.newBufferedReader(Paths.get("/home/username/Documents/TokenizeThenSplitParallelDeletePatternLTZero.txt"));
        //BufferedReader br=Files.newBufferedReader(Paths.get("/home/username/Documents/temp.txt"));
        int cnt=0;
        while(br.ready()){
            String text = br.readLine();
            cnt++;
            if(cnt>=47334){
                System.out.println(text);
                }
            System.out.println("cnt = "+cnt);
            }
        }
    
        
    }
Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 2
    at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.io.BufferedReader.readLine(BufferedReader.java:324)
    at java.io.BufferedReader.readLine(BufferedReader.java:389)
    at test.TestTest.main(TestTest.java:17)

百度之后的结果都是对java NIO Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1这种的回答。我的文件是utf-8编码的,文件很大,所以就没有上传了。但是当我将第一行到出错那行后面一点儿的所有内容,复制到一个新文件temp.txt中,再次运行,又不会出错了,不知道为什么。

阅读 17k
2 个回答
public static void main(String[] args) throws IOException {
        File file = new File("/home/yangxiaohuan/Documents/TokenizeThenSplitParallelDeletePatternLTZero.txt");
        InputStreamReader read = new InputStreamReader(new FileInputStream(file), "UTF-8");// 考虑到编码格式
        BufferedReader br = new BufferedReader(read);
        int cnt=0;
        while(br.ready()){
            String text = br.readLine();
            cnt++;
            if(cnt>=47334){
                System.out.println(text);
                }
            System.out.println("cnt = "+cnt);
            }
        }
}

原来的代码需要导入下面的类
import java.nio.file.Files;
import java.nio.file.Paths;
但是换成这种形式
import java.io.File;
import java.io.FileInputStream;
就是正常的,没有出错。
而且还有朋友说,将原来的文本里面,将出错的那一行,删去一个字符也是不会报错的。很奇怪的问题。不知道为啥用nio.file.Files就是有问题的

谢邀。你可能搞错了IO和NIO之间的区别,最基本的一点是IO是面向流的,NIO面向缓冲区的,而你的代码很明显是使用了BufferedReader以及InputStreamReader流,如果使用nio,readLine根本不能读取,NIO只能读取缓冲区,扫描缓冲区的大小,并且在解析数据时,比起阻塞IO流,NIO需要付出更大的代价。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题