基本说明
PS.
仅是个人学习封装,正式环境建议使用 org apache commons 库,更通用有效
- 文件操作就是对流的操作,文件的读取和写入,对应着输入流和输出流
- 输出流将系统的数据输出到文件中
- 输入流将文件的书数据输入到系统中
这些数据传输过程中实际上是二进制的存在。读的时候,通常使用byte数组,或char数组保存。最后将这
两种基本数据类型数组转成字符串。
读取的基本流程:
按字符读取(InputStreamReader,字符输入流)|||
—|—
InputStream >>| InputStreamReader >>| BufferedReader
字节输入流 | 字符输入流 | 缓冲字符输入流
按字符读取,对中文等支持良好。普通文件,正常情况下基本不会使用。
读取时使用 char[] 数组缓存。
按字节读取 | |
InputStream >> | BufferInputStream |
字节输入流 | 缓冲字节输入流 |
读取时,使用byte[] 数组缓存。
写入的基本流程:
按字符写入(OutputStreamReader,字符输出流)|||
—|—
OutputStream >>| OutputStreamReader >>| BufferedWriter
字节输出流 | 字符输出流 | 缓冲字符输出流
按字符写入,对中文等支持良好。普通文件,正常情况下基本不会使用。
按字节读取 | |
OutputStream >> | BufferOutputStream |
字节输出流 | 缓冲字节输出流 |
写入文件时,java直接提供了写入String,Byte[],Char[] 的方法输出流直接调用即可。
代码相关
文件读取核心的代码围绕流操作书写,返回基本的数据(byte[] ,char[]),其他数据据此扩充而来。
读取关键代码:
/**
* 以字节流的方式读取到字符串。
* @param is 输入流
* @return 字节数组
*/
public static byte[] readBytes(InputStream is) {
byte[] bytes = null;
try {
BufferedInputStream bis = new BufferedInputStream(is);
byte[] cbuf = new byte[SIZE];
int len;
ByteArrayOutputStream outWriter = new ByteArrayOutputStream();
while ((len = bis.read(cbuf))!= -1) {
outWriter.write(cbuf, 0, len);
}
outWriter.flush();
bis.close();
is.close();
bytes = outWriter.toByteArray();
outWriter.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bytes;
}
/**
* 以字符流的方式读取到字符串。
* @param is 输入流
* @param charsetName 编码
* @return 字符数组
*/
public static char[] readChars(InputStream is,String charsetName) {
char[] chars = null;
try {
InputStreamReader isr = null;
if (charsetName == null) {
isr = new InputStreamReader(is);
}else {
isr = new InputStreamReader(is, charsetName);
}
BufferedReader br = new BufferedReader(isr);
char[] cbuf = new char[SIZE];
int len;
CharArrayWriter outWriter = new CharArrayWriter();
while ((len = br.read(cbuf))!= -1) {
outWriter.write(cbuf, 0, len);
}
outWriter.flush();
br.close();
isr.close();
is.close();
chars = outWriter.toCharArray();
outWriter.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return chars;
}
写入关键代码:
/**
* 字符输出流输出字符串
* @param os 输出流
* @param text 字符串
* @param off 起始下标
* @param lenght 长度
* @param charsetName 编码
*/
public static void writeString(OutputStream os,String text,int off,int lenght,String charsetName) {
try {
OutputStreamWriter osw = null;
if (charsetName == null) {
osw = new OutputStreamWriter(os);
}else {
osw = new OutputStreamWriter(os, charsetName);
}
BufferedWriter bw = new BufferedWriter(osw);
bw.write(text, off, lenght);
bw.flush();
bw.close();
osw.close();
os.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 通过字符输出流输出chars
* @param os 输出流
* @param text 字节数组
* @param off 数组起始下标
* @param lenght 长度
* @param charsetName 编码方式
*/
public static void writeChars(OutputStream os,char[] text,int off,int lenght ,String charsetName) {
try {
OutputStreamWriter osw = null;
if (charsetName == null) {
osw = new OutputStreamWriter(os);
}else {
osw = new OutputStreamWriter(os, charsetName);
}
BufferedWriter bw = new BufferedWriter(osw);
bw.write(text,off,lenght);
bw.flush();
bw.close();
osw.close();
os.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 通过字节输出流输出bytes
* @param os 输出流
* @param text 字节数组
* @param off 数组起始下标
* @param lenght 长度
*/
public static void writeBytes(OutputStream os,byte[] text,int off,int lenght) {
try {
BufferedOutputStream bos = new BufferedOutputStream(os);
bos.write(text,off,lenght);
bos.flush();
bos.close();
os.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
FileUtil全部代码:
package com.lu.jdog.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.CharArrayWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
public class FileUtil {
private static final int SIZE = 1024 * 8;
private FileUtil() throws Exception {
throw new Exception("Cannot be instantiated");
}
/**
* 以字节流的方式读取到字符串。
*
* @param is 输入流
* @return 字符串
*/
public static String readBytesToString(InputStream is) {
return new String(readBytes(is));
}
/**
* 以字节流的方式读取到字符串。
*
* @param is 输入流
* @param charsetName 字符集
* @return 字符串
*/
public static String readBytesToString(InputStream is, String charsetName) {
try {
return new String(readBytes(is), charsetName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* 以字节流的方式从文件中读取字符串
*
* @param file 文件
* @param charsetName 字符集
* @return 字符串
*/
public static String readBytesToString(File file, String charsetName) {
try {
return new String(readBytes(file), charsetName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* 以字节流的方式从文件中读取字符串。
*
* @param file 文件
* @return 字符串
*/
public static String readBytesToString(File file) {
return new String(readBytes(file));
}
// ---------------------readBytesToString 完成。分割线----------------------
/**
* 以字符流的方式读取到字符串。
*
* @param file 文件
* @param charset 字符集
* @return 字符串
*/
public static String readCharsToString(File file) {
try {
return readCharsToString(new FileInputStream(file), null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* 以字节流的方式读取到字符串。
*
* @param file 文件
* @param charset 字符集
* @return 字符串
*/
public static String readCharsToString(File file, String charset) {
try {
return readCharsToString(new FileInputStream(file), charset);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* 以字符流的方式读取到字符串。默认编码
*
* @param is 输入流
* @return 字符串
*/
public static String readCharsToString(InputStream is) {
return new String(readChars(is, null));
}
/**
* 以字符流的方式读取到字符串。
*
* @param is 输入流
* @param charsetName 编码
* @return 字符串
*/
public static String readCharsToString(InputStream is, String charsetName) {
return new String(readChars(is, charsetName));
}
// ---------------readCharsToString 完成。分割线-----------------------
/**
* 以字节流的方式读取到字符串。
*
* @param file 文件
* @return 字节数组
*/
public static byte[] readBytes(File file) {
try {
return readBytes(new FileInputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* 以字节流的方式读取到字符串。
*
* @param is 输入流
* @return 字节数组
*/
public static byte[] readBytes(InputStream is) {
byte[] bytes = null;
try {
BufferedInputStream bis = new BufferedInputStream(is);
byte[] cbuf = new byte[SIZE];
int len;
ByteArrayOutputStream outWriter = new ByteArrayOutputStream();
while ((len = bis.read(cbuf)) != -1) {
outWriter.write(cbuf, 0, len);
}
outWriter.flush();
bis.close();
is.close();
bytes = outWriter.toByteArray();
outWriter.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bytes;
}
/**
* 以字符流的方式读取到字符串。
*
* @param file 文件
* @param charsetName 编码
* @return 字符数组
*/
public static char[] readChars(File file, String charsetName) {
try {
return readChars(new FileInputStream(file), charsetName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* 以字符流的方式读取到字符串。
*
* @param is 输入流
* @param charsetName 编码
* @return 字符数组
*/
public static char[] readChars(InputStream is, String charsetName) {
char[] chars = null;
try {
InputStreamReader isr = null;
if (charsetName == null) {
isr = new InputStreamReader(is);
} else {
isr = new InputStreamReader(is, charsetName);
}
BufferedReader br = new BufferedReader(isr);
char[] cbuf = new char[SIZE];
int len;
CharArrayWriter outWriter = new CharArrayWriter();
while ((len = br.read(cbuf)) != -1) {
outWriter.write(cbuf, 0, len);
}
outWriter.flush();
br.close();
isr.close();
is.close();
chars = outWriter.toCharArray();
outWriter.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return chars;
}
// -----------------------readxxx 完成。分割线-----------------------
// -----------------------read 部分完成。接下来是write的部分------------
/**
* 通过字节输出流输出bytes
*
* @param os 输出流
* @param text 字节数组
*/
public static void writeBytes(OutputStream os, byte[] text) {
writeBytes(os, text, 0, text.length);
}
/**
* 通过字节输出流输出bytes
*
* @param os 输出流
* @param text 字节数组
* @param off 数组起始下标
* @param lenght 长度
*/
public static void writeBytes(OutputStream os, byte[] text, int off, int lenght) {
try {
BufferedOutputStream bos = new BufferedOutputStream(os);
bos.write(text, off, lenght);
bos.flush();
bos.close();
os.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// ----------------------writeByte 完成。分割------------------------
/**
* 通过字符输出流输出chars
*
* @param os 输出流
* @param text 字节数组
* @param charsetName 编码方式
*/
public static void writeChars(OutputStream os, char[] text, String charsetName) {
writeChars(os, text, 0, text.length, charsetName);
}
/**
* 通过字符输出流输出chars
*
* @param os 输出流
* @param text 字节数组
* @param off 数组起始下标
* @param lenght 长度
* @param charsetName 编码方式
*/
public static void writeChars(OutputStream os, char[] text, int off, int lenght, String charsetName) {
try {
OutputStreamWriter osw = null;
if (charsetName == null) {
osw = new OutputStreamWriter(os);
} else {
osw = new OutputStreamWriter(os, charsetName);
}
BufferedWriter bw = new BufferedWriter(osw);
bw.write(text, off, lenght);
bw.flush();
bw.close();
osw.close();
os.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// ----------------------writeChars 完成。分割------------------------
/**
* 将字符串以默认编码写入文件
*
* @param file 文件
* @param text 字符串
*/
public static void writeString(File file, boolean append, String text) {
writeString(file, append, text, 0, text.length(), null);
}
/**
* 将字符串写入文件
*
* @param file 文件
* @param append 是否追加
* @param text 字符串
* @param off 起始下标
* @param lenght 长度
* @param charsetName 编码名称
*/
public static void writeString(File file, boolean append, String text, int off, int lenght, String charsetName) {
try {
writeString(new FileOutputStream(file, append), text, off, lenght, charsetName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
* 将字符串以默认编码写入文件
*
* @param file 文件
* @param text 字符串
*/
public static void writeString(File file, String text) {
writeString(file, false, text, 0, text.length(), null);
}
/**
* 将字符串写入文件(默认覆盖)
*
* @param file 文件
* @param append 是否追加
* @param text 字符串
* @param charsetName 编码名称
*/
public static void writeString(File file, boolean append, String text, String charsetName) {
writeString(file, append, text, 0, text.length(), charsetName);
}
/**
* 将字符串写入文件(默认覆盖)
*
* @param file 文件
* @param text 字符串
* @param charsetName 编码名称
*/
public static void writeString(File file, String text, String charsetName) {
writeString(file, false, text, 0, text.length(), charsetName);
}
/**
* 字符输出流输出字符串
*
* @param os 输出流
* @param text 字符串
* @param charsetName 编码
*/
public static void writeString(OutputStream os, String text, String charsetName) {
writeString(os, text, 0, text.length(), charsetName);
}
/**
* 字符输出流输出字符串
*
* @param os 输出流
* @param text 字符串
* @param off 起始下标
* @param lenght 长度
* @param charsetName 编码
*/
public static void writeString(OutputStream os, String text, int off, int lenght, String charsetName) {
try {
OutputStreamWriter osw = null;
if (charsetName == null) {
osw = new OutputStreamWriter(os);
} else {
osw = new OutputStreamWriter(os, charsetName);
}
BufferedWriter bw = new BufferedWriter(osw);
bw.write(text, off, lenght);
bw.flush();
bw.close();
osw.close();
os.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
此次封装基本上围绕流来进行操作,没有做其他处理,也没有过多依赖,因此,理论上健壮性、适用性是很强的。也适用Android或其他平台。虽然做了不少测试,在window ,Android中运行良好。
但是上面写的方法非常繁多,而且未来预计还会增添复制,删除等方法。因此这并不是全能的汤药。
——end