黑马程序员————IO流3(day20)

----------------------ASP.Net+Android+IOS开发----------------------期待与您交流!

 

 

IO3

l  File概述

l  File类常见方法

l  列出目录下所有内容-递归

l  删除带内容的目录

l  创建java文件列表

l  Properties简述

l  Properties存取

l  Properties存取配置文件

l  PrintWriter

l  合并流

l  切割文件

 

 

File概述

File

用来将文件或者文件夹封装成对象,方便对文件与文件夹进行操作。

File对象可以作为参数传递给流的构造函数。

了解File类中的常用方法。

 

File类似乎IO包中唯一代表磁盘文件本身的对象。File类定义了一些与平台无关的方法来操纵文件,通过调用File类提供的各种方法,能够完成创建、删除文件,重命名文件等,判断文件的读写权限及文件是否存在,设置和查询文件的最近修改时间等操作。

 

示例:

import java.io.*;

class FileDemo {
	public static void main(String[] args) {
		consMethod();
	}

	// 创建File对象
	public static void consMethod() {
		// 将a.txt封装成file对象。可以将已有的和未出现的文件或者文件夹封装成对象
		File f1 = new File("a.txt");// 相对路径,输出时就输出相对路径
		File f2 = new File("f:\\abc", "b.txt");// 绝对路径,输出时就输出绝对路径

		File d = new File("d:\\abc");
		File f3 = new File(d, "c.txt");

		System.out.println("f1:" + f1);
		System.out.println("f2:" + f2);
		System.out.println("f3:" + f3);

		// File.separator代表目录分隔符,可以跨平台,相当于\\
		File f4 = new File("f:" + File.separator + "abc" + File.separator
				+ "zzz" + File.separator + "a.txt");
	}
}


 

运行结果:f1:a.txt

f2:f:\abc\b.txt

f3:d:\abc\c.txt

 

Java能正确处理UNIXWindows/DOS约定路径分隔符。如果在Windows版本的Java下用斜线(/),路径处理依然正确。记住:如果Windows/DOS使用反斜线(\)的约定,就需要在字符串内使用它的转移序列(\\)Java约定是用UNIXURL风格的斜线来作路径分隔符。

 

 

File类常见方法

File类常见方法:

1.      创建

boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false

和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。

boolean mkdir():创建文件夹。

boolean mkdirs():创建多级文件夹。

2.      删除

boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel

void deleteOnExit();在程序退出时删除指定文件。

3.      判断

boolean exists() :文件是否存在.

isFile():

isDirectory();

isHidden();

isAbsolute();

4.      获取信息

getName():

getPath():

         getParent():

getAbsolutePath()

long lastModified()

long length()

 

创建删除示例:

import java.io.*;

class FileDemo {
	public static void main(String[] args) throws IOException {
		method_1();
	}

	public static void method_1() throws IOException {
		File f = new File("file.txt");

		// 在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
		System.out.println("create:" + f.createNewFile());
		// f.deleteOnExit();// 在程序退出时删除指定文件。
		// 删除失败返回false。如果文件正在被使用,则删除不了返回falsel。
		System.out.println("delete:" + f.delete());
	}


 

判断示例:

import java.io.*;

class FileDemo {
	public static void main(String[] args) throws IOException {
		method_2();
	}

	// 判断
	public static void method_2() {
		File f1 = new File("file.txt");
		System.out.println("exists:" + f1.exists());// 判断文件是否存在
		// System.out.println("execute:"+f1.canExecute());

		// 创建文件夹
		// File dir = new File("abc\\kkk\\a\\a\\dd\\ee\\qq\\aaa");
		// System.out.println("mkdir:"+dir.mkdirs());

		File f2 = new File("F:\\myjava\\Demo\\src\\day20\\IO\\file2.txt");
		// f.createNewFile();
		// f.mkdir();

		// 记住在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。
		// 通过exists判断。
		System.out.println("dir:" + f2.isDirectory());// 判断f2是目录吗
		System.out.println("file:" + f2.isFile());// 判断f2是文件吗
		System.out.println(f2.isAbsolute());// 判断f2路径是否为绝对路径
	}


 

运行结果:exists:false

dir:false

file:false

true

 

 

获取示例:

import java.io.*;

class FileDemo {
	public static void main(String[] args) throws IOException {
		method_3();
	}

