问答详情
源自:3-1 RandomAccessFile基本操作

为什么用writeInt方法写入的数据读不出来 而writeChar的可以

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileDemo {

	public static void main(String[] args)throws IOException {
		// TODO Auto-generated method stub
		File file=new File("imooc");
		if(!file.exists()){
			file.mkdir();
		}
		File f=new File("imooc\\a.txt");
		if(!f.exists()){
			f.createNewFile();
		}
		RandomAccessFile raf=new RandomAccessFile(f,"rw");//创建一个随机访问文件对象
		System.out.println(raf.getFilePointer());//返回指针的位置
		String str="中国";
		byte[] ba=str.getBytes();
		raf.write(ba);
		String str2="我爱慕课网123abc";
		byte[] ba3=str2.getBytes();
		raf.write(ba3);
		System.out.println(raf.getFilePointer());
		int i=10;
		raf.writeInt(i);
		raf.writeChar('A');
		raf.seek(0);
		byte [] ba2=new byte[(int)raf.length()];
		raf.read(ba2);
		String ns=new String(ba2);
		System.out.println(ns);
	}

}

我用writeInt写入的输入10在文件中显示是空格,而打印出的char字符A直接显示在第二行,并且开头有个空格,还有问下我看api里面writeBytes和writeChars都写的是“ 按字节序列将该字符串写入该文件。”请问有什么区别呢  还有这两种写入的方法要分别注明读出来呢

提问者:lucitas 2016-03-15 15:05

个回答

  • 萌萌哒猫头鹰
    2016-03-17 22:54:37
    已采纳

    因为10在ascii码中就是lf换行,所以会另起一行。如果你写32进去那么就是一个空格了。

    writeBytes(String s),是将字符串以一个字节一个字节写入输出流,如果字符是大于8位的,那么高8位就会被舍弃。

    而writeChars(String s)是将字符串按照字符(在java中char是双字节)写入输出流。你去看writeBytes的源码就知道,它其实是先把字符串写入到一个char的数组,然后再把char数组写到字节数组中。

    writeBytes在写入中文字符会舍弃高8位,所以写入的文件就是缺失的,无法读出原输入。

    writeChars如果程序本身使用双字节编码(如utf-16be,gbk),那么转换下就可以读出来。

            raf.seek(0);
            for(int t=0;t<raf.length()/2;t++){
            int ch1 = raf.read();
            int ch2 = raf.read();
            System.out.print( (char)((ch1 << 8) + (ch2 << 0)));}

  • DS_AGS
    2016-03-16 07:02:11

    结果没问题,关键是理解

    writeBytes(String s) :将字符串按[字节]顺序写入基础输出流。在Java中字节是8位的
    writeChars(String s) :将字符串按[字符]顺序写入基础输出流。在Java中字符是16位的