您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>java源码下载>

java 字节流转字符流

大小:0.8 MB 人气: 2017-09-27 需要积分:1

  一、字节流

  1)输入和输出流

  首先,字节流要进行读和写,也就是输入和输出,所以它有两个抽象的父类InputStream、OutputStream。

  InputStream抽象了应用程序读取数据的方式,即输入流。

  OutputStream抽象了应用程序写出数据的方式,即输出流。

  2)读写结束

  在字节流中当读写结束,达到文件结尾时,称为EOF = End或者读到-1就读到结尾。

  3)输入流基本方法

  首先我们要清楚输入流是什么。比如通过我们的键盘在文本文件上输入内容,这个过程键盘充当的就是输入流,而不是输出流。因为键盘的功能是将内容输入到系统,系统再写入到文件上。以下是输入流的基本方法read():

  intb = in.read(); //读取一个字节无符号填充到int低八位。-1是EOF。in.read( byte[] buf); //读取数据填充到字节数组buf中。返回的是读到的字节个数。in.read( byte[] buf, intstart,intsize) //读取数据到字节数组buf从buf的start位置开始存放size长度分数据

  其中in是InputStream抽象类的实例,可以发现这个方法和RandomAccessFile类中的read()方法差不多,因为两者都是通过字节来读取的。

  4)输出流基本方法

  输出流是进行写的操作,其基本操作方法是write(),可以将此方法与输入read()方法一 一去对应,更好理解。

  1out.write( intb) //写出一个byte到流,b的低8位2out.write( byte[] buf) //将buf字节数组都写到流3out.write( byte[] buf, intstart, intsize) //字节数组buf从start位置开始写size长度的字节到流

  了解了InputStream、OutputStream的基本操作方法后,再来看看它们两个的“孩子”FileInputStream和FileOutputStream。

  这两个子类具体实现了在文件上读取和写入数据的操作,日程编程中更多的是使用这两个类。

  二、FileInputStream和FileOutputStream类的使用

  —————–FileInputStream类的使用

  1.使用read()方法读取文件

  /** * 读取指定文件内容,按照16进制输出到控制台 * 并且每输出10个byte换行 *@throwsFileNotFoundException */publicstaticvoidprintHex(String fileName)throwsIOException{ //把文件作为字节流进行读操作FileInputStream in=newFileInputStream(fileName); intb; intcount= 0; //计数读到的个数while((b=in.read())!=- 1){ if(b《= 0xf){ //单位数前面补0System.out.println( “0”); } System.out.print(Integer.toHexString(b& 0xff)+ “ ”); if(++count% 10== 0){ System.out.println(); } } in.close(); //一定要关闭流}

  运行结果(随便一个文件来测试的):

  java 字节流转字符流

  注意:

  - FileInputStream()构造函数可以通过文件名(String)也可以通过File对象。上面的案例是使用文件名来构造的。

  - (b=in.read())!=-1 通过读到-1来判断是否读到文件结尾。

  - in.close() 使用完IO流的对象一定要关闭流,养成好习惯很重要。

  2.使用read(byte[] buf,int start, int size)方法读取文件

  上述方法只能一个一个字节读取,对于较大的文件效率太低,推荐使用这个方法来一次性读取文件。

  publicstaticvoidprintHexByBytes(String fileName) throws IOException{ FileInputStream in=newFileInputStream(fileName); byte[] buf= newbyte[ 20* 1024]; //开辟一个20k大小的字节数组/* * 从in中批量读取字节,放入到buf这个字节数组中 * 从第0个位置开始放,最多放buf.length个 * 返回的是读到的字节个数 *///一次性读完的情况intcount= in.read(buf, 0, buf.length); intj= 1; for( inti= 0;i《count;i++){ if((buf[i]& 0xff)《= 0xf){ //单位数前面补0System.out.print( “0”); } System. out.print(Integer.toHexString(buf[i]& 0xff)+ “ ”); if(j++% 10== 0){ System. out.println(); } } in.close(); } }

  read(byte[] buf,int start, int size)返回的是读到的字节个数,即buf字节数组的有效长度,所以输出buf数组时用的长度是count而不是buf.length,因为我们不知道文件大小和数组大小的关系,上述方法适用于文件大小不超过数组大小的情况下,一次性把文件内容读取到数组里,这里就有一个问题了,如果文件大小超过数组大小,那又该如何读取才能把文件全部读完呢??

  我们知道读到-1就是读到文件末,所以还是利用while循环重复读取直到读到-1结束循环,把上述代码修改后如下:

  publicstaticvoidprintHexByBytes(String fileName) throws IOException{ FileInputStream in=newFileInputStream(fileName); byte[] buf= newbyte[ 20* 1024]; //开辟一个20k大小的字节数组/* * 从in中批量读取字节,放入到buf这个字节数组中 * 从第0个位置开始放,最多放buf.length个 * 返回的是读到的字节个数 */intj= 1; //一个字节数组读不完的情况,用while循环重复利用此数组直到读到文件末=-1intb= 0; while((b= in.read(buf, 0, buf.length))!=- 1){for( inti= 0;i《b;i++){ if((buf[i]& 0xff)《= 0xf){ //单位数前面补0System. out.print( “0”); } System. out.print(Integer.toHexString(buf[i]& 0xff)+ “ ”); if(j++% 10== 0){ System.out.println(); } } } in.close(); } }

  好了,我们用一个大于数组的文件来测试一下结果(太长,只截图末尾):

  java 字节流转字符流

  大家可以比较两者的不同,第二种优化后更适合日常的使用,因为无论文件大小我们都可以一次性直接读完。

  —————–FileOutputStream类的使用

  FileOutputStream类和FileInputStream类的使用相类似,它实现了向文件中写出btye数据的方法。里面的一些细节跟FileInputStream差不多的我就不提了,大家自己可以理解的。

  1.构造方法

  FileOutputStream类构造时根据不同的情况可以使用不同的方法构造,如:

  1//如果该文件不存在,则直接创建,如果存在,删除后创建2FileOutputStream out=newFileOutputStream( “demo/new1.txt”); //以路径名称构造1//如果该文件不存在,则直接创建,如果存在,在文件后追加内容2FileOutputStream out= newFileOutputStream(“demo/new1.txt”, true);

  更多内容可以查询API

  2.使用write()方法写入文件

  write()方法和read()相似,只能操作一个字节,即只能写入一个字节。例如:

  1out.wirte(‘A’) ;//写出了‘A’的低八位2int a= 10;//wirte只能写八位,那么写一个int需要写4次,每次八位3out.write(a》》》 24) ;4out.write(a》》》 16) ;5out.write(a》》》 8) ;6out.wirte(a) ;

  每次只写一个字节,显然是不效率的,OutputStream当然跟InputStream一样可以直接对byte数组操作。

  3.使用write(byte[] buf,int start, int size)方法写入文件

  意义:把byte[]数组从start位置到size位置结束长度的字节写入到文件中。

  语法格式和read相同,不多说明

  三、FileInputStream和FileOutputStream结合案例

  了解了InputStream和OutputStream的使用方法,这次结合两者来写一个复制文件的方法。

  publicstaticvoidcopyFile(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){thrownewIllegalArgumentException( “文件:”+srcFile+ “不存在”); } if(!srcFile.isFile()){thrownewIllegalArgumentException(srcFile+ “不是一个文件”); } FileInputStream in=newFileInputStream(srcFile); FileOutputStream out= newFileOutputStream(destFile);byte[] buf= newbyte[ 8* 1024]; intb; while((b= in.read(buf, 0, buf.length))!=- 1){out.write(buf, 0, b); out.flush(); //最好加上} in.close(); out.close(); }

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!