黑马程序员---java基础之IO(File类及其他流对象)

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

File类
用于将文件或文件夹封装成对象,方便对文件与文件夹的属性信息进行操作.
File对象可以作为参数传递给流的构造函数.
File类常见方法:
1,创建。
boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
和输出流不一样,输出流对象一建立创建文件。如果文件已经存在,会覆盖。
boolean mkdir():创建文件夹。
boolean mkdirs():创建多级文件夹。
2,删除。
boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel。
void deleteOnExit();在程序退出时删除指定文件。  通常用于删除临时文件
3,判断。
boolean exists() :文件是否存在. 
记住在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。通过exists判断
isFile():是不是标准文件
isDirectory();是不是目录
isHidden();是不是隐藏
isAbsolute();是不是绝对路径
4,获取信息。
getName():获取名称
getPath():获取路径
getParent():获取父目录());//该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。
//如果相对路径中有上一层目录那么该目录就是返回结果。
getAbsolutePath() 获取绝对路径 
long lastModified() 最后一次修改的时间
long length() 文件大小
list() 调用list方法的file对象必须是封装了一个目录。该目录还必须存在。

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

示例:列出目录下的所有文件

public static void showDir(File file){
		System.out.println(file.getAbsolutePath());//输出文件的绝对路径
		File[] files = file.listFiles();//获取目录列表
		for(File f:files){//遍历列表
			if(f.isDirectory()){
				showDir(f);//如果是目录,就继续递归
			}
			else
				System.out.println(f.getAbsolutePath()+f.getName());//不是目录就删除文件
		}
	}
递归要注意:
1,限定条件。
2,要注意递归的次数。尽量避免内存溢出。

删除一个带内容的目录。
删除原理:
在window中,删除目录从里面往外删除的。
既然是从里往外删除。就需要用到递归。

public static void removeDir(File file){
		File[] files = file.listFiles();//获取文件夹列表
		for(File f:files){//遍历列表
			if(f.isDirectory())
				removeDir(f);//如果是文件夹就继续递归
			else
				System.out.println(f.getName()+"---file---"+f.delete());//如果是文件就删除
		}
		System.out.println(file.getName()+"---dir---"+file.delete());//删除当前文件夹
	}

Properties

该类是hashtable的子类。
也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。
是集合中和IO技术相结合的集合容器。
该对象的特点:可以用于键值对形式的配置文件。
那么在加载数据时,需要数据有固定格式:键=值。

综合示例:实现程序运行到3次就给出注册信息

public static void main(String[] args) throws IOException
	{
		Properties prop = new Properties();//创建Properties对象
		File file = new File("count.ini");//创建File对象,关联配置文件
		if(!file.exists())//如果配置文件不存在,就创建配置文件
			file.createNewFile();		
		FileInputStream fis = new FileInputStream(file);//创建字节读取流并关联配置文件
		prop.load(fis);//Properties对象关联流对象
		int count = 0;//定义计数器
		String value = prop.getProperty("time");//获取time键的value		
		if(value!=null){//如果计数器不为空,就将value取出并进行次数判断
			count = Integer.parseInt(value);
			if(count>=3){
				System.out.println("您好,使用次数已到,请注册!");
				return ;
			}
		}
		count++;//计数器+1
		prop.setProperty("time",count+"");//设置配置文件value+1
		FileOutputStream fos = new FileOutputStream(file);//创建写入流关联配置文件
		prop.store(fos,"");//将流中的内容写入配置文件
		fos.close();//关流
		fis.close();		
	}

打印流:
该流提供了打印方法,可以将各种数据类型的数据都原样打印。
字节打印流:
PrintStream
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
字符打印流:
PrintWriter
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
4,字符输出流,Writer。

示例:将键盘输入的内容打印在控制台上

