

package com.fr.tx.common.util;


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;


public class FileUtil {

    /**
     * 文件写入
     * @param writer FileWriter
     * @param content 文件内容
     */
    public static void append(FileWriter writer, String content) {
        try {
            //打开一个写文件器，构造函数中的第二个参数true表示以追加形式写文件
            writer.write(content);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    
    /**
     * 文件读取
     * @param reader FileReader
     * @param content 文件内容
     */
    public static void readFileByLine(FileReader reader, String content) {

        // BufferedReader:从字符输入流中读取文本，缓冲各个字符，从而实现字符、数组和行的高效读取。  
        BufferedReader bufReader = null;  
        try {  
            // FileReader:用来读取字符文件的便捷类。  
            bufReader = new BufferedReader(reader);  

            String temp = null;  
            while ((temp = bufReader.readLine()) != null) {  
                System.out.println("READ:" + temp + "\n");
            }  
        } catch (Exception e) {  
            e.getStackTrace();  
        } finally {  
            if (bufReader != null) {  
                try {  
                    bufReader.close();  
                } catch (IOException e) {  
                    e.getStackTrace();  
                }  
            }  
        }  
    }
    
    
    /**
     * 以字节为单位读取文件，常用于读二进制文件，如图片、声音、影像等文件。
     * @throws Exception 
     */
    public static List<String> readFileByBytes(String fileName, int len) throws Exception {
//        File file = new File(fileName);
        InputStream in = null;
        List<String> ret = new ArrayList<String>();
        try {
            in = new FileInputStream(fileName);
            int file_len = in.available();
            int read_len = 0;
            byte[] tempbytes;
            int byteread = 0;
            while (file_len > 0) {
                // 一次读取512字节
                if (file_len / 512 > 0) {
                    read_len = 512;
                } else {
                    // 不足512字节按实际长度读取
                    read_len = file_len % 512;
                }
                
                tempbytes = new byte[read_len];
                
                if ((byteread = in.read(tempbytes)) != -1) {
                    ret.add(ConvertUtil.bytesToHexString(tempbytes));
                }
                
                file_len -= read_len;
            }
        } catch (Exception e1) {
            throw e1;
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (final IOException e1) {
                }
            }
            
        }
        
        return ret;
    }
    
    /**
     * 显示输入流中还剩的字节数
     */
    private static void showAvailableBytes(InputStream in) {
        try {
            System.out.println("当前字节输入流中的字节数为:" + in.available());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
