字节流字符流中

Posted hackerfire

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节流字符流中相关的知识,希望对你有一定的参考价值。

  • 字节流的读取

 字节流主要是由字节组成,字符流是由字符组成,Java中字符由两个字节组成,字节流是最基本的,换句话说,字节流是字符流的底层!所有的InputStream和OutputStream的子类都是用于处理二进制数据,。

  • InputStream抽象类

  此抽象类表示字节流的所有类的超类

常用方法:

abstract int  read();___从输入流中读取到数据的下一个字节。

int read(byte [ ] b );___从输出流中读取一定数量的字节,并将其存入缓冲区数组 b 中。

int read(byte [ ] b,int off,int len);___从数据流中最多len个数据字节读入byte数组中。

void close();___关闭该资源、否则会一直被占用。

  FileStream 子类

  直接插在文件上,直接读取文件数据!

创建对象:

  FileInputStream(File file)

    通过打开一个实际的文件链接来创建一个FileInputStream,该文件通过文件系统中的File 对象 file指定的。

  FileInputStream(String path)

    通过打开一个实际文件的链接来创建一个FileInputStream,该文件通过系统文件中的路径名path指定的。

  BufferedInputStream 子类

BufferedInputStream 为另一个输入流添加一些功能、即缓冲区输入以及支持mark和reset 方法的能力、在创建BufferedInputStream时、会创建一个内部的缓冲区数组(默认8k大小)在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。

  创建对象

  BufferedInputStream (InputStream in)

创建一个BufferedInputStream并保存其参数、即输入流in ,便于将来使用。

  字符流的读取

常用于处理纯文本文件的数据

  Reader 抽象类

用于读取字符流的抽象类

    常用的方法

int read()

          读取单个字符。

int read(char[] cbuf)

          将字符读入数组。

abstract  int read(char[] cbuf, int off, int len)

          将字符读入数组的某一部分。

 int read(CharBuffer target)

          试图将字符读入指定的字符缓冲区。

abstract  void close()

          关闭该流并释放与之关联的所有资源。

  FileReader 子类

用来读取字符文件便捷类、它的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的、要自己指定这些值、可以 先在FileInputStream上构造一个InputStreamReader。

  创建对象

FileReader(String fileName)

在给定从中读取数据的文件名的情况下创建一个新的FileReader。

FileReader(File file)

给定从中读取数据的File 情况下新建一个FileReader。

  BufferedReader 子类

可以从字符流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

可以指定缓冲区的大小、或者可以使用默认的大小、大多情况下默认值就足够大了!

  创建对象

BufferedReader(Reader in)

          创建一个使用默认大小输入缓冲区的缓冲字符输入流。

  

  InputStreamReader子类

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

 

  创建对象

InputStreamReader(InputStream in, String charsetName)

          创建使用指定字符集的 InputStreamReader。

InputStreamReader(InputStream in)

          创建一个使用默认字符集的 InputStreamReader。

---------------------------下面看看代码的使用-------------------------字节流读取文件

//测试数据的读取:使用字节流

public class Test4_In {

    public static void main(String[] args) {

//     method();//字节流单字节读取过程

       method2();//字节流高效读取

    }

    //字节流高效读取

    private static void method2() {

       try {

           //1,创建高效读取对象

           InputStream in = new BufferedInputStream(new FileInputStream("D:\附件1--人事面试题30问.doc"));

          

           //2,开始读取

//         System.out.println(in.read());

//         System.out.println(in.read());

//         System.out.println(in.read());

//         System.out.println(in.read());

          

           long start = System.currentTimeMillis();

           int b ;//定义变量,记录读取到的数据

           while( ( b = in.read()  )    != -1   ) {

//            System.out.println(b);

           }

           start = System.currentTimeMillis()-start;

           System.out.println(start+"=====2");//3ms

           //3,释放资源

           in.close();

          

       } catch (Exception e) {

           e.printStackTrace();

       }

      

    }

