java 如何无损读取文本文件呢?
以下是有损的
@Deprecated
public static String getFullContent(File file, String charset) {
BufferedReader reader = null;
if (!file.exists()) {
System.out.println("getFullContent: file(" + file.getAbsolutePath()
+ ") does not exist.");
return null;
}
if (charset == null) {
charset = SystemHWUtil.CHARSET_ISO88591;
}
try {
reader = getBufferReaderFromFile(file, charset);
return getFullContent(reader);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} finally {
if (null != reader) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
public static BufferedReader getBufferReaderFromFile(File file,
String charset) throws FileNotFoundException {
InputStream ss = new FileInputStream(file);
InputStreamReader ireader;
BufferedReader reader = null;
try {
if (charset == null) {
ireader = new InputStreamReader(ss,
SystemHWUtil.CHARSET_ISO88591);
} else {
ireader = new InputStreamReader(ss, charset);
}
reader = new BufferedReader(ireader);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return reader;
}
/**
* have closed reader
*
* @param reader
* @return
*/
@Deprecated
public static String getFullContent(BufferedReader reader) {
StringBuilder sb = new StringBuilder();
String readedLine = null;
try {
while ((readedLine = reader.readLine()) != null) {
sb.append(readedLine);
sb.append(SystemHWUtil.CRLF);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
String content = sb.toString();
int length_CRLF = SystemHWUtil.CRLF.length();
if (content.length() <= length_CRLF) {
return content;
}
return content.substring(0, content.length() - length_CRLF);//
}
测试:
@Test
public void test_getFullContent(){
String filepath="D:\\bin\\config\\conf_passwd.properties";
try {
InputStream in =new FileInputStream(filepath);
System.out.print(FileUtils.getFullContent(filepath, "UTF-8"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
介绍三种无损读取的方式
方式一:使用InputStreamReader,指定编码
/***
* 指定字符编码,无损地读取文本文件.
*
* @param in
* : 输入流,会关闭
* @param charset
* : 字符编码
* @return
* @throws IOException
*/
public static String getFullContent3(InputStream in, String charset)
throws IOException {
StringBuffer sbuffer = new StringBuffer();
InputStreamReader inReader;
//设置字符编码
inReader = new InputStreamReader(in, charset);
char[] ch = new char[SystemHWUtil.BUFF_SIZE_1024];
int readCount = 0;
while ((readCount = inReader.read(ch)) != -1) {
sbuffer.append(ch, 0, readCount);
}
inReader.close();
in.close();
return sbuffer.toString();
}
测试:
@Test
public void test_getFullContent3(){
String filepath="D:\\bin\\config\\conf_passwd.properties";
try {
InputStream in =new FileInputStream(filepath);
System.out.print(FileUtils.getFullContent3(in, "UTF-8"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
方式二:先读取出字节数组,再使用String的构造方法
public static String getFullContent4(InputStream in, String charset) throws IOException{
byte[]bytes=FileUtils.readBytes3(in);
return new String(bytes,charset);
}
/***
* Has been tested
*
* @param in
* @return
* @throws IOException
*/
public static byte[] readBytes3(InputStream in) throws IOException {
BufferedInputStream bufin = new BufferedInputStream(in);
int buffSize = BUFFSIZE_1024;
ByteArrayOutputStream out = new ByteArrayOutputStream(buffSize);
// System.out.println("Available bytes:" + in.available());
byte[] temp = new byte[buffSize];
int size = 0;
while ((size = bufin.read(temp)) != -1) {
out.write(temp, 0, size);
}
bufin.close();
in.close();
byte[] content = out.toByteArray();
out.flush();
out.close();
return content;
}
方式三:使用System.arraycopy,所以效率不高,因为有拷贝操作(不推荐)
public static String getFullContent2(InputStream in, String charset)
throws IOException {
int step = BUFFSIZE_1024;
BufferedInputStream bis = new BufferedInputStream(in);
// Data's byte array
byte[] receData = new byte[step];
// data length read from the stream
int readLength = 0;
// data Array offset
int offset = 0;
// Data array length
int byteLength = step;
while ((readLength = bis.read(receData, offset, byteLength - offset)) != -1) {
// Calculate the current length of the data
offset += readLength;
// Determine whether you need to copy data , when the remaining
// space is less than step / 2, copy the data
if (byteLength - offset <= step / 2) {
byte[] tempData = new byte[receData.length + step];
System.arraycopy(receData, 0, tempData, 0, offset);
receData = tempData;
byteLength = receData.length;
}
}
return new String(receData, 0, offset, charset);
}
总结:推荐使用方式一和方式二
相关方法见附件中com.io.hw.file.util.FileUtils类