鑑於你百度得到的寫入讀取文件的操作實在是雜亂無章,甚至還可能會導致內存泄漏的風險,爲了你的身體健康和人身安全着想,我特意爲了整理了讀寫文件操作大全(其實有點心虛)
唉,牛皮都吹了,那就上代碼吧
package com.flyaudio.flycodelibrary.utils;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;
/**
* @className FileIOUtils
* @createDate 2018/11/7 15:12
* @author xingyunye
* @email [email protected]
* @desc 文件IO工具
*
*/
public final class FileIOUtils {
/**
* 緩衝字節數
*/
private static int sBufferSize = 8192;
/**
* 防止實例化
*/
private FileIOUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* 從輸入流寫入到文件
*
* @param filePath 要寫入的文件路徑
* @param is 輸入流
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromIS(final String filePath, final InputStream is) {
return writeFileFromIS(getFileByPath(filePath), is, false);
}
/**
*從輸入流寫入到文件
*
* @param filePath 要寫入的文件路徑
* @param is 輸入流
* @param append True 爲追加寫入 false 爲覆蓋寫入
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromIS(final String filePath,
final InputStream is,
final boolean append) {
return writeFileFromIS(getFileByPath(filePath), is, append);
}
/**
* 從輸入流寫入到文件
*
* @param file 要寫入的文件對象
* @param is 輸入流
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromIS(final File file, final InputStream is) {
return writeFileFromIS(file, is, false);
}
/**
* 從輸入流寫入到文件
*
* @param file 要寫入的文件對象
* @param is 輸入流
* @param append True 爲追加寫入 false 爲覆蓋寫入
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromIS(final File file,
final InputStream is,
final boolean append) {
if (!createOrExistsFile(file) || is == null) {return false;}
OutputStream os = null;
try {
os = new BufferedOutputStream(new FileOutputStream(file, append));
byte[] data = new byte[sBufferSize];
int len;
while ((len = is.read(data, 0, sBufferSize)) != -1) {
os.write(data, 0, len);
}
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 通過IO流將byte字節寫入到文件中
*
* @param filePath 要寫入到的文件路徑
* @param bytes 寫入內容的byte字節數組
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromBytesByStream(final String filePath, final byte[] bytes) {
return writeFileFromBytesByStream(getFileByPath(filePath), bytes, false);
}
/**
* 通過IO流將byte字節寫入到文件中
*
* @param filePath 要寫入到的文件路徑
* @param bytes 寫入內容的byte字節數組
* @param append True 爲追加寫入 false 爲覆蓋寫入
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromBytesByStream(final String filePath,
final byte[] bytes,
final boolean append) {
return writeFileFromBytesByStream(getFileByPath(filePath), bytes, append);
}
/**
* 通過IO流將byte字節寫入到文件中
*
* @param file 要寫入到的文件對象
* @param bytes 寫入內容的byte字節數組
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromBytesByStream(final File file, final byte[] bytes) {
return writeFileFromBytesByStream(file, bytes, false);
}
/**
* 通過IO流將byte字節寫入到文件中
*
* @param file 要寫入到的文件對象
* @param bytes 寫入內容的byte字節數組
* @param append True 爲追加寫入 false 爲覆蓋寫入
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromBytesByStream(final File file,
final byte[] bytes,
final boolean append) {
if (bytes == null || !createOrExistsFile(file)) {return false;}
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(file, append));
bos.write(bytes);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
try {
if (bos != null) {
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 通過通道將byte字節寫入到文件中
*
* @param filePath 要寫入到的文件路徑
* @param bytes 寫入內容的byte字節數組
* @param isForce 是否強制寫入文件
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromBytesByChannel(final String filePath,
final byte[] bytes,
final boolean isForce) {
return writeFileFromBytesByChannel(getFileByPath(filePath), bytes, false, isForce);
}
/**
* 通過通道將byte字節寫入到文件中
*
* @param filePath 要寫入到的文件路徑
* @param bytes 寫入內容的byte字節數組
* @param append True 爲追加寫入 false 爲覆蓋寫入
* @param isForce 是否強制寫入文件
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromBytesByChannel(final String filePath,
final byte[] bytes,
final boolean append,
final boolean isForce) {
return writeFileFromBytesByChannel(getFileByPath(filePath), bytes, append, isForce);
}
/**
* 通過通道將byte字節寫入到文件中
*
* @param file 要寫入到的文件對象
* @param bytes 寫入內容的byte字節數組
* @param isForce 是否強制寫入文件
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromBytesByChannel(final File file,
final byte[] bytes,
final boolean isForce) {
return writeFileFromBytesByChannel(file, bytes, false, isForce);
}
/**
* 通過通道將byte字節寫入到文件中
*
* @param file 要寫入到的文件對象
* @param bytes 寫入內容的byte字節數組
* @param append True 爲追加寫入 false 爲覆蓋寫入
* @param isForce 是否強制寫入文件
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromBytesByChannel(final File file,
final byte[] bytes,
final boolean append,
final boolean isForce) {
if (bytes == null) {return false;}
FileChannel fc = null;
try {
fc = new FileOutputStream(file, append).getChannel();
fc.position(fc.size());
fc.write(ByteBuffer.wrap(bytes));
if (isForce) {fc.force(true);}
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
try {
if (fc != null) {
fc.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 通過Map將byte字節寫入到文件中
*
* @param filePath 要寫入到的文件路徑
* @param bytes 寫入內容的byte字節數組
* @param isForce 是否強制寫入文件
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromBytesByMap(final String filePath,
final byte[] bytes,
final boolean isForce) {
return writeFileFromBytesByMap(filePath, bytes, false, isForce);
}
/**
* 通過Map將byte字節寫入到文件中
*
* @param filePath 要寫入到的文件對象
* @param bytes 寫入內容的byte字節數組
* @param append True 爲追加寫入 false 爲覆蓋寫入
* @param isForce 是否強制寫入文件
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromBytesByMap(final String filePath,
final byte[] bytes,
final boolean append,
final boolean isForce) {
return writeFileFromBytesByMap(getFileByPath(filePath), bytes, append, isForce);
}
/**
* 通過Map將byte字節寫入到文件中
*
* @param file 要寫入到的文件對象
* @param bytes 寫入內容的byte字節數組
* @param isForce 是否強制寫入文件
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromBytesByMap(final File file,
final byte[] bytes,
final boolean isForce) {
return writeFileFromBytesByMap(file, bytes, false, isForce);
}
/**
* 通過Map將byte字節寫入到文件中
*
* @param file 要寫入到的文件對象
* @param bytes 寫入內容的byte字節數組
* @param append True 爲追加寫入 false 爲覆蓋寫入
* @param isForce 是否強制寫入文件
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromBytesByMap(final File file,
final byte[] bytes,
final boolean append,
final boolean isForce) {
if (bytes == null || !createOrExistsFile(file)) {return false;}
FileChannel fc = null;
try {
fc = new FileOutputStream(file, append).getChannel();
MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_WRITE, fc.size(), bytes.length);
mbb.put(bytes);
if (isForce) {mbb.force();}
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
try {
if (fc != null) {
fc.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 將字符傳寫入到指定文件
*
* @param filePath 要寫入到的文件路徑
* @param content 寫入的字符串內容
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromString(final String filePath, final String content) {
return writeFileFromString(getFileByPath(filePath), content, false);
}
/**
* 將字符傳寫入到指定文件
*
* @param filePath 要寫入到的文件路徑
* @param content 寫入的字符串內容
* @param append True 爲追加寫入 false 爲覆蓋寫入
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromString(final String filePath,
final String content,
final boolean append) {
return writeFileFromString(getFileByPath(filePath), content, append);
}
/**
* 將字符傳寫入到指定文件
*
* @param file 要寫入到的文件對象
* @param content 寫入的字符串內容
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromString(final File file, final String content) {
return writeFileFromString(file, content, false);
}
/**
* 將字符傳寫入到指定文件
*
* @param file 要寫入到的文件對象
* @param content 寫入的字符串內容
* @param append True 爲追加寫入 false 爲覆蓋寫入
* @return {@code true}: 成功<br>{@code false}: 失敗
*/
public static boolean writeFileFromString(final File file,
final String content,
final boolean append) {
if (file == null || content == null) {return false;}
if (!createOrExistsFile(file)) {return false;}
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(file, append));
bw.write(content);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
try {
if (bw != null) {
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
///////////////////////////////////////////////////////////////////////////
// 讀寫分界線
///////////////////////////////////////////////////////////////////////////
/**
* 讀取文件中每行的內容
*
* @param filePath 文件路徑
* @return 文件中每行的內容
*/
public static List<String> readFile2List(final String filePath) {
return readFile2List(getFileByPath(filePath), null);
}
/**
* 讀取文件中每行的內容
*
* @param filePath 文件路徑
* @param charsetName 編碼格式
* @return 文件中每行的內容
*/
public static List<String> readFile2List(final String filePath, final String charsetName) {
return readFile2List(getFileByPath(filePath), charsetName);
}
/**
* 讀取文件中每行的內容
*
* @param file file對象
* @return 文件中每行的內容
*/
public static List<String> readFile2List(final File file) {
return readFile2List(file, 0, 0x7FFFFFFF, null);
}
/**
* 讀取文件中每行的內容
*
* @param file file對象
* @param charsetName 編碼名
* @return 文件中每行的內容
*/
public static List<String> readFile2List(final File file, final String charsetName) {
return readFile2List(file, 0, 0x7FFFFFFF, charsetName);
}
/**
* 讀取文件中指定範圍行的內容
*
* @param filePath 文件路徑
* @param st 起始行index
* @param end 結束行index
* @return 文件中指定範圍行的內容,不包含end行的內容
*/
public static List<String> readFile2List(final String filePath, final int st, final int end) {
return readFile2List(getFileByPath(filePath), st, end, null);
}
/**
* 讀取文件中指定範圍行的內容
*
* @param filePath 文件路徑
* @param st 起始行index
* @param end 結束行index
* @param charsetName 編碼名
* @return 文件中指定範圍行的內容,不包含end行的內容
*/
public static List<String> readFile2List(final String filePath,
final int st,
final int end,
final String charsetName) {
return readFile2List(getFileByPath(filePath), st, end, charsetName);
}
/**
* 讀取文件中指定範圍行的內容
*
* @param file 文件對象
* @param st 起始行index
* @param end 結束行index
* @return 文件中指定範圍行的內容,不包含end行的內容
*/
public static List<String> readFile2List(final File file, final int st, final int end) {
return readFile2List(file, st, end, null);
}
/**
* 讀取文件中指定範圍行的內容
*
* @param file 文件對象
* @param st 起始行index
* @param end 結束行index
* @param charsetName 編碼格式名
* @return 文件中指定範圍行的內容,不包含end行的內容
*/
public static List<String> readFile2List(final File file,
final int st,
final int end,
final String charsetName) {
if (!isFileExists(file)) {return null;}
if (st > end) {return null;}
BufferedReader reader = null;
try {
String line;
int curLine = 1;
List<String> list = new ArrayList<>();
if (isSpace(charsetName)) {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
} else {
reader = new BufferedReader(
new InputStreamReader(new FileInputStream(file), charsetName)
);
}
while ((line = reader.readLine()) != null) {
if (curLine > end) {break;}
if (st <= curLine && curLine <= end) {list.add(line);}
++curLine;
}
return list;
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 從指定文件讀取字符串
*
* @param filePath 文件路徑
* @return 文件中的字符串
*/
public static String readFile2String(final String filePath) {
return readFile2String(getFileByPath(filePath), null);
}
/**
* 從指定文件讀取字符串.
*
* @param filePath 文件路徑
* @param charsetName 編碼格式名
* @return 文件中的字符串內容
*/
public static String readFile2String(final String filePath, final String charsetName) {
return readFile2String(getFileByPath(filePath), charsetName);
}
/**
* 從指定文件讀取字符串.
*
* @param file 文件對象
* @return 文件中的字符串內容
*/
public static String readFile2String(final File file) {
return readFile2String(file, null);
}
/**
* 從指定文件讀取字符串
*
* @param file 文件對象
* @param charsetName 編碼格式名
* @return 文件中的字符串內容
*/
public static String readFile2String(final File file, final String charsetName) {
byte[] bytes = readFile2BytesByStream(file);
if (bytes == null) {return null;}
if (isSpace(charsetName)) {
return new String(bytes);
} else {
try {
return new String(bytes, charsetName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return "";
}
}
}
/**
* 通過輸入流從指定文件讀取byte數組
*
* @param filePath 文件路徑
* @return 文件中的byte數組內容
*/
public static byte[] readFile2BytesByStream(final String filePath) {
return readFile2BytesByStream(getFileByPath(filePath));
}
/**
* 通過輸入流從指定文件讀取byte數組
*
* @param file 文件對象
* @return 文件中的byte數組內容
*/
public static byte[] readFile2BytesByStream(final File file) {
if (!isFileExists(file)) {return null;}
try {
return is2Bytes(new FileInputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
}
/**
* 通過通道從文件讀取byte數組
*
* @param filePath 文件路徑
* @return 文件中的byte數組內容
*/
public static byte[] readFile2BytesByChannel(final String filePath) {
return readFile2BytesByChannel(getFileByPath(filePath));
}
/**
* 通過通道從文件讀取byte數組
*
* @param file 文件對象
* @return 文件中的byte數組內容
*/
public static byte[] readFile2BytesByChannel(final File file) {
if (!isFileExists(file)) {return null;}
FileChannel fc = null;
try {
fc = new RandomAccessFile(file, "r").getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate((int) fc.size());
while (true) {
if (((fc.read(byteBuffer)) <= 0)){ break;}
}
return byteBuffer.array();
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
try {
if (fc != null) {
fc.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 通過map讀取指定文件中的字節數組
*
* @param filePath 文件路徑
* @return 文件中的byte數組內容
*/
public static byte[] readFile2BytesByMap(final String filePath) {
return readFile2BytesByMap(getFileByPath(filePath));
}
/**
* 通過map讀取指定文件中的字節數組
*
* @param file 文件對象
* @return t文件中的byte數組內容
*/
public static byte[] readFile2BytesByMap(final File file) {
if (!isFileExists(file)) {return null;}
FileChannel fc = null;
try {
fc = new RandomAccessFile(file, "r").getChannel();
int size = (int) fc.size();
MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, size).load();
byte[] result = new byte[size];
mbb.get(result, 0, size);
return result;
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
try {
if (fc != null) {
fc.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 設置緩衝字節數組大小
* <p>默認爲8192</p>
*
* @param bufferSize 緩衝字節數組大小
*/
public static void setBufferSize(final int bufferSize) {
sBufferSize = bufferSize;
}
///////////////////////////////////////////////////////////////////////////
// 其它方法
///////////////////////////////////////////////////////////////////////////
private static File getFileByPath(final String filePath) {
return isSpace(filePath) ? null : new File(filePath);
}
private static boolean createOrExistsFile(final String filePath) {
return createOrExistsFile(getFileByPath(filePath));
}
private static boolean createOrExistsFile(final File file) {
if (file == null) {return false;}
if (file.exists()) {return file.isFile();}
if (!createOrExistsDir(file.getParentFile())) { return false;}
try {
return file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
private static boolean createOrExistsDir(final File file) {
return file != null && (file.exists() ? file.isDirectory() : file.mkdirs());
}
private static boolean isFileExists(final File file) {
return file != null && file.exists();
}
private static boolean isSpace(final String s) {
if (s == null) {return true;}
for (int i = 0, len = s.length(); i < len; ++i) {
if (!Character.isWhitespace(s.charAt(i))) {
return false;
}
}
return true;
}
private static byte[] is2Bytes(final InputStream is) {
if (is == null) {return null;}
ByteArrayOutputStream os = null;
try {
os = new ByteArrayOutputStream();
byte[] b = new byte[sBufferSize];
int len;
while ((len = is.read(b, 0, sBufferSize)) != -1) {
os.write(b, 0, len);
}
return os.toByteArray();
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
媽耶,這麼多,找死啊。
客官別急嘛,小二這就爲你解答一波
算了,你滾
。。。。。
文件IO工具
需求
- 寫入字符串到指定文件
- 寫入字節數組到指定文件
- 從InputStream讀取字節寫入到指定文件
- 讀取文件中沒行的內容轉爲List<String>
- 讀取文件中的內容轉爲String
- 讀取文件中的內容轉爲byte數組
接口實現
writeFileFromIS : 從InputStream讀取字節寫入到指定文件,支持覆蓋或追加寫入 writeFileFromBytesByStream : 通過IO流將byte字節寫入到文件中,支持覆蓋或追加寫入 writeFileFromBytesByChannel : 通過通道將byte字節寫入到文件中,支持覆蓋或追加寫入 writeFileFromBytesByMap : 通過Map將byte字節寫入到文件中,支持覆蓋或追加寫入 writeFileFromString : 將字符傳寫入到指定文件,支持覆蓋或追加寫入 readFile2List : 讀取文件中每行的內容,支持指定範圍行,讀取的編碼方式 readFile2String : 從指定文件讀取字符串 readFile2BytesByStream : 通過輸入流從指定文件讀取byte數組 readFile2BytesByChannel : 通過通道從文件讀取byte數組 readFile2BytesByMap : 通過map讀取指定文件中的字節數組 setBufferSize : 設置讀寫緩衝字節數組大小 這樣看起來舒服多了。 nice,關機下班,兩百塊到手。。。。。