一、单独的读文件时可以按字节流来读,也可以用字符流来读,这个看具体需求
1.Java字符流是处理字符(Char)对象用的,字节流是处理字节(Byte)对象用的。处理的目标对象不同,处理方法也就不一样了。
2.字符流处理的基本单位是字符(Java中的字符是16位的),输入流以Reader为基础,输出流以Writer为基础;
3.字节流的基本单位是字节(Java中的字节是8位的),输入流以 InputStream为基础,输出流以 OutputStream为基础;
4.字符流在输入时可以按字符读取,也可以按行读取,会去掉回车换行,常用于读取字符数据;而字节流按字节读取,不作任何处 理,常用于读取二进制数据。
5.Java中的字符在内部都是使用Unicode进行表示的,因此,要正确读取字符数据,需要知道字符的编码字符集,字符流提供编码字符集的指定,如果不指定使用系统默认的方式对字符数据进行编码转换,这个编码字符集不正确,会造成读进来的地字符出现乱码。
6.字节流虽然是读取二进制数据用的,但也可以读取字符文件,按字节进行处理,读进来之后可以根据编码字符集进行转换,也可以变成字符串。
二、返回值可以为byte类型的数组,也可以为字符串String,或者StringBuffer.toString的都行
工具类代码部分:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
/**
* @作用: 文件处理类
* @作者: syp
* @时间: 2019-4-16 15:26:27
*/
public class FileTools {
private String fFname = null;
List<String> fileList = new ArrayList<String>();
public String getFileName(String cfgFilename) {
if (this.fFname == null) {
String str[] = cfgFilename.split("/");
String filename = str[str.length - 1];
this.fFname = filename;
}
return this.fFname;
}
// 写文件
public static int writeFile(String fileName, byte[] content) {
Log4jBean.logger.info("开始写文件:[" + fileName + "]");
File file = new File(fileName);
File fileparent = file.getParentFile();
if (!fileparent.exists()) {
Log4jBean.logger.info("文件夹不存在,创建该目录");
fileparent.mkdirs();
}
FileOutputStream os = null;
try {
os = new FileOutputStream(fileName);
os.write(content);
os.flush();
} catch (Exception e) {
Log4jBean.logger.info("写文件:[" + fileName + "]异常,异常信息为:["
+ e.getMessage() + "]");
return -1;
} finally {
try {
if (null != os)
os.close();
} catch (IOException e) {
}
}
os = null;
Log4jBean.logger.info("写文件:[" + fileName + "]完成!");
return 0;
}
// 读文件
public static byte[] readFile(String fileName) {
FileInputStream fis = null;
Log4jBean.logger.info("开始读文件:[" + fileName + "]");
byte[] buffer = null;
try {
fis = new FileInputStream(fileName);
buffer = new byte[fis.available()];
fis.read(buffer);
} catch (Exception e) {
Log4jBean.logger.info("读文件[" + fileName + "]失败 " + e.toString());
} finally {
try {
if (null != fis)
fis.close();
} catch (IOException e) {
}
}
fis = null;
Log4jBean.logger.info("读文件[" + fileName + "]成功");
Log4jBean.logger.info("文件[" + fileName + "]转为字节数组");
return buffer;
}
/*
* 读取文件(可设置编码方式)
* @return 文件内容
*/
public String ReadFileContent(String filePath){
File file = new File(filePath);
// BufferedReader br = new BufferedReader(new FileReader(file));
BufferedReader br=null;
try {
br = new BufferedReader(new InputStreamReader(
new FileInputStream(file), "gbk"));
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String str = null;
StringBuffer Buff = new StringBuffer();
try {
while ((str = br.readLine()) != null) {
Buff.append(str + "\r\n");
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return Buff.toString();
}
public List<String> getFiles(String filePath) {
Log4jBean.logger.info("开始遍历["+filePath+"]目录下的文件");
//定义存放文件名的list集合
//文件主目录
File root = new File(filePath);
//读出目录下所有文件
File[] files = root.listFiles();
if(files==null||files.length==0)
{
Log4jBean.logger.info("["+filePath+"]目录下无文件,不继续后续操作");
return null;
}
//开始遍历文件并判断是否为文件目录
for (File file : files) {
// 判断是否文件夹
if (file.isDirectory()) {
// 递归调用
getFiles(file.getAbsolutePath());
} else {
// 否则,放入文件集合
fileList.add(filePath+File.separator+file.getName());
System.out.println(file.getName());
}
}
Log4jBean.logger.info("["+filePath+"]目录遍历完成,里面包括["+fileList.size()+"]个文件");
return fileList;
}
public static void main(String [] agrs)
{
}
}