您的位置:首页 > 编程语言 > Java开发

Java IO流(File概述)

2014-05-02 21:38 363 查看
-------
android培训、java培训、期待与您交流! ----------
 IO流--file概述

一、File概述

File类常见方法:

1,创建。

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

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

 

Boolean  mkdir():创建文件夹。

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

 

2,删除。

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

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

 

3,判断。

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

isFile():

boolean

isFile()

          测试此抽象路径名表示的文件是否是一个标准文件。

 

isDirectory();

 boolean

isDirectory()

          测试此抽象路径名表示的文件是否是一个目录。

 

isHidden();

 boolean

isHidden()

          测试此抽象路径名指定的文件是否是一个隐藏文件。

 

isAbsolute();

 boolean

isAbsolute()

          测试此抽象路径名是否为绝对路径名。

 

4,获取信息。

getName():返回由此抽象路径名表示的文件或目录的名称。

getPath():返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。

getParent():将此抽象路径名转换为一个路径名字符串。

getAbsolutePath() 返回此抽象路径名的绝对路径名形式。

long lastModified()  返回此抽象路径名表示的文件最后一次被修改的时间。

long length() 返回由此抽象路径名表示的文件的长度。

 

二、File对象功能

1、列出指定目录下文件或者文件夹,包含子目录中的内容。

   也就是列出指定目录下所有内容。

因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。

在列出过程中出现的还是目录的话,还可以再次调用本功能。

也就是函数自身调用自身。

这种表现形式,或者编程手法,称为递归。

 

递归要注意:

<
18e93
blockquote style="margin:0 0 0 40px;border:none;padding:0px;">

1)限定条件。

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

示例:

import java.io.*;

class FileDemo3 

{

public static void main(String[] args) 

{

File dir = new File("d:\\testdir");

//showDir(dir,0);

//toBin(6);

//int n = getSum(8000);

//System.out.println("n="+n);

 

System.out.println(dir.delete());

}

public static String getLevel(int level)

{

StringBuilder sb = new StringBuilder();

sb.append("|--");

for(int x=0; x<level; x++)

{

//sb.append("|--");

sb.insert(0,"|  ");

 

}

return sb.toString();

}

public static void showDir(File dir,int level)

{

System.out.println(getLevel(level)+dir.getName());

 

level++;

File[] files = dir.listFiles();

for(int x=0; x<files.length; x++)

{

if(files[x].isDirectory())

showDir(files[x],level);

else

System.out.println(getLevel(level)+files[x]);

}

}

运行结果:

 


 

 

递归示例

1) public static int getSum(int n)

{

if(n==1)

return 1;

return n+getSum(n-1);

}

 

2) public static void toBin(int num)

{

if(num>0)

{

toBin(num/2);

System.out.println(num%2);

}

}

3) public static void method()

{

method();

}

 




2、将一个指定目录下的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("d:\\java1223");

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;

}

}

}

}

 

3、Properties是hashtable的子类。     

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

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

那么在加载数据时,需要数据有固定格式:键=值。【比如:软件中的配置文件】

 

练习:

限制程序运行次数。当运行次数到达5次时,给出请您注册的提示。并不再让该程序执行。

用于记录应用程序运行次数,如果使用次数已到,那么给出注册提示。

很容易想到的是:计数器。

(可是该计数器定义在程序中,随着程序的运行而在内存中存在,并进行自增。

可是随着该应用程序的退出,该计数器也在内存中消失了。)

下一次在启动该程序,又重新开始从0计数。

这样不是我们想要的。

目标:

程序即使结束,该计数器的值也存在。

下次程序启动在会先加载该计数器的值并加1后在重新存储起来。

 

所以要建立一个配置文件。用于记录该软件的使用次数。

 

该配置文件使用键值对的形式。

这样便于阅读数据,并操作数据。

 

键值对数据是map集合。

数据是以文件形式存储,使用io技术。

那么map+io -->properties.

配置文件可以实现应用程序数据的共享。

示例:

import java.io.*;

import java.util.*;

class  RunCount

{

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

{

Properties prop = new Properties();

File file = new File("count.ini");

if(!file.exists())

file.createNewFile();

FileInputStream fis = new FileInputStream(file)

prop.load(fis);

int count = 0;

String value = prop.getProperty("time");

if(value!=null)

{

count = Integer.parseInt(value);//字符串转成基本数据类型。

if(count>=5)

{

System.out.println("您好,使用次数已到,拿钱!");

return ;

}

 

}

 

count++;

 

prop.setProperty("time",count+"");

 

FileOutputStream fos = new FileOutputStream(file);

 

prop.store(fos,"");

 

fos.close();

fis.close();

}

}

 

/*

name=zhangsan

age=2

XML格式

<persons>

<person id="001">

<name>zhagnsan</name>

<age>30</age>

<address>bj</address>

</person>

<person>

<name

</person>

</persons>

*/

 

PropertiesDemo 

示例:

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);

}

// 设置和获取元素。

public static void setAndGet()

{

Properties prop = new Properties();

 

prop.setProperty("zhangsan","30");

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

 

// 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));

}

}

}

 

 

 

 

4、IO中其他类

打印流:

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

【记住】

字节打印流:

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();

}

}

 

5、切割合并文件

 

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();//匿名内部类访问局部变量,加final

 

枚举 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];  //如果想切500M的东西  ,不能[1024*1024*100];

//这个样一次一百兆,会产生内存溢出。正确的做法是还是1M的数组,

//可以添加计数器,切了100次,在开辟一个输出流对象分别存

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();

}

}

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: