IO

IO:input / output

定义:

  1. input(输入):把数据从磁盘中读取到内存中进行处理为输入
  2. output(输出):将内存中的数据保存到磁盘中为输出

File

定义:提供了文件属性,文件创建/删除,目录列表操作的方法;封装一个磁盘路径的字符串:文件路径,文件夹路径,不存在的路径

代码如下:

	public static void main(String[] args) {
		String path = null;
		
//		path = "D:/aaa";//存在的文件夹
//		path = "D:/XshellCore.exe";//存在的文件
//		path = "K:/AAA";//不存在的路径		
		File f = new File(path);		
		//文件或文件夹属性		
		System.out.println(f.exists());			/** File.exists()	是否存在 */		
		System.out.println(f.isFile());			/** File.isFile()	是否为文件 */		
		System.out.println(f.isDirectory());		/** File.exists()	是否为文件夹 */		
		System.out.println(f.getName());		/** File.exists()	获取文件名/文件夹名 */		
		System.out.println(f.getParent());		/** File.exists()	获取父目录 */
		System.out.println(f.getAbsolutePath());		/** File.exists()	获取完整路径 */
		System.out.println(f.length());			/** File.exists()	获取字节量, 对目录无效 */
		}
public static void main(String[] args) throws Exception {
	
	File f1 = new File("d:/aaa/aaa");
	File f2 = new File(f1,"f1");	
	
	//创建/删除文件或文件夹	
	f1.mkdirs();						/** File.mkdirs:根据路径创建文件夹;File.mkdir:只能创建一层文件夹 */
	f2.createNewFile();					/** File.createNewFile:创建文件,如果文件已经存在,返回false;但是路径不存在会报错 */
	f1.delete();	f2.delete();		/** File. delete:根据路径删除指定文件;根据路径删除指定文件夹(必须为空文件夹)*/
	}
public static void main(String[] args) throws Exception {
		//D:/aaa/aaa			//文件夹路径  		//答案是		string = null		file = null
		//D:/aaa/aaa/timg.jpg	//文件路径			//答案是		string = null		file = null
		//D:/bbb/aaa			//不存在的路径		//答案是		string = null		file = null
		//asdsadas				//错误的路径			//答案是		string = null		file = null
		//C:/PerfLogs			//没有权限访问的文件	//答案是		string = 2019 / f1 / timg.jpg		file = D:\aaa\aaa\2019  |  D:\aaa\aaa\f1  |  D:\aaa\aaa\timg.jpg	
		
		//注:想要获取file中其他的文件信息,需要调用file自带的方法
		
		String s = "D:/aaa/aaa";
		File dir = new File(s);
		
		String[] list = dir.list();
		for (String string : list) {	System.out.println(string);}
		
		File[] listFiles = dir.listFiles();
		for (File file : listFiles) {System.out.println(file);}
	}
public static void main(String[] args) throws Exception {
		File file = new File("D:/aaa/aaa/a.txt");
		
		/** 如果该文件存在,则会将原来的文件覆盖掉,创建一个新的文件 */
		FileOutputStream out = new FileOutputStream(file);			
		
		/** 
		 * true:如果文件不存在,则会创建,若已经存在,则不会创建 
		 * false:默认,和上面创建的方法一样 
		 */
		FileOutputStream put = new FileOutputStream(file,false);		
	}
public static void main(String[] args) throws Exception {
		File file = new File("D:/aaa/aaa/a.txt");
		FileInputStream in = new FileInputStream(file);
		
		int read = in.read();
		System.out.println(read);
		
		//读取文件方法1
		int a;	while(true) {a=in.read();	
		if(a==-1) {break;} 	System.out.println(a);}		
		
		//读取文件方法2
		int b;		while((b=in.read()) != -1) {System.out.println(b);}
		
		//释放资源
		in.close();
	}

