Java文件操作:创建、写入、读取、删除

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39501726/article/details/81808750

最近在学Java,干好看到了文件的读取写入,就都写了一下,记下笔记,刚学难免有疏漏错误,欢迎大家补充纠正! 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;

public class App {

	public static void main(String[] args) {
		new App();
	}

	private App() {
		// readFile();
		// writeFile();
		// simpleDeleteFile();
		// complexDeleteFiles(new File("E:/test"));
		// ReadCnFile();
		// deleteDirectory(new File("e:/test"));
		clearDirectory(new File("e:/test"), "f:/20180818/");
	}

	/**
	 * 清空整个目录
	 */
	private void clearDirectory(File dir, String path) {
		deleteDirectory(dir);
		// 创建此抽象路径名指定的目录。如果f盘不存在20180818的文件夹,则不会创建成功
		new File(path + dir.getName()).mkdir();
		// 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。如果f盘不存在20180818的文件夹,会创建成功
		// new File(path+dir.getName()).mkdirs();
	}

	/**
	 * 删除整个目录
	 * 
	 * @param dir
	 *            文件夹
	 */
	private void deleteDirectory(File dir) {
		if (dir == null || !dir.isDirectory())
			throw new IllegalArgumentException("Argument" + dir + "不是一个目录");
		File[] entries = dir.listFiles();
		for (int i = 0; i < entries.length; i++) {
			if (entries[i].isDirectory())
				deleteDirectory(entries[i]);
			else
				entries[i].delete();
			System.out.println("删除" + dir + "文件夹下" + entries[i].getName()
					+ "文件");
		}
		dir.delete();
	}

	private void ReadCnFile() {
		StringBuffer sb = GetFileCNContent("e:/aa.txt", getEnterSymbol());
		System.out.println(sb.toString());
	}

	private String getEnterSymbol() {
		String str = System.getProperty("os.name").toLowerCase();
		String enterSymbol = "";// 换行符号
		if (str.indexOf("win") >= 0)
			enterSymbol = "\r\n";
		else if (str.indexOf("mac") >= 0)
			enterSymbol = "\r";
		else if (str.indexOf("nix") >= 0 || str.indexOf("nux") >= 0)
			enterSymbol = "\n";
		return enterSymbol;
	}

