top.hmtools.io.NioFileTools Maven / Gradle / Ivy
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();
}
}