CSDN博客

img marcoleung

理解JAVa处理文本文件及字节文件的方式

发表于2004/7/4 19:47:00  1785人阅读

在计算机中保存的数据都只是二进制符号并按字节为单位来保存,对计算机看来字符A并不是字符A,而只是一个没有意义的二进制数字是一个字节。我们利用JAVA的IO类进行读写数据的时候所提供的大部份的方法都是采用读写字节的方式,而且通过这种读写字节的方法是可以保存任可类型的数据的,因为任数据类型在计算机中都是字节码,前提是你要先将你写入的数据先转换成字节类型再通过输出流类输出,而要使得读取出来的数据对我们的程序有意义,我们必须将读取出来的字节按它保存时所表达的意义转换回来,如:保存的时候是char型的,那么我们就要把读取出来的字节数据类型转换成char类型还原它来所表达的意义,要不如果直接输出这个字节数据所得的仅仅是一个16进制的符号,对我们来说是没有意义的。所以,在JAVA里字节类型是一种万能的数据类型,也是数据在计算机里的真正面目。

JAVA的IO类为了方便我们输入输出那些基本的数据类型,基本上在各种的IO类里都提供了针对专门各种的基本数据类型的读写方法,这些方法其实是已经封装了那些转换代码了,如:readInt writeInt 等,但似乎就是没有提供读写STRING类型的方法,原因是JAVA提供了专门读写文本字符的IO类,如:reader writer这两个抽像基类,以及由其派生出来的子类都是专门用来读写文本字符的。因此,如果你要读取文本文件的都话就不要去用inputstrem outStrem这一系列的IO类了,而要使用reader writer 这系列的类了,因为它们不是针对文本的,如果非要用不可的话,你就要在程序中设定专门的程序代码来做这些字符的转换了。如下代码所示:

RandomAccessFile ra=new RandomAccessFile("c://1.txt","rw");  //RandomAccessFile类不支持字符的直接读写的

String s=new String("hello world"); 

ra.write(s.getBytes()); //将String转换成字节类型

byte buf[]=new byte[1024];   //定义一个字节数组用以接收读取到的字节数据

raf.read(buf,0,512);  //RandomAccessFile类不支持字符的直接读取
  
System.out.println("name:"+new String(buf));  //将读取出来的字节数据转换成String并输出。

这里还有一个问题,那就是字符编码的问题,在JAVA虚拟机上字符是以UNICODE的格式来表示的,而我们的机器则是以本地机字符集对字符编码的,所以存在同一个字符有两种不同的表示,因此,当我们想以GB2312也就是简体中文的格式来把这些字符保存在文件上,并以简体中文的格式在显示器(输出流)上显示这些字符,那么我们只得先将UNICODE格式的String转换成GB2312格式的字符编码即s.getBytes(),其实这个方法的作用是用本地的字符编码将UNICODE格式的字符编码转换成GB2312的编码,除非你的机器本地编码是采用UNICODE格式,否则这样的转换是免不了的,即使采用包装类也只是用方法来把这个转换过程隐藏了。JAVA采用UNICODE来做为JVM的字符编码,是因为UNICODE是全球的统一标准,有助于JAVA 的跨平台实现,但无奈现实中还是有很多系统仍然采用各自国家的字符编码,因此JAVA不得不提供一种方法来进行UNICODE与当地字符编码的转换。

0 0

相关博文

我的热门文章

img
取 消
img