关于RandomAccessFile里面的 readChar()方法的疑问:请看如下代码:import java.io.*;//测试RandomAccessFile()方法
class Test_AccessFile{
public static void main(String[] args) throws IOException,FileNotFoundException{
File file1=new File("C:/Classes/stream/FileDemo.java");
try{
RandomAccessFile rafile=new RandomAccessFile(file1,"rw");
rafile.seek(1);
int i=0,j=0;
System.out.println(rafile.getFilePointer());
while(rafile.read()!=-1);
System.out.println(i);
System.out.println(rafile.getFilePointer());
rafile.seek(0);
System.out.println(rafile.getFilePointer()); ______________________________________________________________________________
代码段 0 byte[] b=new byte[(int)rafile.length()];
while(rafile.read(b)!=-1);
System.out.println(rafile.getFilePointer());
for(j=0;j<b.length;j++){
System.out.print((char)b[j]);
}
_______________________________________________________________________________
代码段1 rafile.seek(0);
while(rafile.read()!=-1){
System.out.print((char)rafile.readByte());
}
_______________________________________________________________________________
代码段 2 rafile.seek(0);
while(rafile.read()!=-1){
System.out.print(rafile.readChar());
}
_______________________________________________________________________________ 代码段 3 System.out.println("abcdefg");
System.out.println("");
System.out.println("");
System.out.println("");
rafile.seek(5);
System.out.println(rafile.readChar());
}
catch(FileNotFoundException e){
System.out.println("File not found");
System.out.println(e);
}
catch(IOException e){
System.out.println("Filepointer is null.");
System.out.println(e);
}
}} 代码段1的本意是用readByte()逐个字节输出,然后转换为char,输出到屏幕;
代码段2的本意是用readChar()逐个字符输出到屏幕。问题是:当代码段1存在时,输出是casFlDm{*
pbi ttcvi anSrn rs]{
iefl1nwFl(C\Cass\tem\ieitreojv";….
…..
…..
一堆乱码。
然后代码段2,代码段3根本没有执行。当屏蔽掉代码段1,代码段2、3都能执行,担输出是:
浰牴橡愮漮??污猠楬?潻??扬挠瑡楣癯搠慩?物朠牧孝笍??汥晩攱湥?汥?屜污獥屜瑲慭屆汥
楬敲敭?癡???祳敭潵?楮汮?牥琠猠?汥?瑐牥琨???楬?牥瑟楬?汥?瑐牥瑆汥???祳敭潵?楮汮
…
…
等中文乱码?是什么回事呢?还有另外一个问题,请看代码段 0,我的本意是用byte[]建立一个长度等于文件大小段数组,然后通过read()方法逐个字节的把文件内容输入到数组 b[],然后逐个转换为char输出到屏幕,运行输出一切正常,但后来我自己想了一下,觉得有点不妥。Char在内存是16位的,就是每个文件的字符都占16位,但byte是8位的,也就是说我把文件的每个字节输入到b[]数组后,相当于每两个b[]数组才能组成一个正确的文件的字符,但我把逐个char字符用类型转换强制转换成char,然后逐个输出,这样每个char只拥有原来每个char的一半数据,高8位的数据应该补0而丢失,而char的个数应该是文件字符个数的两倍,我是这样想的,但为什么结果却非常正常的输出呢?
class Test_AccessFile{
public static void main(String[] args) throws IOException,FileNotFoundException{
File file1=new File("C:/Classes/stream/FileDemo.java");
try{
RandomAccessFile rafile=new RandomAccessFile(file1,"rw");
rafile.seek(1);
int i=0,j=0;
System.out.println(rafile.getFilePointer());
while(rafile.read()!=-1);
System.out.println(i);
System.out.println(rafile.getFilePointer());
rafile.seek(0);
System.out.println(rafile.getFilePointer()); ______________________________________________________________________________
代码段 0 byte[] b=new byte[(int)rafile.length()];
while(rafile.read(b)!=-1);
System.out.println(rafile.getFilePointer());
for(j=0;j<b.length;j++){
System.out.print((char)b[j]);
}
_______________________________________________________________________________
代码段1 rafile.seek(0);
while(rafile.read()!=-1){
System.out.print((char)rafile.readByte());
}
_______________________________________________________________________________
代码段 2 rafile.seek(0);
while(rafile.read()!=-1){
System.out.print(rafile.readChar());
}
_______________________________________________________________________________ 代码段 3 System.out.println("abcdefg");
System.out.println("");
System.out.println("");
System.out.println("");
rafile.seek(5);
System.out.println(rafile.readChar());
}
catch(FileNotFoundException e){
System.out.println("File not found");
System.out.println(e);
}
catch(IOException e){
System.out.println("Filepointer is null.");
System.out.println(e);
}
}} 代码段1的本意是用readByte()逐个字节输出,然后转换为char,输出到屏幕;
代码段2的本意是用readChar()逐个字符输出到屏幕。问题是:当代码段1存在时,输出是casFlDm{*
pbi ttcvi anSrn rs]{
iefl1nwFl(C\Cass\tem\ieitreojv";….
…..
…..
一堆乱码。
然后代码段2,代码段3根本没有执行。当屏蔽掉代码段1,代码段2、3都能执行,担输出是:
浰牴橡愮漮??污猠楬?潻??扬挠瑡楣癯搠慩?物朠牧孝笍??汥晩攱湥?汥?屜污獥屜瑲慭屆汥
楬敲敭?癡???祳敭潵?楮汮?牥琠猠?汥?瑐牥琨???楬?牥瑟楬?汥?瑐牥瑆汥???祳敭潵?楮汮
…
…
等中文乱码?是什么回事呢?还有另外一个问题,请看代码段 0,我的本意是用byte[]建立一个长度等于文件大小段数组,然后通过read()方法逐个字节的把文件内容输入到数组 b[],然后逐个转换为char输出到屏幕,运行输出一切正常,但后来我自己想了一下,觉得有点不妥。Char在内存是16位的,就是每个文件的字符都占16位,但byte是8位的,也就是说我把文件的每个字节输入到b[]数组后,相当于每两个b[]数组才能组成一个正确的文件的字符,但我把逐个char字符用类型转换强制转换成char,然后逐个输出,这样每个char只拥有原来每个char的一半数据,高8位的数据应该补0而丢失,而char的个数应该是文件字符个数的两倍,我是这样想的,但为什么结果却非常正常的输出呢?
解决方案 »
- JAVA API 对文本语法的检查
- 帮忙解释一下输出结果?
- 重大发现,java中的paint机制相当于C中的callback回调函数.
- 连接mysql更新时问题
- 还是jdbc的问题,我都快崩溃了!那位大哥能帮帮忙?
- 怎样实现类似聊天室的自动滚屏??
- JDK环境的设定(看过THINKING IN JAVA的朋友解答)
- java初级问题???
- 怎么会找不到包java.io.*呢?求解!!!
- org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch updat
- java读取oracle的blob字段空指针错误!!!太奇怪了
- 请问怎么把JFrame中的最大化按钮去掉
while(rafile.read()!=-1){
System.out.print((char)rafile.readByte());
}
_______________________________________________________________________________
代码段 2 rafile.seek(0);
while(rafile.read()!=-1){
System.out.print(rafile.readChar());
}
建议改为:
try
{
rafile.seek(0);
while(true)
{
System.out.print((char)rafile.readByte());
}
}
catch(EOFException e)
{
System.out.println("file end");
} try
{
rafile.seek(0);
while(true)
{
System.out.print(rafile.readChar());
}
}
catch(EOFException e)
{
System.out.println("end file");
}
你连续使用了两个read方法,是不恰当的
代码段 2 你使用readChar()读取,文件里本来都是英文字符,是8位的,你使用readChar()一次读入一个字节,所以两个英文字符一起读入,当一个字节的字符输出,所以就出现乱码现象。
至于你说为什么正常输出,我不大了解你的意思,是应该正常输出啊,没有什么不对么