用FileChannel读文件到String的时候,第二次调用这个方法的时候,缓冲器错误

yangit11 2009-09-13 11:30:17
Charset charset = Charset.forName("UTF-8");
CharsetDecoder decoder = charset.newDecoder();

//System.out.println(filePath);
try {
FileInputStream fis = new FileInputStream(path);
FileChannel fc = fis.getChannel();
int sz = (int) fc.size();
//System.out.println(sz);
char[] chs = new char[sz];

MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz);
CharBuffer cb = decoder.decode(bb); cb.get(chs);
webFileContent = new String(chs);

fc.close();
fis.close();
} catch (Exception e) {
System.out.println(e);
}

debug是在红色地方报错,错误信息是
java.nio.charset.MalformedInputException: Input length = 1

google了也没有找到有用的信息,看了jdk的api使用clear()或者reset()方法也没有效果,不知道这个是怎么使用的呢

另外如果不用这个方法读,用FileInputStream读的或读出来的都是 方块块……
彻底无语了,sun咋就不能提供个直接用的接口呢。。。
...全文
257 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
da357085813 2009-09-23
  • 打赏
  • 举报
回复
无关紧要,如果你只是自己练手的话
kunpp 2009-09-14
  • 打赏
  • 举报
回复
我编译了一下,正确运行,是不是你jdk版本太低了?
import java.io.FileInputStream;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;


public class FielTest {
public static void main(String[] args){
FielTest ft=new FielTest();
ft.test();
}
public void test(){
Charset charset = Charset.forName("UTF-8");
CharsetDecoder decoder = charset.newDecoder();
try {
FileInputStream fis = new FileInputStream("D:\\dao.properties");
FileChannel fc = fis.getChannel();
int sz = (int) fc.size();
char[] chs = new char[sz];
// 将此通道的文件区域直接映射到内存中。
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz);
//decode(ByteBuffer in)
//把单个输入字节缓冲区的剩余内容解码到新分配的字符缓冲区的便捷方法。
CharBuffer cb = decoder.decode(bb);
System.out.println(cb.toString());
//cb.get(chs);
fc.close();
fis.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
运行结果:
url=jdbc:oracle:thin:@localhost:1521:xe
name=system
password=wazgrmjfjpp
driver=oracle.jdbc.driver.OracleDriver

lxxzhy 2009-09-14
  • 打赏
  • 举报
回复
/**
* Checked exception thrown when an input byte sequence is not legal for given
* charset, or an input character sequence is not a legal sixteen-bit Unicode
* sequence.
*
* @since 1.4
*/

public class MalformedInputException

===========================================

是否你的源文件不是以UTF-8编码?
yangit11 2009-09-13
  • 打赏
  • 举报
回复
最开始两行定义了decode是utf-8
Charset charset = Charset.forName("UTF-8");
CharsetDecoder decoder = charset.newDecoder();

然后fc.map就是分配一个缓冲区

decoder.decode(bb)应该是定义缓冲区的编码方式(或者读文件的编码方式)
healer_kx 2009-09-13
  • 打赏
  • 举报
回复
decoder.decode(bb);
decode成什么了?还是原来文件的Content吗?
融合量子初始、演化博弈与RK4的增强型红嘴蓝鹊优化器及其在UAV路径规划中的应用(Matlab代码实现)内容概要:本文提出了一种融合量子初始、演化博弈与四阶龙格-库塔法(RK4)的增强型红嘴蓝鹊优化器(QEG-RKRBMO),并将其应用于无人机(UAV)在复杂环境下的三维路径规划问题。该算法通过量子初始化增强种群多样性,引入演化博弈机制优化个体行为策略以平衡全局探索与局部开发能力,并利用RK4方法提升搜索路径的精度与稳定性。研究通过Matlab仿真验证了该算法在UAV路径规划中的优越性,有效解决了传统优化算法易陷入局部最优、收敛速度慢及路径精度不高等问题。; 适合人群:具备一定编程基础(熟悉Matlab)、从事智能优化算法、路径规划或无人机相关研究的科研人员及研究生。; 使用场景及目标:①解决复杂环境下无人机三维路径规划问题;②提升智能优化算法的收敛速度与全局寻优能力;③为智能算法改进与多策略融合提供技术参考与实现方案; 阅建议:建议者结合Matlab代码深入理解算法实现细节,重点关注量子编码、演化博弈策略设计及RK4在迭代过程中的集成方式,并可通过调整参数或更换测试场景进一步验证算法鲁棒性。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