	// 获取
	public static void method_3() {
		File f1 = new File("file.txt");
		System.out.println("path:" + f1.getPath());// 封装成什么路径就获取什么路径
		System.out.println("abspath:" + f1.getAbsolutePath());// 不管封装成什么,只获取绝对路径
		// 该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null
		// 如果相对路径中有上一层目录那么该目录就是返回结果
		System.out.println("parent:" + f1.getParent());// 把f2重命名为f3,Test.java重命名为haha.java

		File f2 = new File("f:\\Test.java");
		File f3 = new File("f:\\haha.java");
		System.out.println("rename:" + f2.renameTo(f3));
	}


 

运行结果:path:file.txt

abspath:F:\myjava\Demo\file.txt

parent:null

rename:true

 

 

列出目录下所有内容-递归

列出指定目录下文件或者文件夹,包含子目录中的内容,也就是列出指定目录下所有内容。

 

因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。在列出过程中出现的还是目录的话,还可以再次调用本功能,也就是函数自身调用自身,这种表现形式,或者编程手法,称为递归。

 

递归要注意:

1.      限定条件

2.      要注意递归的次数,尽量避免内存溢出。

 

示例:

import java.io.*;

class FileDemo2 {
	public static void main(String[] args) {
		File dir = new File("f:\\myjava");
		showDir(dir);
		//toBin(6);
		//int n = getSum(100);
		//System.out.println("n="+n);
	}
	
	// 累加和
	public static int getSum(int n){
		if(n==1)
			return 1;
		return n+getSum(n-1);// 递归,函数自身调用自身
	}
	
	// 转二进制
	public static void toBin(int num){
		if(num>0){
			toBin(num/2);// 递归,函数自身调用自身
			System.out.println(num%2);
		}
	}
	
	
	// 列出指定目录下文件或者文件夹,包含子目录中的内容
	public static void showDir(File dir){
		System.out.println(dir);
		File[] files = dir.listFiles();
		for(int x=0;x<files.length; x++){
			if(files[x].isDirectory())
				showDir(files[x]);// 递归,函数自身调用自身
			else {
				System.out.println(files[x]);
			}
		}
	}
}


 

删除带内容的目录

删除一个带内容的目录。

 

删除原理:

window中,删除目录从里面往外删除的,既然是从里往外删除,就需要用到递归。

 

示例:

import java.io.*;

class RemoveDir {
	public static void main(String[] args) {
		File dir = new File("f:\\myjava1");
		removeDir(dir);
	}

	public static void removeDir(File dir) {
		File[] files = dir.listFiles();

		for (int x = 0; x < files.length; x++) {
			if (files[x].isDirectory())
				removeDir(files[x]);
			else
				System.out.println(files[x].toString() + ":-file-:"
						+ files[x].delete());
		}
		System.out.println(dir + "::dir::" + dir.delete());
	}
}


 

创建java文件列表

将一个指定目录下的java文件的绝对路径,存储到一个文本文件中,建立一个java文件列表文件。

 

思路:

1.      对指定的目录进行递归。

2.      获取递归过程所以的java文件的路径。

3.      将这些路径存储到集合中。

4.      将集合中的数据写入到一个文件中。

 

示例:

import java.io.*;
import java.util.*;

class JavaFileList {
	public static void main(String[] args) throws IOException {
		File dir = new File("f:\\myjava");
		List<File> list = new ArrayList<File>();
		fileToList(dir, list);

		// System.out.println(list.size());

		File file = new File(dir, "javalist.txt");
		writeToFile(list, file.toString());

	}

	public static void fileToList(File dir, List<File> list) {
		File[] files = dir.listFiles();

		for (File file : files) {
			if (file.isDirectory())
				fileToList(file, list);
			else {
				if (file.getName().endsWith(".java"))
					list.add(file);
			}
		}
	}

	public static void writeToFile(List<File> list, String javaListFile)
			throws IOException {
		BufferedWriter bufw = null;
		try {
			bufw = new BufferedWriter(new FileWriter(javaListFile));

			for (File f : list) {
				String path = f.getAbsolutePath();
				bufw.write(path);
				bufw.newLine();
				bufw.flush();
			}

		} catch (IOException e) {
			throw e;
		} finally {
			try {
				if (bufw != null)
					bufw.close();
			} catch (IOException e) {
				throw e;
			}
		}
	}
}


 

Properties简述

Propertieshashtable的子类,也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串,是集合中和IO技术相结合的集合容器。

该对象的特点:可以用于键值对形式的配置文件。

那么在加载数据时,需要数据有固定格式:键=值。

 

 

Properties存取

示例:

import java.io.*;
import java.util.*;

class PropertiesDemo {
	public static void main(String[] args) {
		setAndGet();
	}

	// 设置和获取元素
	public static void setAndGet() {
		Properties prop = new Properties();
		prop.setProperty("zhangsan", "20");
		prop.setProperty("lisi", "30");

		// System.out.println(prop);
		String value = prop.getProperty("lisi");
		// System.out.println(value);

		prop.setProperty("lisi", 89 + "");

		Set<String> names = prop.stringPropertyNames();
		for (String s : names) {
			System.out.println(s + ":" + prop.getProperty(s));
		}
	}
}


 

Properties存取配置文件

示例:

import java.io.*;
import java.util.*;

class PropertiesDemo {
	public static void main(String[] args) throws IOException {
		// method_1();
		loadDemo();
	}

