java - 流

 

字节流

描述

字符流 

描述

输入流

InputStream

 

Reader

 

FileInputStream

从文件中读取原始字节流,如图像

FileReader

从文件中读取字符流

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

输出流

OutputStream

 

Writer

 

FileOutputStream

向文件中写入原始字节流,如图像

FileWriter

向文件中写入字符流

     BufferedWriter  将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入

 

 

package com.sungoal.webmanagement.log;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

/** 
 * @Package com.sungoal.webmanagement.log

 * @ClassName: Testdecode

 * @Description: TODO(这里用一句话描述这个类的作用)

 * @author andy

 * @date 2013-10-22 下午05:57:02

 */
public class Testdecode {
    
    static String fileName = "D:\\logs\\log_dir1\\2013102210.txt";
    /**
     * 
     * @Title: simpleJudge
    
     * @Description: TODO(单一判断文件是否是uft-8编码)
     */
    public static void simpleJudge(){
        File file = new File(fileName);
         byte[] b = new byte[3];
        try {
            InputStream ios = new java.io.FileInputStream(file);
            ios.read(b);
            ios.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (b[0] == -17 && b[1] == -69 && b[2] == -65)
            System.out.println(file.getName() + ":编码为UTF-8");
        else
            System.out.println(file.getName() + ":可能是GBK,也可能是其他编码。");
    }
    /**
     * 
     * @Title: codeString
    
     * @Description: TODO(返回文件的编码)
    
     * @param fileName
     * @return
     * @throws Exception String
     */
    public static String codeString(String fileName) throws Exception{  
        BufferedInputStream bin = new BufferedInputStream(  
        new FileInputStream(fileName));  
        int p = (bin.read() << 8) + bin.read();  
        String code = null;  
        switch (p) {  
            case 0xefbb:  
                code = "UTF-8";  
                break;  
            case 0xfffe:  
                code = "Unicode";  
                break;  
            case 0xfeff:  
                code = "UTF-16BE";  
                break;  
            default:  
                code = "GBK";  
        }  
          
        return code;  
    }  
    
    /**
     * @return 
     * @Title: readFile

     * @Description: TODO(以文件的存储编码来读取文件,防止读取出来为乱码)
     void
     */
    private static void readFile() {
        //code为上面方法里返回的编码方式  
        InputStreamReader inputStreamReader = null;
        try {
            FileInputStream fInputStream = new FileInputStream("D:\\logs\\log_dir1\\2013102210.txt");  
            inputStreamReader = new InputStreamReader(fInputStream, codeString(fileName));
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        } catch (Exception e1) {
            e1.printStackTrace();
        }  
        BufferedReader in = new BufferedReader(inputStreamReader);  
          
        StringBuffer sBuffer = new StringBuffer();
        try {
            String strTmp = in.readLine();
            //按行读取  
            while (strTmp != null) {  
                  sBuffer.append(strTmp + "/n");  
                  strTmp = in.readLine();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

         System.out.println(sBuffer.toString()); 

    }
    
    public static void main(String[] args) {
        readFile();    
    }
}
View Code

 

 

 

 

 

任何数据的读写都是01010101

java以unicode编码,一个字符两个字节

以stream结尾的都是字节流

方向不同(单位为8bit)分为: 字节输入流(InputStream)和字节输出流(OutputStream)

数据单位(单位为16bit)不同:字符输入流(Reader)和字符输出流(Writer)

功能不同    :   节点流(管道直接套接在数据源上)和处理流(套接在其他管道之上的流)

flush先把缓冲区的数据写出来,然后close


bufferedreader readline,提高读取效率
bufferedwriter newline


转换流 : 字节流转换成字符流 如 outputstreamwriter 将输出的字节流转换成输出的字符流

阻塞

数据流  : datainputstream,bytearrayoutputstream 现在读写英文(字节流)中文(字符流)都没问题,但是读写double,和long等类型的,没有此类对应的接口,当然你可以通过String.valueOf(参数).getBytes() ,再一个字节一个字节的读写,
第一麻烦
第二 列举一个long类型的 23223233232323243432323322,本来long类型在内存中只占8个字节,现在内存中占了几十个字节了
所以数据流应运而生了


print流 : 不会抛异常,不用try catch,会自动flush
object流: objectoutputstream
           实现Serializable接口(标记性接口,空实现),jdk帮你实现对象的实例化
           transient 修饰的成员变量不予考虑,不被序列化
           序列化把一个object转换成字节流直接写到文件中
           Externalizable(可外部化),自己可以控制如何实现序列化

posted on 2012-04-29 15:19  lovebeauty  阅读(361)  评论(0编辑  收藏  举报

导航