zoukankan      html  css  js  c++  java
  • javaIO流小结(1)

    UTF-8的字节占多少个字节?

    常用中文字符用utf-8编码占用3个字节(大约2万多字),超大字符集中要占4个字节.在内存中是2个字节,真正写到硬盘上面的是3个字节。
    GBK、GB2312汉字占2个字节,用iso8859-1无法表示汉字,只能转为问号。

    字节流 字符流;

    IO流主要是用于获取在硬盘、内存、键盘中数据;根据处理的数据的数据类型不同可以分为(1)字节流和字符流;

    根据流向的不同可以分为:(2)输入流和输出流

    根据作用的不同可以分为:(3)节点流和处理流.

    它们都有各自的抽象父类:InputStream 和OutputStream;

    字符流家族:

    InputStream家族

                                   |- FileInputStream

                                   |-FilterInputStream

                                                  |-BufferInputStream

                                                  |-DatainputStream

                                   |-ByteArrayInputStream

                                   |- ObjectInputStream

                                   |- SequenceInputSteam

                                   |-pipeInputStream

                                   |-StringInputStream

     

    OutPutStream家族

                                   |-FileOutStream

                                   |-FilterOutStream

                                                  |-BufferedOutputStream

                                                  |-DatainputStream

                                                  |-PrintStream

                                   |-ByteArrayOutputStream

                                   |-ObjectOutPutSteam

                                   |-SequenceOutputStream 

                                   |-PipeoutputStream

                                   |-StringOutPutStream

    上面的族谱可以清楚的看到,InputSteam 是所有输入字节流的抽象父类,OutputStream是所有输出字符流的抽象父类;

     

    ByteArrayInputSteram ,StringBufferInputSteram, FileInputSteram是三种基本的介质流,他们是分别从Byte,String ,File中读取数据.pipedinputStream是在其他线程的共用管道读取数据.

    那么同理的,ByteArrayOutputStream、StringBufferOutputSteramFileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和File中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据。

     

    字符流家族

    字符流以长度为16的char为单位,一般会用来读取文件.

    Reader家族

                           |-InputStreamReader

                                    |-FileReader

                           |-ObjectReader

                           |-CharArrayReader

                           |-BufferdReader

                           |-SequenceReader

                                |-PipedReader

                                |StringReader

    Writer家族

                            |-OutputStream

                                         |-FileWriter

                            |-CharArrayWriter

                            |-ObjectWriter

                            |-BufferedWriter

                                   |-SequenceWriter

                            |-PipedWriter

                            |-PrintWirter

                            |-StringWriter

     

    Reader是所有输入字符流抽象父类,Writer是所有输出字符流的抽象父类;

    CharReader、StringReader 是两种基本的介质流,它们分别将Char 数组、String中读取数据。PipedReader 是从与其它线程共用的管道中读取数据。

    InputStreamReader是一个连接字节流和字符流的桥梁,它会将字符流转变成字符流.。同理地;CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向Char 数组、String 中写入数据。PipedWriter 是向与其它线程共用的管道中写入数据。

     

    字节流和字符流区别:

    (1)      读取方式不一样,字节流是读一个字节返回一个字节;字符流是读1到N个字节返回1到N个字节;

    (2)     两者能够处理的数据类型不一样,字节流可以处理所有的类型的数据,MP3,MP4等等,但是字符流只能够处理字符数据。

    当需要读取文本文件时会优先考虑使用字符流,其他情况就要使用字节流。

    字节流和字符流的转换:

    字节流和字符流的转换达到什么效果,转换顾名思义就是字符流和字节流的相互转换以及编码.

    当需要字节和字符相互转换或者流的操作需要编码的时候,就需要用到转换流;

    例如

    InputStreamReader :把字节流转换成字符流;

    OutputStreamWriter : 把字符流转转换成字节流.

     

    	InputStreamReader isr = new InputStreamReader(new FileInputStream("e:/test.txt"),"UTF-8");
    
    	OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("e:/test.txt"),"UTF-8");
    

    处理流和节点流

     处理流是对一个流的连接和封装,实现数据的读写操作。

     

    读取文件的内容,字符流的输出

     

    /**
    		 * 字符流的写出
    		 */
    		try(
    			BufferedOutputStream os=new BufferedOutputStream(new FileOutputStream(new File("test.txt")))){
    			os.write("saysomething".getBytes());
    		}
    		 catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    

     字节流的读取:

    	public void fileread(){
    	/**
    	 * 字节流的读取
    	 */
    		
    		try(BufferedInputStream is=new BufferedInputStream(new FileInputStream(new File("text.txt")))){
    			byte[] buffer=new byte[1024];
    			int len;
    			
    			ByteArrayOutputStream bao=new ByteArrayOutputStream();
    			while((len=is.read(buffer))!=-1){
    				bao.write(buffer,0,len);
    			}
    			byte[] data=bao.toByteArray();
    			System.out.println(new String(data));
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    

     以上是先把读取到的内容先存放在一个ByteArrayOutputStream中,当读取完文件的内容之后,在一次性的读取ByteArrayOutputStream中的内容,这种做法可以避免因为byte[]的大小是奇数时可能导致存放中文出现乱码的情况.

     

     

    对于BufferedOutputStream

    BufferedOutputStream的数据成员is也是一个位数组,默认为512字节。

    当使用write()方法写入数据时实际上会先将数据写到is中,当is已满时才会实现给定的OutputStream对象的write()方法,将is数据写到目的地,而不是每次都对目的地作写入的动作。

     

    BufferedWriter和PrintWriter的区别

    .printWriter的print和println可以接受任意类型的参数,会自动添加换行,

    bufferedwriter的writer方法只能接受字符、字符数组和字符串,对于换行就要显性的调用newLine方法了。

    比如:

    OutputSteam能够直接的传给PrintWriter接受;

    PrintWriter pw=new PrintWriter(new BufferedoutputStreatmen(new FileOutPutStream(“abc.txt”)))
    
     
    
    ;PrintWriter pw=new PrintWriter(new BufferedWriter(new BufferedOutPutStreamWriter(xxxxx)))
    

    (1)Printwriter相对于用户友好,出现异常也不会抛异常,需要通过checkError来获取到一场;在构造方法这块相对强,传入指定的参数可以做到自动刷新缓存,并且能够使用不同平台的换行符。

    它的缺点就是它是无追加模式的,如果文件本身就有内容,那么它要写入文件的话就是要清掉文件的内容再写入。

    (2)BufferedWriter就可以实现自定义缓存的大小之余,也可以实现文件内容的追加。当设置append为true的时候它就会在文件的尾部进行追加内容。Append为false则会从第一行开始覆盖(重点!!)写入。

    (3)BufferedWriter和BufferOutputStream的默认buffer大小不一样 ,前者是8k chars,后者是8k bytes。

    Stream和writer的区别:一个是二进制数,一个是字符数据。

     

  • 相关阅读:
    Djnago中缓存配置(redis配置案例)
    HDU-4717 The Moving Points 三分
    HDU-4716 A Computer Graphics Problem 水题
    HDU-2686 Matrix 多进程DP
    [转]手动开平方的简易方法
    [转]树链剖分
    HUOJ-10857 最大的面积 凸包+DP
    Bnuoj-29359 Deal with numbers 线段树
    HDU-4283 You Are the One 区间DP
    BNUOJ-26586 Simon the Spider 最小生成树+枚举
  • 原文地址:https://www.cnblogs.com/Ansonrelovisa/p/6266522.html
Copyright © 2011-2022 走看看