亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

為什么用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都寫的是“?按字節序列將該字符串寫入該文件?!闭垎栍惺裁磪^別呢 ?還有這兩種寫入的方法要分別注明讀出來呢

正在回答

2 回答

因為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)));}
0 回復 有任何疑惑可以回復我~
#1

lucitas 提問者

非常感謝!
2016-03-17 回復 有任何疑惑可以回復我~

結果沒問題,關鍵是理解

writeBytes(String s) :將字符串按[字節]順序寫入基礎輸出流。在Java中字節是8位的
writeChars(String s) :將字符串按[字符]順序寫入基礎輸出流。在Java中字符是16位的

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

為什么用writeInt方法寫入的數據讀不出來 而writeChar的可以

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號