    //字节流读取过程

    public static void method() {

       try {

           //1,创建字节流读取对象

           InputStream in = new FileInputStream(new File("D:\附件1.doc"));

           InputStream in2 = new FileInputStream("D:\附件1.doc");

          

           //2,开始读取数据

//         System.out.println(in.read());

//         System.out.println(in.read());

//         System.out.println(in.read());

//         System.out.println(in.read());//-1

//         System.out.println(in.read());//-1

//         System.out.println(in.read());//-1

          

           //循环结构:重复的读取数据

           long start = System.currentTimeMillis();

           int b ;//定义变量,记录读取到的数据

           while(  ( b = in.read() ) != -1   ) {

//            System.out.println(b);

           }

           start = System.currentTimeMillis()-start;

           System.out.println(start+"=====1");//115ms

          

           //3,释放资源

           in.close();

          

       } catch (IOException e) {

           e.printStackTrace();

       }

      

      

      

    }

   

   

}

 

 

*******************  字符流读取文件 *****************

 

  1 //测试数据的读取:使用字符流
  2 
  3 public class Test5_In2 {
  4 
  5     public static void main(String[] args) {
  6 
  7        method();// 字符流单字符读取
  8 
  9        method2();// 字符流高效读取
 10 
 11     }
 12 
 13  
 14 
 15     private static void method2() {
 16 
 17        try {
 18 
 19            // 1,创建高效读取的对象
 20 
 21            Reader in = new BufferedReader(new FileReader("D:\附件1.doc"));
 22 
 23  
 24 
 25            // 2,开始读取
 26 
 27           
 28 
 29            long time = System.currentTimeMillis();
 30 
 31           
 32 
 33            int b ;
 34 
 35            while(  ( b= in.read() )  != -1 ) {
 36 
 37 //            System.out.println(b);
 38 
 39            }
 40 
 41           
 42 
 43            time = System.currentTimeMillis()-time;
 44 
 45            System.out.println(time+"=========2");//4ms
 46 
 47           
 48 
 49            // 3,释放资源
 50 
 51            in.close();
 52 
 53           
 54 
 55        } catch (IOException e) {
 56 
 57            e.printStackTrace();
 58 
 59        }
 60 
 61     }
 62 
 63  
 64 
 65     private static void method() {
 66 
 67        try {
 68 
 69  
 70 
 71            // 1,创建字符流对象
 72 
 73            Reader in = new FileReader(new File("D:\附件1--人事面试题30问.doc"));
 74 
 75            Reader in2 = new FileReader("D:\附件1--人事面试题30问.doc");
 76 
 77  
 78 
 79            // 2,开始读取
 80 
 81 //         System.out.println(in.read());
 82 
 83 //         System.out.println(in.read());
 84 
 85 //         System.out.println(in.read());
 86 
 87 //         System.out.println(in.read());
 88 
 89 //         System.out.println(in.read());
 90 
 91  
 92 
 93            long time = System.currentTimeMillis();
 94 
 95  
 96 
 97            int b;// 定义变量,记录读取到的数据
 98 
 99            while ((b = in.read()) != -1) {
100 
101 //            System.out.println(b);
102 
103            }
104 
105           
106 
107            time = System.currentTimeMillis()-time;
108 
109            System.out.println(time+"=========1");//14ms
110 
111  
112 
113            // 3,释放资源
114 
115            in.close();
116 
117  
118 
119        } catch (Exception e) {
120 
121            e.printStackTrace();
122 
123         }
124 
125  
126 
127     }
128 
129  
130 
131 }

********待续........

以上是关于字节流字符流中的主要内容,如果未能解决你的问题,请参考以下文章

字节流 字符流 输入流 输出流

字节流 字符流 输入流 输出流

字节流和字符流

字符流字节流节点流处理流详释

字节流字符流中

字符流和字节流的区别