文件夹列表

  1. List:获得String数组,只包含文件和文件夹名称的字符串
  2. ListFile:获得一个File数组,包含每个文件和文件夹的封装的File实例(文件的所有信息都包含在内

注意:文件路径列表可能存在null值,原因可分为以下几点
3. 输入的是文件的路径
4. 输入的是不存在的文件路径
5. 输入的是没有权限进入的文件夹

Stream

定义:简称流;把字节数据的读写理解为数据在管道中流动只能是单向流动而Stream又分为OutputStream(输出流)和InputStream(输入流)

原理图:
在这里插入图片描述

InputStream(输入流):就只能从磁盘中读取数据到内存中
OutputStream(输出流):就只能从内存中写出数据到磁盘中

数据在管道中流动只能是单向流动:输入/输出 的文件字节只能在Stream中流动一次,当文件字节全部流动完成后,Stram也就失去了作用,如果还想要在 输入/输出 文件的话就只能重新创建一个Stream

FileInputStream/FileOutputStream

定义:直接插在文件上读写文件数据

ObjectInputStream / ObjectOutputStream

定义:序列化 和 反序列化

代码:

	public static void main(String[] args) throws Exception {
		/*
		 * OIS--FIS--f2
		 */
		ObjectInputStream in = new ObjectInputStream(new FileInputStream("d:/abc/f2"));
		
		//反序列化, 读取,恢复实例
		Object readObject = in.readObject();
		System.out.println(readObject);
		in.close();
	}
}
	public static void main(String[] args) throws Exception {
		/*
		 * OOS--FOS--d:/abc/f2
		 *
		 * 先新建 FOS 插在文件上,
		 * 再新建 OOS 插在文件流上
		 * OOS负责把对象转成一串字节值 ——> (序列化)
		 * FOS负责向文件输出这些数据
		 */
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("d:/abc/f2"));

		out.writeObject("asd");
		out.close();
	}
}
	public static void main(String[] args) throws Exception {
		/*
		 * OOS--FOS--d:/abc/f2
		 *
		 * 先新建 FOS 插在文件上,
		 * 再新建 OOS 插在文件流上
		 * OOS负责把对象转成一串字节值 ——> (序列化)
		 * FOS负责向文件输出这些数据
		 */
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("d:/abc/f2"));

		out.writeObject("asd");
		out.close();
	}
}

InputStreamReader / OutputStreamWriter

定义:读取编码字符转成Unicode 和 把Unicode转成其他编码

原理图:
在这里插入图片描述

代码:

public static void main(String[] args) throws Exception {

		/*
		 * 读取,转成Unicode编码
		 */
		f("d:/abc/f3", "UTF-8");
		f("d:/abc/f4", "GBK");
	}

	private static void f(
			String path, String charset) throws Exception {
		// ISR--FIS--path
		InputStreamReader in = new InputStreamReader(new FileInputStream(path), charset);

		int c; // 00 00 xx xx, 后面两个字节,是char
		while ((c = in.read()) != -1) {
			char c1 = (char) c;//强转成char类型
			System.out.print(c1);
		}
		in.close();
	}
public static void main(String[] args) throws Exception {

		/*
		 * OSW--FOS--f3 保存UTF-8编码
		 * OSW--FOS--f4 保存GBK编码
		 */
		f("d:/abc/f3", "UTF-8");
		f("d:/abc/f4", "GBK");
	}

	/*在这里插入图片描述
	 * 字符编码   encoding
	 * 字符集 charset
	 */
	private static void f(String path,String charset) throws Exception {
		//字符由OSW做编码转换
		//转码的结构交给FOS向文件输出
		OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(path),charset);//需要指定转换的编码  

		int count = 0;
		for (char i = '\u4e00'; i <='\u9fa5'; i++) {
			out.write(i);
			count++;
		}
		out.close();
	}

额外试题:计算文件夹大小

public static void main(String[] args) throws Exception {

		String s = "D:/aaa/aaa";
		File dir = new File(s);

		long size = dirLength(dir);
		System.out.println(size);
	}


	private static long dirLength(File dir) {
		File[] files = dir.listFiles();
		if(files == null) {return 0;}

		long sum = 0;
		System.out.println(sum);

		for (File file : files) {
			System.out.println(file.getName());
			if(file.isFile()) {
				sum += file.length();
			}else {sum += dirLength(file);}}

		System.out.println();
		return sum;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值