public static void PrintStreamMethod(){
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//键盘输入读取流
		PrintStream ps = new PrintStream(System.out,true);//创建打印流与屏幕输出关联,并且自动刷新
		String line = null;
		try {
			while((line = bufr.readLine()) != null){//循环读取键盘录入
				if("exit".equals(line))//如果输入exit就退出程序
					break;
				ps.println(line);//将line打印到控制台
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

合并流:SequenceOutputStream

将多个流按照顺序枚举合并到一个流中
示例:

Vector<FileInputStream> v = new Vector<FileInputStream>();
v.add(new FileInputStream("1.txt"));
v.add(new FileInputStream("2.txt"));
v.add(new FileInputStream("3.txt"));
Enumeration<FileInputStream> en = v.elements();
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fw = new FileOutputStream("4.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len = sis.read(buf))!=-1)
{
	fw.write(buf,0,len);
}
fw.close();
sis.close();
合并流步骤:
1.确定合并后的目的地,,
2.创建集合存储需要合并的文件所对应的FileInputstream对象.
3.创建集合的迭代器,因为下面要调用,所以要定义为final
4.建立Enumeration对象,<复写Enumeration中的hasMoreElements()方法和nextElement()方法>
5,建立SequenceInputStream对象,将建立的Enumeration对象作为参数传入
6,从SequenceInputStream对象读取写入目的地操作


切割操作
1.确定需要操作的源文件,FileInputStream对象
2.定义一个空的FileOutputstream对象
3.定义一个计数器,每写一次,计数器+1,从而控制切割后文件的大小.
4.定义一个文件名计数器,
4.while循环读取写入,在循环中new切割后的文件,当计数器加到指定次数后,文件名计数器+1并且,continue,进行下个文件的写入
FileInputStream fis =  new FileInputStream("c:\\1.bmp");
		FileOutputStream fos = null;
		byte[] buf = new byte[1024*1024];
		int len = 0;
		int count = 1;//文件名计数器
		int flag = 0;//写入次数计数器
		while((len=fis.read(buf))!=-1)
		{
			fos = new FileOutputStream("c:\\splitfiles\\"+(count++)+".part");
			fos.write(buf,0,len);
			fos.flush();
			flag++;
			if (flag == 10){
				count++;
				flag = 0;
				continue;
			}
		}
		
		fis.close();

操作对象:(对象的序列化)
ObjectInputStream,ObjectOutputStream
被操作的对象需要实现Serializable(标记接口)

管道流
PipedInputStream和PipedOutputStream
输入输出可以直接进行连接,通常结合线程使用.

RandomAccessFile
随机访问文件,
该类不是算是IO体系中子类。
而是直接继承自Object。

但是它是IO包中成员。因为它具备读和写功能。
内部封装了一个数组,而且通过指针对数组的元素进行操作。
可以通过getFilePointer获取指针位置,
同时可以通过seek改变指针的位置。

其实完成读写的原理就是内部封装了字节输入流和输出流。

通过构造函数可以看出,该类只能操作文件。
而且操作文件还有模式:只读r,读写rw等。

如果模式为只读 r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常。
如果模式rw。操作的文件不存在,会自动创建。如果存则不会覆盖。

可以实现数据的分段写入,例如多线程同时写入.


DataInput和DataOutput

操作基本数据类型
可以用于操作基本数据类型的数据的流对象。
DateInputStream,DateOutputSteram
操作字节数组
ByteArrayInputStream,ByteArrayOutputStream
用于操作字节数组的流对象。
ByteArrayInputStream :在构造的时候,需要接收数据源,。而且数据源是一个字节数组。
ByteArrayOutputStream: 在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。
这就是数据目的地。
因为这两个流对象都操作的数组,并没有使用系统资源。
所以,不用进行close关闭。
在流操作规律讲解时:
源设备,
键盘 System.in,硬盘 FileStream,内存 ArrayStream。
目的设备:
控制台 System.out,硬盘FileStream,内存 ArrayStream。
用流的读写思想来操作数据。
操作字符数组
CharArrayReader,CharArrayWriter
操作字符串
StringReader,StringWriter

字符编码
字符流的出现为了方便操作字符,更重要的是加入了编码转换.
通过子类转换流来完成
InputStreamReader和OutputStreamWriter
在两个对象进行构造的时候可以加入字符集
常见的编码表
ASCII:美国标准信息交换码
用一个字节的7位可以表示.
ISO8859-1:拉丁码表.欧洲码表
用一个字节的8位表示.
GB2312:中国的中文编码表
GBK:中国的中文编码表升级,融合了更多的中文文字符号.

用两个字节代表一个字符

Unicode:国际标准码,融合了多种文字

所有文字都是用两个字节来表示,JAVA语言使用的就是Unicode
UTF-8:最多用三个字节来表示一个字符.

编码:字符串变成字节数组。
解码:字节数组变成字符串。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值