java 文件创建、读、写、删除前n行内容
/** 文件路劲 **/
private String fileDir= this.getFilesDir().getAbsolutePath() + “/fileurl/”;
/** 创建文件夹 文件 **/
public static File createFile(String filePath, String fileName) throws IOException {
/** 生成文件夹之后,再生成文件,不然会出错 **/
String strFilePath = filePath + fileName;
File file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
File subfile = new File(strFilePath);
if (!subfile.exists()) {
subfile.createNewFile();
}
return subfile;
}
-----------------下面是4种方式写入文件-----------------
- FileWritter写入文件
public void fwData() throws Exception {
String data = "hello 我是:FileWritter写入@文件111" + "\r\n";
File file = getFile(fileDir, "FileWriter");
// 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
FileWriter fileWritter = new FileWriter(file, true);
fileWritter.write(data);
fileWritter.close();
}
- BufferedWriter写入文件
public void bwData() throws IOException {
/**直接写字符串,数组或字符数据保存到文件。**/
File file = getFile(fileDir, "BufferedWriter");
FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("hello 我是:BufferedWriter写入@文件111" + "\r\n");
bw.close();
}
- FileOutputStream 数据写入到文件中,必须将数据转换为字节,并保存到文件
public void fosData() throws IOException {
File file = getFile(fileDir, "FileOutputStream");
FileOutputStream fop = new FileOutputStream(file, true);
String content = "hello 我是:FileOutputStream写入@文件111" + "\r\n";
// get the content in bytes
byte[] contentInBytes = content.getBytes();
fop.write(contentInBytes);
fop.flush();
fop.close();
}
4 RandomAccessFile 数据写入到文件中,必须将数据转换为字节,并保存到文件
public void rafData() throws IOException {
File file = getFile(fileDir, "RandomAccessFile");
RandomAccessFile raf = null;
/** 构造函数 第二个是读写方式 */
raf = new RandomAccessFile(file, "rw");
/** 将记录指针移动到该文件的最后 */
raf.seek(file.length());
/** 向文件末尾追加内容 */
String content = "777hello 我是:RandomAccessFile写入@文件111" + "\r\n";
String logContent = new String(content.getBytes("UTF-8"), "iso-8859-1");//加入乱码控制
System.out.println("写入文件的内容" + logContent);//输出是否为正常编码
raf.writeBytes(logContent);//获取字节输出
raf.close();
}
-----------------下面是4种方式读文件内容-----------------
- FileReader 读取文件内容 它有三种方式读取 :
①逐个字符来读取文本文件
public void fwDataRead() throws IOException {
File file = getFile(fileDir, "FileWriter");
FileReader fileReader = new FileReader(file.getAbsoluteFile());
int ch = fileReader.read();
while (ch != -1) {
System.out.print((char) ch);
ch = fileReader.read();
}
fileReader.close();
}
②使用数组来读取文本文件
public void fwDataRead() throws IOException {
File file = getFile(fileDir, "FileWriter");
FileReader fileReader = new FileReader(file.getAbsoluteFile());
int i = 0;
char[] buf = new char[1024];
int num = 0;
while ((num = fileReader.read(buf)) != -1) {
i++;
System.out.println("FileReader 方式二 读取第" + i + "条" + new String(buf, 0, num));
}
fileReader.close();
}
③用缓冲区读取文本文件
public void fwDataRead() throws IOException {
File file = getFile(fileDir, "FileWriter");
FileReader fileReader = null;
BufferedReader bufr = null;
fileReader = new FileReader(file.getAbsoluteFile());
bufr = new BufferedReader(fileReader);
String line = null;
//BufferedReader提供了按行读取文本文件的方法readLine()
//readLine()返回行有效数据,不包含换行符,未读取到数据返回null
int i = 0;
while ((line = bufr.readLine()) != null) {
i++;
System.out.println("FileReader 方式三 读取第" + i + "条" + line);
}
bufr.close();
}
- BufferedRead读取文件
public void brDataRead() throws IOException {
File file = getFile(fileDir, "FileWriter");
FileInputStream fileReader = new FileInputStream(file);
BufferedReader read = new BufferedReader(new InputStreamReader(fileReader, "UTF-8"));
//读取 的时候可以 用Buffere的ReadLine方法 一行的读效率会比较高
String line = null;
while ((line = read.readLine()) != null) {
System.out.println(line);
}
read.close();
}
- FileInputStream 数据写入到文件中,必须将数据转换为字节,并保存到文件
public void isrDataRead() throws IOException {
File file = getFile(fileDir, "FileWriter");
FileInputStream fileInputStream = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fileInputStream, "UTF-8");
int len = 0;
int i = 0;
while ((len = isr.read()) != -1) {
System.out.print((char) len);
}
fileInputStream.close();
}
- RandomAccessFile 支持随机读取文件内容
public void rafDataRead() throws IOException {
File file = getFile(fileDir, "RandomAccessFile");
RandomAccessFile randomFile = null;
// 打开一个随机访问文件流,按只读方式
randomFile = new RandomAccessFile(file, "r");
int i = 0;
String line = null;
while ((line = randomFile.readLine()) != null) {
System.out.println(line);
String content = new String(line.getBytes("iso-8859-1"), "UTF-8");
System.out.println("RandomAccessFile读取第" + i + "条" + content);
}
randomFile.close();
}
-------------------删除文件前2行-----------------
/** 将整个文件中的全部内容读取出来,然后通过集合将每一行单独存放,
通过查找到集合内特定的内容后,将该行内容删除,
此时list集合会自动将后面的内容填补上来,再重新写入的时候不会出现空行的情况。
这时再重新遍历一次该集合,将现在的集合内容写入文件中,此时再看文件,
已经完成了删除需要删除的特定行内容了**/
public void deleteFileNumLine() throws IOException {
File file = getFile(fileDir, "RandomAccessFile");
String str = null;
ArrayList<String> list = new ArrayList<>();
//BufferedReader是可以按行读取文件
FileInputStream inputStream = new FileInputStream(file);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
while ((str = bufferedReader.readLine()) != null) {
//如果有空格、去掉空格
if (str.contains(" ")) {
Pattern p = Pattern.compile("\\s*|\t|\r|\n");
Matcher m = p.matcher(str);
str = m.replaceAll("");
}
//如果不是空串、添加到list、然后提交
if (!str.equals("")) {
System.out.println(str);
list.add(str);
}
}
System.out.print("一共" + list.size() + "数据\n");
bufferedReader.close();
inputStream.close();
/** list是缓存所有数据 lineNum是n条数据**/
if (list.size() > lineNum) {
list.subList(0, lineNum).clear();//移除下标为0到lineNum的元素
} else {
/**如果缓存数据等于或者小于传入的lineNum,清空文件内容**/
list.clear();
}
FileOutputStream fileOutputStream = new FileOutputStream(file);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
BufferedWriter bw = new BufferedWriter(outputStreamWriter);
if (list.size() != 0) {
for (String string : list) {
bw.write(string);
bw.newLine();
System.out.println(string);
}
} else if (list.size() == 0) {
bw.write("");
}
bw.flush();
bw.close();
}