关于读取文件内容时报sun.io.MalformedInputException的问题

在网上找到的原因是这样的:
这个问题产生的原因是IBM在JDK 1.4版本中为了追求对io通道的高效率改变了JDK 1.3中对io通道中异常处理的策略。IBM JDK 1.4中对于io通道的异常处理更加严格,因此系统中会报上面的错误。
解决这一问题的办法是不使用IBM JDK 1.4中默认的io通道,而使用nio通道。具体的做法如下:
1.打开管理控制台,找到并选择运行这个JSP的应用服务器
2.依次选择进程定义,java虚拟机,一般JVM自变量
3.添加-Dibm.stream.nio=true
4.确定,保存
5.重新启动该服务器

本来我就怀疑又是IBM JDK的问题,果然被我不幸言中了,再次表示一下郁闷!

我发现在我需要读取的文件当中存在这样的一些字符: "怃噱珀腓镱呐涉启螓周%犴篾裱"

我原来是用下面这段程序读取这个文件的内容并打印的:
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String str="";
String result = "";
while((str=br.readLine())!=null){
result += str + "\n";
}
即逐行读取的方法,我想也是一般的方法,但是就是这个readline方法导致了IBM JDK 1.4.2 报了这个sun.io.MalformedInputException的问题.

我现在使用的解决方法如下:
String result = "";
StringBuffer sBuffer=new StringBuffer();
FileInputStream fis=new FileInputStream(file);
BufferedInputStream bis=new BufferedInputStream(fis);
String tempStr;
byte[] b = new byte[1024];
int i = 0;
while ((i = bis.read(b)) > 0) {
tempStr=new String(b,0,i);
sBuffer.append(tempStr);
}
result = sBuffer.toString();
即逐字节读取的方法.这样处理就可以正常读取了!

具体到底为什么会出现这种问题现在还没弄明白,估计也弄不明白了!


解决代码如下

————————————————————————————————————————————————

FileInputStream fis = new FileInputStream(filePath);
BufferedReader bufRd = new BufferedReader(new InputStreamReader(fis, "shift_jis"));
String strLine = "";
while((strLine = bufRd.readLine())!= null){
//because the IBM Jdk is special in the access of IO inputstream or outputstream
byte[] bts = strLine.getBytes("shift_jis");
sun.io.ByteToCharConverter convertor = sun.io.ByteToCharConverter.getConverter("shift_jis");
char[] charArray = convertor.convertAll(bts);
for(int j = 0;j < charArray.length;j ++){
buffer.append(String.valueOf(charArray[j]));
}
buffer.append("\n");
}
bufRd.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值