	/**
	 * 读取文件内容
	 * 
	 * @param fileName
	 *            文件名
	 * @param enter
	 *            回车符
	 * @return StringBuffer
	 */
	private StringBuffer GetFileCNContent(String fileName, String enter) {
		try {
			StringBuffer sb = new StringBuffer();
			File file = new File(fileName);
			if (!file.exists())
				file.createNewFile();
			if (file.exists() && file.isFile()) {
				InputStreamReader read = new InputStreamReader(
						new FileInputStream(file), "GBK");
				BufferedReader br = new BufferedReader(read);
				String line;
				while ((line = br.readLine()) != null) {
					sb.append(br.readLine()).append(enter);
				}
				br.close();
			}
			return sb;
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 删除文件夹下的所有文件
	 * 
	 * @param directory
	 *            文件夹
	 */
	private void complexDeleteFiles(File directory) {
		File[] entries = directory.listFiles();
		for (int i = 0; i < entries.length; i++) {
			entries[i].delete();
			System.out.println(entries[i].getAbsolutePath() + "已删除!");
		}
		System.out.println("已全部删除完毕!");
	}

	/**
	 * 删除文件
	 */
	private void simpleDeleteFile() {
		try {
			File file = new File("E:/aa.txt");
			if (!file.exists()) {

				file.createNewFile();

			}
			if (file.exists() && file.canWrite()) {
				file.delete();
				System.out.println("deleted");
			}
			System.exit(0);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 文件写入
	 */
	private void writeFile() {
		try {
			System.out.println("BufferedWriter文件写入1");
			BufferedWriter bw1 = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream(new File("e:/2018-8-12.log"))));
			bw1.write("啊啊啊111");
			bw1.write("a嗷嗷嗷啊");// 插入字符序列
			bw1.append('a');// 插入字符
			bw1.close();
			System.out.println("BufferedWriter文件写入2");
			BufferedWriter bw2 = new BufferedWriter(new FileWriter(new File(
					"e:/2018-8-122.log")));
			bw2.write("123请问");
			bw2.close();
			System.out.println("DataOutputStream文件写入");
			DataOutputStream dos = new DataOutputStream(new FileOutputStream(
					new File("e:/dataOutputStream.txt")));
			dos.writeBytes("DataOutputStream写入文件测试。");
			String str = "DataOutputStream写入文件测试。";
			dos.write(str.getBytes());
			dos.close();
			System.out.println("RandomAccessFile文件写入");
			RandomAccessFile raf = new RandomAccessFile(new File(
					"e:/RandomAccessFile.txt"), "rw");
			// RandomAccessFile.seek(pos)pos默认是0
			// 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。偏移量的设置可能会超出文件末尾。偏移量的设置超出文件末尾不会改变文件的长度。只有在偏移量的设置超出文件末尾的情况下对文件进行写入才会更改其长度。
			// 参数:
			// pos - 从文件开头以字节为单位测量的偏移量位置,在该位置设置文件指针。
			// 以上是API的解释,简单理解,就是设置写入的位置从第几位开始,如果新写入的文字的长度小于文件内文字的长度,不会改变文件长度,会从改位置起替换文件内的文字,直到写入结束,不足文件长度的部分保留原文字;如果超出文件内文字长度,会改变文件长度,会从改位置起替换文件内的文字,直到写入结束;
			// 如果觉得我解释的也不清楚,可以按照一下代码测试一下,按照第一次,第二次的写入测试
			System.out.println(raf.length());
			// raf.seek(3);
			raf.writeBytes("111");// 第一次写入
			// raf.writeBytes("2222");//第二次写入
			// raf.writeBytes("RandomAccessFile写入文件测试。");//中文乱码
			str = "RandomAccessFile写入文件测试。";// 第一次写入
			// str="二次二次二次二次二次二次二次二次二次二次二次二次";//第二次写入
			raf.write(str.getBytes());
			System.out.println(raf.length());
			raf.close();
			// System.exit(0);//知识点一
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 文件读取
	 */
	private void readFile() {
		try {
			System.out.println("bufferedReader读取文件——中文乱码");
			BufferedReader br1 = new BufferedReader(new FileReader(new File(
					"e:/test.log")));
			while (br1.ready()) {
				System.out.println(br1.readLine());
			}
			br1.close();
			System.out.println("bufferedReader读取文件2——中文不乱码");
			BufferedReader br2 = new BufferedReader(new InputStreamReader(
					new FileInputStream(new File("e:/2018-8-12.log")), "UTF-8"));
			while (br2.ready()) {
				System.out.println(br2.readLine());
			}
			br2.close();
			System.out.println("dataInputStream读取文件");
			DataInputStream dis = new DataInputStream(new FileInputStream(
					new File("e:/test.log")));
			System.out.println(dis.readLine());
			String inputLine = null;

			while ((inputLine = dis.readLine()) != null) {

				inputLine = new String(inputLine.getBytes("ISO8859-1"), "UTF-8");

				System.out.println(inputLine);
			}
			dis.close();
			System.out.println("RandomAccessFile读取文件");

			RandomAccessFile raf = new RandomAccessFile(
					new File("e:/test.log"), "r");
			System.out.println(raf.readLine());
			String inputLine2 = null;

			while ((inputLine2 = raf.readLine()) != null) {

				inputLine2 = new String(inputLine2.getBytes("ISO8859-1"),
						"UTF-8");

				System.out.println(inputLine2);
			}
			// RandomAccessFile(File,mode),mode取值如下:
			// "r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
			// "rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
			// "rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
			// "rwd" 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。
			System.exit(0);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

在以上代码测试的时候还遇到了一个问题,用debug->Java Application运行报错,Run->Java Application不报,因此将该错记录下来。错误如下:ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183):  [../../../src/share/back/util.c:838]

解决方案:在main函数结束时,添加system.exit(0);

答案是在网上找的,觉得博主写的挺好,附上博主的原文链接:https://blog.csdn.net/vinoya/article/details/4600228

猜你喜欢

转载自blog.csdn.net/qq_39501726/article/details/81808750