All Downloads are FREE. Search and download functionalities are using the official Maven repository.

top.hmtools.io.NioFileTools Maven / Gradle / Ivy

There is a newer version: 0.0.4-beta
Show newest version
package top.hmtools.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.ArrayList;
import java.util.List;

import top.hmtools.base.StringTools;

/**
 * 通过NIO读写文件
 * @author Hybomyth
 * 创建日期:2016-12-11下午8:56:27
 */
public class NioFileTools {
	
	/**
	 * nio基于缓冲区读取指定路径的一个文件
	 * 
可用于读取大文件,在硬件配置足够的情况下 * @param file * @return */ public static byte[] readOneFileToByte(File file){ String pathname = file.getAbsolutePath(); return readOneFileToByte(pathname); } /** * nio基于缓冲区读取指定路径的一个文件 *
可用于读取大文件,在硬件配置足够的情况下 * @param pathname 文件所在路径 * @return 字节数组 */ public static byte[] readOneFileToByte(String pathname){ FileInputStream fin = null; //文件输入流 byte[] result = new byte[0]; try{ fin = new FileInputStream(new File(pathname)); FileChannel channel = fin.getChannel(); int capacity = 1*1024*1024;// 缓冲区大小,单位:字节 ByteBuffer bf = ByteBuffer.allocate(capacity);//初始化字节缓冲区 int length = -1;//从文件读取、当次的数据长度 while ((length = channel.read(bf)) != -1) { System.out.println("本次读取数据长度 length:"+length); byte[] bytes = bf.array(); if(result.length == 0){ //首次读取 文件内容时,初始化结果集,长度为本次读取文件内容的长度,因为文件内容大小可能会小于缓冲区的容量大小 result = new byte[length]; //将缓冲区的内容复制到结果集指定内存区域 System.arraycopy(bytes, 0, result, 0, length); }else{ //再次读取文件后续内容时,先初始化一个临时字节数组,用于合并之前若干次已读取数据及本次读取的数据 byte[] tmp = new byte[result.length+length]; //将之前几次的数据写入临时字节数组 System.arraycopy(result, 0, tmp, 0, result.length); //将本次读取的数据写入临时字节数组 System.arraycopy(bytes, 0, tmp, result.length, length); //重新给结果字节数组赋值 result = tmp; } bf.clear(); //注意,读取后,将位置置为0,将limit置为容量, 以备下次读入到字节缓冲中,从0开始存储 } channel.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fin != null) { try { fin.close(); } catch (IOException e) { e.printStackTrace(); } } } return result; } /** * 读取一个文件内容,并转换为字符串格式 * @param pathname * @return */ public static String readFileToString(String pathname,String charsetName){ //读取文件内容 byte[] bytesFile = readOneFileToByte(pathname); int sourceLen = bytesFile.length; // System.out.println(bytesFile[0]); // System.out.println(bytesFile[1]); // System.out.println(bytesFile[2]); //处理编码 ByteBuffer buffer = ByteBuffer.allocate(sourceLen); buffer.put(bytesFile); CharBuffer charBuffer = CharBuffer.allocate(sourceLen); Charset charset = Charset.forName(charsetName); CharsetDecoder decoder = charset.newDecoder(); buffer.flip(); decoder.decode(buffer, charBuffer, false); charBuffer.flip(); //将数据转换成字符串 // StringBuffer result = new StringBuffer(); // while(charBuffer.hasRemaining()){ // result.append(charBuffer.get()); // } // result.append(""); return String.valueOf(charBuffer.array()); } /** * 读取多个文件 到 列表 * @param pathnames * @return */ public static List readSomeFile(List pathnames){ List result = new ArrayList(); try { for(String pathname:pathnames){ byte[] byteTmp = readOneFileToByte(pathname); result.add(byteTmp); } } catch (Exception e) { e.printStackTrace(); } return result; } /** * 读取多个文件 到 字符串列表 * @param pathnames * @param charsetName * @return */ public static List readSomeFileToStrs(List pathnames,String charsetName){ List result = new ArrayList(); try { for(String pathname:pathnames){ String byteTmp = readFileToString(pathname, charsetName); result.add(byteTmp); } } catch (Exception e) { e.printStackTrace(); } return result; } /** * 读取多个文件,并合并成一条字符串 * @param pathnames 读取的源文件集合 * @param charsetName 字符编码名称 * @param linkChar 多文件合并的连接符号,缺省为“”空字符串 * @return */ public static String readSomeFileToStr(List pathnames,String charsetName,String linkChar){ StringBuffer result = new StringBuffer(); if(StringTools.isBlank(linkChar)){ linkChar=""; } try { for(String pathname:pathnames){ String byteTmp = readFileToString(pathname, charsetName); result.append(byteTmp); } } catch (Exception e) { e.printStackTrace(); } return result.toString(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy