黑马程序员--IO输入与输出(一)

------- android培训 java培训 、期待与您交流! ----------

1.IO的概述

    IO泛指对某个设备或环境进行数据的数据或输出,例如对硬盘进行输入输出.IO流用来处理不同设备间的数据传输,Java中用于操作流的对象都封装在IO包中.

    IO流的分类:

    按方向分:输入流--输出流

    按操作数据分:字符流--字节流

2.File类

    我们硬盘上数据最常见的方式就是以文件存在的,为了方便操作这些文件,Java就在IO包中提供了File类对文件本身进行封装.

File的构造方法

    File(String pathname):根据指定路径名创建文件对象

    File file1=new File(“d:\\a.txt”);

    File(String parent,String child):根据指定的父目录和子路径创建文件对象

    File file2=new File(“d:\\”,”a.txt”);

    File(File parent,String child):根据指定的父目录对象和子路径创建文件对象

    File file3=new File(“d:\\”);

    File file4=new File(file3,”a.txt”);

File类的创建功能

    创建文件:boolean createNewFile():创建文件,如果文件存在就返回false并不创建,如果文件不存在就创建返回true

    创建文件夹;boolean mkdir():创建单级文件夹

               boolean mkdirs()创建多级文件夹

    注意:如果没有指定明确目录,就在当前项目路径下创建文件或文件夹

File类的删除功能

    public boolean delete()既可以删除文件,还可以删除文件夹,如果指定的目录里有文件或文件夹是不能直接删除的

File类的判断功能

    boolean exites()是否存在

    boolean isFile()是否是文件对象

    boolean isDirectory()是否是文件夹对象

    boolean isAbsolute()是否是绝对路径

    boolean canRead()是否可读

    boolean canWrite()是否可写

    boolean isHidden()是否隐藏

File类的重命名功能

    public boolean renameTo(File dest)

File类的获取功能

    String getAbsolutePath()获取绝对路径

    String getPath()获取相对路径

    String getName()获取文件名

    long length()文件长度

    long lastModified()返回文件最后一次修改时间的毫秒值

    public static File[] listRoots():列出系统的可用的根

    public String[] list():获取指定目录下的所有文件和文件夹的名称数组

    public File[] listFiles():获取指定目录下的所有文件和文件夹的File数组

/*
 * 需求:把d盘目录下以.jpg结尾的文件名称输出来
 * 
 * 思路:	
 * 		1:封装d盘目录
 * 		2:以listFiles方法返回该目录下所有文件和文件夹的File数组对象
 * 		3:遍历数组,得到每一个File对象
 * 		4:判断该File对象是否是文件,是否以.jpg结尾
 */
public class FileTest {
	public static void main(String[] args) {
		// 封装D盘
		File file = new File("d:\\");
		String[] strArray = file.list();
		//遍历打印文件及文件夹名
		for (String str : strArray) {
			System.out.println(str);
		}
		System.out.println("*******************");
		//获取文件及文件夹对象的数组
		File[] fileArray = file.listFiles();
		for (File f : fileArray) {
			//判断是否是文件对象
			if (f.isFile()) {
				//判断是否以jpg结尾
				if (f.getName().endsWith(".jpg")) {
					System.out.println(f.getName());
				}
			}
		}
	}
}

/*
 * 删除一个带内容的目录: 
 */
public class FileDeleteDemo {
	public static void main(String[] args) {
		// 封装目录
		File file = new File("test");
		deleteFiles(file);
	}
	private static void deleteFiles(File file) {
		//建立目录内文件对象的数组
		File[] fileArray = file.listFiles();
		//遍历数组
		for (File f : fileArray) {
			//如果是文件夹就递归删除
			if (f.isDirectory()) {
				deleteFiles(f);
			} else {
				//删除文件
				System.out.println(f.getName() + "***" + f.delete());
			}
		}
		//删除文件夹
		System.out.println(file.getName() + "***" + file.delete());
	}
}

3.递归

    递归指的是方法的定义中使用方法本身的形式.

    注意:

       A:递归是指在方法里调用方法自身

       B:在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口

    使用递归时应思考两个问题: A:出口条件B:递归的规律

/*
 * 需求:斐波纳契数列:
 * 		1,1,2,3,5,8,...
 * 求这个数列的第20项的值。
 * 用递归实现:
 * 		A:出口 通过规律说明前两项是已知的,第一项和第二项的值都是1
 *		B:规律 从第三项开始,每一项是前两项之和
 */
