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流
133848 学习 · 1060 问题
相似问题