黑马程序员_JAVA_IO(二)

来源:互联网 发布:网络机房有辐射吗 编辑:程序博客网 时间:2024/05/18 01:28
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


一、File类

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

特点:

        1、用来将文件或文件夹封装成对象

        2方便于对文件与文件夹的属性信息进行操作

        3File类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变

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

 

File对象创建方式:

       1、 File f =new File("a.txt");

       2、File f2=newFile("c:\\abc","b.txt");

       3、File d=new File("c:\\abc");

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

   

File.separator表示目录分隔符,可以跨平台使用。相当于路径中的“\”。 


File类的常见方法:

1、创建

        booleancreateNewFile();

        //在指定位置创建文件,如果该文件已经存在,则不创建,返回false。和输出流不一样,输出流对象一建立就创建文件。而且文件已经存在,会覆盖。

        boolean mkdir();//创建文件夹,只能创建一级文件夹

        boolean mkdirs();//创建多级文件夹

2、删除

        boolean delete();

        //删除文件或目录。文件存在,返回true;文件不存在或者正在被执行,返回false    

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

3、判断

        boolean canExecute();//是否是可执行文件

        boolean exists();//文件是否存在

        boolean isFile();//是否是文件

        boolean isDirectory();//是否是文件夹

        boolean isHidden();//是否是隐藏文件

        boolean isAbsolute();//文件是否是绝对路径

在判断文件对象是否是文件或者目录时,必须要判断该文件对象封装的内容是否存在。

4、获取信息

        String getName();//获取文件名

        String getPath();//获取文件的相对路径(即创建的对象传入的参数是什么就获取到什么)

        String getParent();//获取文件父目录。返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。如果相对路径中有上一层目录,那么该目录就是返回结果。

        String getAbsolutePath();//获取文件的绝对路径      

        long lastModified();//返回文件最后一次被修改的时间

        long length();//返回文件长度

renameTo(File f);重命名,还可以剪切文件。

5、列出文件及文件过滤

        static File[] listRoots();//列出可用的文件系统根目录,即系统盘符

        String[] list();//列出当前目录下所有文件,包括隐藏。调用list方法的file对象必须是封装了一个目录。该目录还必须存在。

        String[] list(FilenameFilter filter);//返回一个字符串数组,获取目录中满足指定过滤器的文件或目录。

        //FilenameFilter:文件名过滤器,是一个接口,其中包含一个方法,accept(Filedir,String name),返回的是boolean型,对不符合条件的文件过滤掉。

        File[] listFiles();//返回一个抽象路径名数组,获取当前文件夹下的所有文件和文件夹

        File[] ListFiles(FilenameFilter  filter);//返回抽象路径名数组,获取目录中满足指定过滤器的文件或目录。

import java.io.*;class Demo {public static void main(String[] args) throws Exception {File dir = new File("d://");String[] arr = dir.list(new FilenameFilter() {public boolean accept(File dir, String name) {if (name.endsWith(".java"))return true;elsereturn false;}});for (String s : arr) {System.out.println(s);}}}

递归

       当函数内每一次循环还可以调用本功能来实现,也就是函数自身调用自身。这种表现形式,或者编程手法,称为递归。

递归注意事项

        1、限定条件。是来结束循环调用,否则是死循环。

        2、注意递归的次数,尽量避免内存溢出。因为每次调用自身的时候都会先执行下一次调用自己的方法,所以会不断在栈内存中开辟新空间,次数过多,会导致内存溢出。

示例一

//删除一个带内容的目录import java.io.*;class RemoveDir {public static void main(String[] args) {// 指定目录File dir = new File("e:\\1");// 删除目录removeDir(dir);}// 删除传入目录public static void removeDir(File dir) {File[] files = dir.listFiles();// 列出目录下的所以文件和文件夹// 遍历for (File file : files) {// 如果还是目录且非隐藏if (!file.isHidden() && file.isDirectory())removeDir(file);// 继续删除目录里的内容elseSystem.out.println(file.toString() + ":-file-:" + file.delete());// 删除文件}System.out.println(dir + ":::dir:::" + dir.delete());// 删除目录}}
示例二
//将一个指定目录下的java文件的绝对路径,存储到一个文本文件中。建立一个java文件列表的文件import java.util.*;import java.io.*;class JavaFileList {public static void main(String[] args) {// 指定目录File dir = new File("e:/Java Study/Practice");// 定义一个List集合,用于存储.java文件的File对象List<File> list = new ArrayList<File>();// 调用获取文件路径方法fileToList(dir, list);// 指定写入文件File file = new File(dir, "javafilelist.txt");// 调用写入文件方法writeToFile(list, file);}// 获取指定文件夹内的所有java文件的绝对路径,并存入集合中public static void fileToList(File dir, List<File> list) {File[] files = dir.listFiles();// 列出dir路径下的所以文件和目录,// 遍历for (File file : files) {// 如果是目录,则继续获取if (file.isDirectory()) {list.add(file.getAbsoluteFile());// 把父目录路径也存入fileToList(file, list);}// 将是.java文件的绝对路径存入else if (file.getName().endsWith(".java"))list.add(file);}}// 将集合中元素写入到一个文本文件中public static void writeToFile(List<File> list, File file) {BufferedWriter bw = null;try { // 使用字符流缓冲区对象关联写入的文件bw = new BufferedWriter(new FileWriter(file));for (File file0 : list) {bw.write(file0.getAbsolutePath());// 写入bw.newLine();// 换行bw.flush();// 刷新}} catch (IOException e) {throw new RuntimeException("写入文件失败");} finally {try {if (bw != null)bw.close();// 关流} catch (IOException e) {throw new RuntimeException("流资源关闭失败");}}}}