	public static void loadDemo() throws IOException {
		Properties prop = new Properties();
		FileInputStream fis = new FileInputStream("info.txt");

		// 将流中的数据加载进集合。
		prop.load(fis);

		prop.setProperty("wangwu", "39");

		FileOutputStream fos = new FileOutputStream("info.txt");

		prop.store(fos, "haha");

		// System.out.println(prop);
		prop.list(System.out);

		fos.close();
		fis.close();

	}

	// 演示,如何将流中的数据存储到集合中。
	// 想要将info.txt中键值数据存到集合中进行操作。
	
	/*
	 * 1,用一个流和info.txt文件关联。 2,读取一行数据,将该行数据用"="进行切割。
	 * 3,等号左边作为键,右边作为值。存入到Properties集合中即可。
	 */
	public static void method_1() throws IOException {
		BufferedReader bufr = new BufferedReader(new FileReader("info.txt"));

		String line = null;
		Properties prop = new Properties();

		while ((line = bufr.readLine()) != null) {
			String[] arr = line.split("=");
			// /System.out.println(arr[0]+"...."+arr[1]);
			prop.setProperty(arr[0], arr[1]);
		}

		bufr.close();

		System.out.println(prop);
	}
}


 

PrintWriter

打印流:

该流提供了打印方法,可以将各种数据类型的数据都原样打印。

 

字节打印流:PrintStream,构造函数可以接收的参数类型:

1.      file对象。File

2.      字符串路径。String

3.      字节输出流。OutputStream

 

字符打印流:PrintWriter,构造函数可以接收的参数类型:

1.      file对象。File

2.      字符串路径。String

3.      字节输出流。OutputStream

4.      字符输出流,Writer

 

示例:

import java.io.*;

class PrintStreamDemo {
	public static void main(String[] args) throws IOException {
		BufferedReader bufr = new BufferedReader(new InputStreamReader(
				System.in));

		PrintWriter out = new PrintWriter(new FileWriter("a.txt"), true);

		String line = null;

		while ((line = bufr.readLine()) != null) {
			if ("over".equals(line))
				break;
			out.println(line.toUpperCase());
			// out.flush();
		}

		out.close();
		bufr.close();
	}
}


 

合并流

示例:

import java.io.*;
import java.util.*;

class SequenceDemo {
	public static void main(String[] args) throws IOException {

		Vector<FileInputStream> v = new Vector<FileInputStream>();

		v.add(new FileInputStream("f:\\1.txt"));
		v.add(new FileInputStream("f:\\2.txt"));
		v.add(new FileInputStream("f:\\3.txt"));

		Enumeration<FileInputStream> en = v.elements();

		SequenceInputStream sis = new SequenceInputStream(en);

		FileOutputStream fos = new FileOutputStream("f:\\4.txt");

		byte[] buf = new byte[1024];

		int len = 0;
		while ((len = sis.read(buf)) != -1) {
			fos.write(buf, 0, len);
		}
		fos.close();
		sis.close();
	}
}


 

切割文件

示例:

import java.io.*;
import java.util.*;

class SplitFile {
	public static void main(String[] args) throws IOException {
		// splitFile();
		merge();
	}

	public static void merge() throws IOException {
		ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();

		for (int x = 1; x <= 3; x++) {
			al.add(new FileInputStream("c:\\splitfiles\\" + x + ".part"));
		}

		final Iterator<FileInputStream> it = al.iterator();

		Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {
			public boolean hasMoreElements() {
				return it.hasNext();
			}

			public FileInputStream nextElement() {
				return it.next();
			}
		};

		SequenceInputStream sis = new SequenceInputStream(en);

		FileOutputStream fos = new FileOutputStream("c:\\splitfiles\\0.bmp");

		byte[] buf = new byte[1024];

		int len = 0;

		while ((len = sis.read(buf)) != -1) {
			fos.write(buf, 0, len);
		}
		fos.close();
		sis.close();
	}

	public static void splitFile() throws IOException {
		FileInputStream fis = new FileInputStream("c:\\1.bmp");

		FileOutputStream fos = null;

		byte[] buf = new byte[1024 * 1024];

		int len = 0;
		int count = 1;
		while ((len = fis.read(buf)) != -1) {
			fos = new FileOutputStream("c:\\splitfiles\\" + (count++) + ".part");
			fos.write(buf, 0, len);
			fos.close();
		}
		fis.close();
	}
}


 

 

 

----------------------ASP.Net+Android+IOS开发----------------------期待与您交流!

详情请查看:http://edu.csdn.net

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值