由于Java中的字符是Unicode编码,是双字节的,writeBytes只是将字符串中的每一个字符的低字节内容写入目标设备中,而writeChars将字符串的每一个字符的两个字节的内容都写到目标设备中,WriterUTF将字符串按照UTF编码后的字节长度写入目标设备,然后才是每一字节的UTF编码。
DataInputStream类只提供了一个readUTF()方法返回字符串,这是因为要在一个连续的字节流读取一个字符串,如果没有特殊的标记作为一个字符串的结尾,并且不知道这个字符串的长度,就无法知道读取到什么位置才是这个字符串的结束,DataOutputStream类中只有writeUTF()方法向目标设备中写入字符串的长度,所以也能准确的读回写入的字符串。
例
1 public class Dataintandout { 2 3 public static void main(String[] args) { 4 try{ 5 //创建FileOutputStream对象 6 FileOutputStream fStream = new FileOutputStream("D:/Sourcecode/Java/file/word4.txt"); 7 //创建DataOutputStream对象 8 DataOutputStream dStream = new DataOutputStream(fStream); 9 dStream.writeUTF("使用writeUTF()方法写入数据:不是无心惜落花,落花无意恋春花");10 dStream.writeChars("使用writeChars()方法写入数据:今朝春去谁家落,把酒临风千种恨");11 dStream.writeBytes("使用writeBytes()方法写入数据:昨日寒鸦一片愁,柳塘新绿却温柔");12 dStream.close();13 //创建FileInputStream对象14 FileInputStream fileInputStream = new FileInputStream("D:/Sourcecode/Java/file/word4.txt");15 //创建DataInputStream对象16 DataInputStream dataInputStream = new DataInputStream(fileInputStream);17 System.out.println(dataInputStream.readUTF());//将文件输出18 }catch(Exception e){19 e.printStackTrace();20 }21 }22 23 }
运行结果:使用writeUTF()方法写入数据:不是无心惜落花,落花无意恋春花
打开文本内容如下:
尽管在记事本中出现乱码的情况,但在控制台屏幕上仍然能正确显示内容。但如果使用writeChars()方法和writeBytes()方法写入字符串,就不能正确读出。