二、Properties类

PropertiesHashtable的子类,它具备Map集合的特点。而且它里面还有存储的键值对,都是字符串,无泛型定义。是集合中和IO技术想结合的集合容器。

特点:1、可用于键值对形式的配置文件

            2在加载时,需要数据有固定的格式,常用的是:键=

 

常用方法

        Object setProperty(String key,String value); //设置键和值,调用Hashtable的方法put

        String getProperty(String key);//指定key搜索value

        Set<String> stringPropertyName();//返回属性列表的键集,存入Set集合

        void load(InputStream ism); //从输入字节流中读取属性列表(键和元素对)。又称将流中的数据加载进集合。

        void load(Reader reader); //从输入字符流中读取属性列表(键和元素对)。又称将流中的数据加载进集合。

        void list(PrintStream out);//将属性列表输出到指定的输出流

        void store(OutputStream out,String comments);//对应load(InputStream )将属性列表(键值对)写入输出流。comments属性列表的描述。

        void store(Writer writer, String comments);//对应load(Reader)将属性列表(键值对)写入输出流。comments属性列表的描述。

public static void method() 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("=");prop.setProperty(arr[0], arr[1]);}bufr.close();}


三、打印流(PrintWriter,PrintStream)

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


字节打印流:PrintStream

可接收的参数类型:

        1File对象。File

        2、字符串路径:String

        3、字符输出流:OutputStream

 字符串打印流:PrintWriter

可接受的参数类型

        1File对象: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();}}


四、序列流(SequenceInputStream)

对多个流进行合并,也被称为合并流。常用构造函数SequenceInputStream(Enumeration<?extends FileInputStream> e)

// SequenceInputStream实例import java.util.*;import java.io.*;class SequenceInputStreamDemo {public static void main(String[] args) throws IOException {// 创建vector集合,并添加相关流对象Vector<InputStream> ve = new Vector<InputStream>();ve.add(new FileInputStream("1.txt"));ve.add(new FileInputStream("2.txt"));ve.add(new FileInputStream("3.txt"));Enumeration<InputStream> en = ve.elements();// 创建枚举对象SequenceInputStream sis = new SequenceInputStream(en);// 合并流FileOutputStream fos = new FileOutputStream("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.util.*;import java.io.*;class SplitMergeFile {public static void main(String[] args) throws IOException {// 指定要切割的文件File file = new File("a.mp3");// 将指定文件进行切割splitFile(file);// 指定要合并到的文件File file1 = new File("b.mp3");// 将部分文件进行合并指定文件中merge(file1);}// 接收一个文件,将其按1M大小进行切割public static void splitFile(File file) throws IOException {// 关联要切割的文件BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));BufferedOutputStream bos = null;// 定义1M大小存储容器byte[] buf = new byte[1024 * 1024];int len = 0, x = 0;while ((len = bis.read(buf)) != -1) {// 每满1M就写入一个新文件中bos = new BufferedOutputStream(new FileOutputStream("D:\\" + (++x)+ ".part"));bos.write(buf, 0, len);bos.close();// 没写完一个文件要记得关流}// 关流bis.close();}// 将部分文件合并为一个可执行文件public static void merge(File file) throws IOException {// 定义一个集合存储这些部分文件关联路径数据ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();for (int x = 1; x <= 6; x++) {al.add(new FileInputStream("D:\\" + x + ".part"));}// 因为Enumeration是Vector特有的迭代方法,所以这里创建一个Enumeration类型的匿名内部类final ListIterator<FileInputStream> it = al.listIterator();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(file);// 定义临时存储数据的数组byte[] buf = new byte[1024];int len = 0;while ((len = sis.read(buf)) != -1) {fos.write(buf, 0, len);// 写数据}fos.close();sis.close();}}
0 0