public class DiGuiTest {
	public static void main(String[] args) {
		System.out.println("斐波纳契数列的第二十项的值是:" + fib(20));
	}
	public static int fib(int n) {
		if (n == 1 || n == 2) {
			return 1;
		} else {
			return fib(n - 1) + fib(n - 2);
		}
	}
}

4.字符流

    字符流的抽象基类:

        Reader:字符输入流

        Writer:字符输出流

FileReader和FileWriter

    字符输出流写入数据步骤:1.创建字符输出流对象2.调用对象的写入方法3.释放内存

    flush()和close()的区别:flush()刷新缓冲区,流对象还可以继续使用.close()刷新缓冲区,关闭流对象,流对象不可以继续使用.释放资源对结果没有影响,释放资源的原因有二:1.让这个流对象本身变成垃圾,可以被回收,提高效率。2.通过操作系统释放管理fw.txt文件的资源。

public class FileWriterDemo {
	public static void main(String[] args) throws IOException {
		// 创建字符输出流对象
		FileWriter fw = new FileWriter("fw.txt");
		/* 1:创建了fw对象
		 * 2:底层调用了操作系统的资源创建了一个fw.txt文件
		 * 3:把fw对象指向fw.txt文件
		 */
		//调用对象的写方法
		fw.write("hello,io");
		//刷新缓冲区
		fw.flush();
		//释放资源,关闭之前,会自动去调用flush方法。
		fw.close();
	}
  }

如何实现数据的追加写入?

    FileWriter(String fileName, boolean append):使用带两个参数的构造,第二个参数表示是否追加写入.

                                                 默认是false,就会重头开始写入

                                                 如果是true,就会追加写入

public class FileWriterDemo2 {
	public static void main(String[] args) throws IOException {
		// 创建字符输出流对象
		FileWriter fw = new FileWriter("fw2.txt",true);
		// 调用writer方法
		for (int x = 0; x < 4; x++) {
			fw.write(x + "hello\r\n");
		}
		// 释放资源
		fw.close();
	}
}

    FileReader读取数据:

         public int read():一次读取一个字符

         public int read(char[] chs):一次读取一个字符数组

/*
 * 要求:将RandomDemo.java的内容复制到Copy.java文件中
 * 思路:
 * 数据源:RandomDemo.java -- 读取数据 -- 字符流 -- 字符输入流 -- FileReader
 * 目的地:Copy.java -- 写入数据 -- 字符流 -- 字符输出流 -- FileWriter
 */
public class FileCopyDemo2 {
	public static void main(String[] args) throws IOException {
		//封装数据源
		FileReader fr = new FileReader("RandomDemo.java");
		//封装目的地
		FileWriter fw = new FileWriter("Copy.java");	
		//读取数据
		char[] chs = new char[1024];
		int len = 0;
		while((len=fr.read(chs))!=-1){
			//写数据
			fw.write(chs,0,len);
		}
		//释放资源
		fw.close();
		fr.close();
	}
}

BufferedReader和BufferedWriter 

    缓冲区的出现提高了对数据的读写效率,缓冲区要结合流才可以使用,它是在流的基础上对流的功能进行了增强.

    问题:为什么要传入一个Writer呢?

    缓冲区类,只提供缓冲功能,只提供缓冲区,不能直接读写文件,需要传递一个基本读写文件的对象.

    字符高效缓冲流的特殊方法:

    public String readLine():根据行结束符读取一行数据,并把该行数据(不包括行结束符)作为一个字符串返回.

    public void newLine():写入一个行分割符,可以识别不同的系统,写入不同的分割符

public class FileCopyDemo {
	public static void main(String[] args) throws IOException {
		// 封装数据源
		BufferedReader br = new BufferedReader(
				new FileReader("RandomDemo.java"));
		// 封装目的地
		BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));
		// 读写操作
		String line = null;
		while ((line = br.readLine()) != null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		// 释放资源
		bw.close();
		br.close();
	}
}

学习感悟

    IO的使用需要结合很多之前的知识,联系的知识比较广泛,比较容易犯晕.特别是同时操作输入和输出流对象时,容易将两者的操作混淆,应多加注意.还有就是输入流操作时不同的读取方法,也需要多加掌握.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值