java 流(二)

来源:互联网 发布:对于网络诈骗如何处理 编辑:程序博客网 时间:2024/06/08 14:09
1、字符流
    之前讲过字节流,字节流指的是数据在传输的时候是以字节的形式传输的,而字符流是以字符(双字节)的形式传输的。字符流和字节
    流的原理与使用方式都是差不多的,只是底层的读取和传输单位不一样。
2、各种字符流
    2.1 输入字符流(各种Reader)
        
            从上面的图中可以看出,和字节流一样,所有的字符流也有一个基类,就是Reader,Reader也提供了一个read方法,不过每一
            次读的是char类型。
            同样以读取文件为例,来看一下各种Reader的使用
            以Reader来读取文件:
public static void main(String args[]) {
        File file = new File("C:\\Users\\Administrator\\Desktop\\test.txt");
        if(!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        Reader reader = null ;
        try {
            reader = new FileReader(file);
            char[] chars = new char[1024];//定义一个够长的字符数组来保存读入的数据
            int length = reader.read(chars);//将文件中的数据存到chars里面,返回读取到的字符数
            for(int i=0;i<length;i++){
                System.out.println(chars[i]);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
            以FileReader来读取文件(和Reader没什么不同):
try {
            reader = new FileReader(file);
            char[] chars = new char[1024];//定义一个够长的字符数组来保存读入的数据
            int length = reader.read(chars);//将文件中的数据存到chars里面,返回读取到的字符数
            for(int i=0;i<length;i++){
                System.out.println(chars[i]);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
            以BufferedReader来读取,在这个Reader里面提供了以字符串形式读取数据
BufferedReader reader = null;
  try {
   reader = new BufferedReader(new FileReader(file));
   System.out.println(reader.readLine());
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    reader.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
        以InputStreamReader来读取数据,这种方式是将字节流转换成字符流,而且可以控制转换时的字符编码:
        (编码的不同会影响中文的解析,但是并不会影响引文和数字等的解析)
InputStreamReader inputStreamReader = null ;
        try {
            inputStreamReader = new InputStreamReader(new FileInputStream(file),"gbk");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            System.out.println(bufferedReader.readLine());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        2.3 各种Writer
            Writer的使用可以参考Reader的使用
        2.4 BufferWriter和BufferOutputStream的比较
            我使用两个文件,来测试两者的写入效率。
File file = new File("C:\\Users\\Administrator\\Desktop\\test.txt");
        File file1 = new File("C:\\Users\\Administrator\\Desktop\\test1.txt");
  if (!file.exists()) {
   try {
    file.createNewFile();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
        if(!file1.exists()){
            try {
                file1.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        BufferedWriter bufferedWriter = null ;
        BufferedOutputStream bufferedOutputStream = null ;
        try {
            byte[] bytes = new byte[1000*1000*500];
            for(int i=0;i<bytes.length;i++){
                bytes[i] = 12 ;
            }
            char[] chars = new char[bytes.length/2];
            for(int i=0;i<chars.length;i++){
                chars[i] = 'a' ;
            }
            long start = System.currentTimeMillis();
            bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file));
            bufferedOutputStream.write(bytes);
            bufferedOutputStream.flush();
            long end = System.currentTimeMillis();
            System.out.println(end-start);
            bufferedWriter = new BufferedWriter(new FileWriter(file1));
            start = System.currentTimeMillis();
            bufferedWriter.write(chars);
            bufferedWriter.flush();
            end = System.currentTimeMillis();
            System.out.println(end-start);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
            测试结果显示,当写入数据小时,使用BufferOutStream比使用BufferWriter要快很多,但是当写入数据越来越大是,
            BufferWriter变得越来越有优势。
            


            


























0 0
原创粉丝点击