码迷,mamicode.com
首页 > 编程语言 > 详细

java基础6:I/O

时间:2015-04-08 21:36:11      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:io   javase   


关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 一、概述

1、定义

在变量数组中和对象中存放的数据是暂时的,程序结束后就会丢失。为了能够永久的保存数据,需要将其存储在磁盘中。

java中的I/O技术可以将数据保存到本地,以达到永久保存的要求。

2、流

流是一组有序的序列,根据操作的类型,可分为输入流和输出流。

技术分享

3、IO.体系

字节流的两个顶层父类:

1,InputStream  2,OutputStream.


字符流的两个顶层父类:

1,Reader 2,Writer


这些体系的子类都以父类名作为后缀。 

而且子类名的前缀就是该对象的功能。

如图:

技术分享



 二、字符流

1、字符流的由来:

其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字。

在对这个文字进行操作。简单说:字节流+编码表 

2、FileReader与FileWriter

aFileWirter写入文本

<span style="font-size:14px;">FileWriter fw = new FileWriter("d:\\jinfulin.txt"); 
w.write("dfs");
fw.close();</span>

bFileReader读取文本

<span style="font-size:14px;">FileReader fr = new FileReader("d:\\jinfulin.txt");
int num1 = fr.read();//读取第一个字符
int num2 = fr.read();//再次调用读取第二个字符(流特性嘛)
 System.out.println((char)num1);//打印,将数字转成字符
 System.out.println((char)num2);</span>

c、字符缓冲区

<span style="font-size:14px;">	FileReader fr = new FileReader("demo.txt");
		/*
		 * 使用read(char[])读取文本文件数据。
		 *  
		 * 先创建字符数组。
		 */
		char[] buf = new char[1024];

		int len = 0;
		
		while((len=fr.read(buf))!=-1){//没有字符了读到数据位-1
			System.out.println(new String(buf,0,len));
		}
<span style="white-space:pre">		</span>fr.close();</span>

d、如何将一些文字存储到硬盘一个文件中?

技术分享

3、字符流缓冲区对象--BfferedReader与BufferedWriter

BfferedReader与BufferedWriter类就是把缓冲器封装成了对象,原理是一样的。
举例:文本从一个盘复制到另一个盘修改版


技术分享

 三、字节流

字节流和字符流的基本操作是相同的,但字节流还可以操作其他媒体文件。

多说就是鄙视大家的智商了,举个例子来看看就好,

例:复制mp3

<span style="font-size:14px;">	private static void myStreamCopy() throws IOException {
		
		//定义输入输出流并加缓冲区
		BufferedOutputStream buffo = new BufferedOutputStream(new FileOutputStream("f:\\copy.mp3"));
		BufferedInputStream buffi = new BufferedInputStream(new FileInputStream("f:\\风吹麦浪.mp3"));
		
		//开始复制
		int ch = 0;
		while((ch = buffi.read()) != -1)
		{
			buffo.write(ch);
		}
		
		//关闭流
		buffo.close();
		buffi.close();
		
	}</span>


 四、转换流

1、 转换流的由来:

       a、字符流与字节流之间的桥梁
       b、方便了字符流与字节流之间的操作


2、转换流的应用:

      字节流中的数据都是字符时,转成字符流操作更高效。
InputStreamReader :字节到字符的桥梁。解码。
OutputStreamWriter:字符到字节的桥梁。编码。

3、举例:将控制台上的文字存储到文件中

<span style="font-size:14px;"><span style="white-space:pre">	</span>/*
	 * 将控制台输入的文字存储到文件中。
	 */
	public static void main(String[] args) throws IOException {
		
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("F:\\jinfulin.txt")));
		
		String line =  null;

		while((line = bufr.readLine()) != null)
		{
			if("over".equals(line))
				break;
			bufw.write(line);
			System.out.println(line);
		}
		
		bufr.close();
		bufw.close();
	}
</span>



 

 五、流操作的基本规律

因为流对象太多,开发时不知道用哪个对象合适。弄清规律有助于我们使用。


1,明确源和目的

源:InputStream  Reader

目的:OutputStream  Writer

 

2,明确数据是否是纯文本数据。

源:是纯文本:Reader

---------否:InputStream

目的:是纯文本 Writer

------否:OutputStream

3,明确具体的设备。

源设备:

硬盘:File

键盘:System.in

内存:数组

网络:Socket

目的设备:

硬盘:File

控制台:System.out

内存:数组

网络:Socket

 

4,是否需要其他额外功能。

1,是否需要高效(缓冲区);

2,转换。


技术分享

 六、File类

1、定义:

文件和目录路径名的抽象表现形式

2、特点:

        1)用来将文件或文件夹封装成对象
        2)方便于对文件与文件夹的属性信息进行操作
        3)File类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变
        4)File对象可以作为参数传递给流的构造函数

3、初始化:

<span style="font-size:14px;">//可以将一个已存在的,或者不存在的文件或者目录封装成file对象。
		File f1 = new File("c:\\a.txt");
		
		File f2 = new File("c:\\","a.txt");
		
		File f = new File("c:\\");
		
		File f3 = new File(f,"a.txt");

		File f4 = new File("c:"+File.separator+"abc"+File.separator+"a.txt");</span>

4、 File对象的常见方法。


a、获取
<span style="font-size:14px;"><span style="white-space:pre">		</span>File file = new File("a.txt");
		
		String name = file.getName();//获取文件名(a.txt)
		String absPath = file.getAbsolutePath();//绝对路径。
		String path = file.getPath();//相对路径
		long len = file.length();//文件长度(大小)
		long time = file.lastModified();//最后修改时间</span>

b、创建于删除
<span style="font-size:14px;">File dir = new File("f:\\a1\\22\\jin.txt");
		
 		boolean b = dir.mkdir();//创建文件
 		dir.mkdirs();//创建多级目录
		System.out.println(dir.delete()); 
 		boolean b = file.createNewFile();//如果不存在就创建		</span>
c、判断
<span style="font-size:14px;"> 		boolean b = f.exists();	// 判断是否存在。 
		
		System.out.println(f.isFile());//是否是文件
		System.out.println(f.isDirectory());//是否是一个目录</span>

d、重命名
<span style="font-size:14px;"><span style="white-space:pre">		</span>File f1 = new File("c:\\kkk.mp3");
		File f2 = new File("d:\\ccc.mp3");	
		boolean b = f1.renameTo(f2);	
		System.out.println("ccc="+b);</span>

5、 拓展应用

a、 获取当前目录下的文件以及文件夹的名称,包含隐藏文件。
<span style="font-size:14px;">		String[] names = file.list();
<span style="white-space:pre">		</span>if(names == null)//如果为空就返回,避免出现空指针异常
<span style="white-space:pre">			</span>return;
		System.out.println(names.length);
		
		for(String name : names){
			System.out.println(name);
		}</span>


b、过滤所有以某某结尾的文件

技术分享技术分享
c、深度历遍所有文件

技术分享



d、删掉一个文件夹(从里往外删,递归)

<span style="font-size:14px;">public class DeleteAll {

	public static void main(String[] args) {
		File dir = new File("f:\\1234");
//		dir.delete();//直接删是删不掉的
		dirdelete(dir);
	}
	private static void dirdelete(File dir) {
		File[] files = dir.listFiles();
		if (files == null)
			return;
		
		for (File file : files) {
			if(file.isDirectory()){//如果是目录就递归
				dirdelete(file);
			}
			//不是目录就删掉
			System.out.println(file.getAbsolutePath() + "----"+ file.delete());
		}
		//最后再删掉根目录的文件夹(此时已经空了)
		System.out.println(dir.getAbsolutePath() + "----"+ dir.delete());
	}

}</span>


 七、Properties类




1、概述

Properties类并不属于IO包中的类,而是属于map集合,在前面map集合章节也有提到,不过由于该集合中数据用到流,在这里说更合适。

2、特点:

  1,该集合中的键和值都是字符串类型。
  2,集合中的数据可以保存到流中,或者从流获取。 通常该集合用于操作以键值对形式存在的配置文件。  

3、举例

定义功能,获取一个应用程序运行的次数,如果超过5次,给出使用次数已到请注册的提示。并不要在运行程序。


<span style="font-size:14px;">public static void getAppCount() throws IOException{
		
		//将配置文件封装成File对象。
		File confile = new File("count.properties");
		
		if(!confile.exists()){//健壮性判断
			confile.createNewFile();
		}
		
		//集合中的数据来自于一个文件。 
		//注意;必须要保证该文件中的数据是键值对。
		//需要使用到读取流。 
		FileInputStream fis = new FileInputStream(confile);
		Properties prop = new Properties();
		prop.load(fis);//集合中加载一个文件输入流
		
		//从集合中通过键获取次数。		
		String value = prop.getProperty("time");
		//定义计数器。记录获取到的次数。
		int count =0;
		if(value!=null){
			count = Integer.parseInt(value);
			if(count>=5){
				throw new RuntimeException("使用次数已到,请注册,给钱!");
			}
		}
		count++;
		//将改变后的次数重新存储到集合中。
		//将集合中数据存储到文件中,使用store方法。
		prop.setProperty("time", count+"");
		FileOutputStream fos = new FileOutputStream(confile);
		prop.store(fos, "注释.....");
		fos.close();
		fis.close();		
	}</span>


 八、最后

由于I/O这部分知识比较多,也比较重要,所有我分成两篇博客来写,欢迎大家看下一篇博客。


java基础6:I/O

标签:io   javase   

原文地址:http://blog.csdn.net/jinfulin/article/details/44946703

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!