lucitas
2016-03-15 15:05
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都写的是“ 按字节序列将该字符串写入该文件。”请问有什么区别呢 还有这两种写入的方法要分别注明读出来呢
因为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)));}
结果没问题,关键是理解
writeBytes(String s) :将字符串按[字节]顺序写入基础输出流。在Java中字节是8位的
writeChars(String s) :将字符串按[字符]顺序写入基础输出流。在Java中字符是16位的
文件传输基础——Java IO流
133755 学习 · 1030 问题
相似问题