IO流 2

File类

 

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

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

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

了解File类中的常用方法。

 

1.概述

          //将a.txt封装成File对象
          //可以将已有的和未出现的文件或者文件夹封装成对象。

          //文件路径
          File f1 = new File("d:\\FileDemo\\a.txt");

          //父目录,文件名
          File f2 = new File("d:\\FileDemo\\abc", "b.txt");

          //目录
          File d = new File("d:\\FileDemo\\abc");//
          //父目录,文件名
          File f3 = new File(d,"d.txt");

          //跨平台分隔符separator
          File f4 = new File("c:"+File.separator+"d.txt");

2.创建和删除

2.1.创建

    1)创建文件

    boolean createNewFile();

  在指定位置创建文件,如果该文件已经存在,则不创建,返回false。

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

File f = new File("d:\\FileDemo\\file.txt");
f.createNewFile();

创建临时文件

createTempFile(String prefix, String suffix);

createTempFile(String prefix, String suffix, File directory);

2)创建目录

boolean mkdir();   创建文件夹(只能创建1级目录)

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

2.2 删除

1) 删除

boolean delete();     删除失败返回false。

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

3. 判断

1)  文件是否可以执行

      File f = new File("d:\\FileDemo\\file.txt");

    sop("execute" + f.canExecute());

2) 文件是否存在

boolean exists()

3)是否是文件 和 是否是目录

注意 首先要判断该文件对象封装的内容是否存在 通过exists()判断

boolean isDirectory()

boolean isFile()

4)判断是否是隐藏文件

isHidden()

5)判断是否是绝对路径 不需要文件存在

boolean isAbsolute()

4.获取信息

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

getPath();     // 返回对象封装的路径、

getParent(); //该方法返回对象封装路径中的父目录,如果是相对路径,返回空

//如果路径中有上一层目录,那么该目录就是返回结果

File getAbsoluteFile(); //返回绝对路径的File对象

String getAbsolutePath();//返回绝对路径

lastModified();

length();

f1.renameTo(f2)  //可以是不同的目录 相当于剪切

3.文件列表

 

3.1 listRoots和list方法

public static File[] listRoots()     //listRoots列出机器中的盘符

public String[] list()                    //list列出目录中的内容

调用list方法的file对象必须是封装了一个目录。该目录还必须存在.

如果不存在返回空指针异常

 

 

import java.io.*;

class FileDemo2
{
     public static void main(String[] args)
     {
          //listRootsDemo();
          listDemo();
     }
     public static void listDemo()
     {
          //File f = new File("c:\\abc.txt");
          File f = new File("c:\\");

          String[] names = f.list();//调用list方法的file对象必须是封装了一个目录。该目录还必须存在。
          for(String name:names)
          {
               System.out.println(name);
          }
     }
     public static void listRootsDemo()
     {
          File[] files = File.listRoots();

          for(File f:files)
          {
               System.out.println(f.length());
          }
     }
}
 

3.2 文件列表 FilenameFilter

public String[] list(FilenameFilter filter)

FilenameFilter是一个接口,里面只有一个方法:

boolean accept(File dir, String name)

//列出d盘中所有的txt文件

public static void listDemo2()
     {
          File dir = new File("d:\\");
          String[] arr = dir.list(new FilenameFilter()
                    {
                         public boolean accept(File dir,String name)
                         {
                              //System.out.println("dir:"+dir+"name:"+name);
                              return name.endsWith("txt");
                         }
                    }

                    );

          System.out.println("len:"+arr.length);
          for(String name:arr)
          {
               System.out.println(name);
          }

     }
 

3.3 File[] listFiles();

 public static void listDemo3()
 {
      File dir = new File("d:\\");
      File[] files = dir.listFiles();

      for(File f:files)
      {
           System.out.println(f.getName()+"::"+f.length());
      }
 }

4 列出目录下所有内容

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

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

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

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

递归要注意:

1,限定条件。

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

列出目录下所有内容 - 带层次

/*
*     列出指定目录下文件或者文件夹,包含子目录中的内容
*     也就是列出指定目录下所有内容
*
* */
import java.io.*;

class FileDemo3
{
     public static void main(String[] args)
     {
          File dir = new File("c:/java");

          showDir(dir, 0);
          //toBin(6);
     }
     public static String getLevel(int level)
     {
          StringBuilder sb = new StringBuilder();
          sb.append("|--");
          for(int i = 0; i < level; i++)
          {
               //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 i = 0; i < files.length; i++)
          {
               if(files[i].isDirectory())
                    showDir(files[i], level);
               else
                    System.out.println(getLevel(level)+files[i]);
          }
     }
     //递归 十进制转成二进制
     public static void toBin(int num)
     {
          if(num > 0)
          {
               toBin(num/2);
               System.out.println(num%2);
          }
     }

}
 

5 删除带内容的目录

/*
删除一个带内容的目录。
删除原理:
在window中,删除目录从里面往外删除的。

既然是从里往外删除。就需要用到递归。

*/
import java.io.*;
class  RemoveDir
{
     public static void main(String[] args)
     {

          File dir = new File("d:\\testdir");
          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());
     }

}

6. 创建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("c:\\java");

          List<File> list = new ArrayList<File>();

          fileToList(dir,list);

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

          writeToFile(list, file.toString());
     }
     //将文件目录中的.java文件对象存储到List中

     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);
               }
          }
     }
     //将List<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;
               }

          }

     }
}

7 Properties简述

 

Properties是hashtable的子类。
也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。

是集合中和IO技术相结合的集合容器。

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

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

方法:

 

1.  //通过 键值 搜索(获得) 属性

String getProperty(String key);

2.  //调用Hashtable的方法put.

Objext setProperty(String key,String value)

3. //返回此属性列表中的键集

Set<String> stringPropertyNames()

4.  //从输入流中读取属性列表(键和元素对)

void load(InputStream inStream)

void load(Reader reader)

5.  //将属性列表输出到指定的输出流

void list(PrintStream out)

void list(PrintWriter out)

6.  //将属性列表写入输出流

//修改完数据并写入文件

void store(OutputStream out ,String comments)

//comments是注释 前面有#修饰 不会被Properties读取

练习

用于记录应用程序运行次数。

如果使用次数已到,那么给出注册提示。

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

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

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

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

所以

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

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

*/

XML

加入10个人的信息

<persons>

<person id="001">

<name>zhangsan</name>

<age>30</age>

<address>bj</address>

</person id=‘002">

<person>

</person>

</persons>

//包 用于读取xml

dom4j  //dom for java

8 PrintWriter

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

字节打印流
PrintStream
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream

字符打印流
PrintWriter
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream

4,字符输出流,Writer。

PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。

方法

构造函数  自动刷新

import java.io.*;

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

          //为true自动刷新
          PrintWriter out = new PrintWriter(System.out,true); 

          String line = null;

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

          out.close();
          bufr.close();
     }
}
/*
BufferedReader bufr =
     new BufferedReader(new InputStreamReader(System.in));
*/

9 合并流

对多个流进行合并

SequenceInputStream

构造函数

SequenceInputStream(InputStream s1, InputStream s2)

SequenceInputStream(Enumeration<? extends InputStream> e)

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("c:\\1.txt"));
          v.add(new FileInputStream("c:\\2.txt"));
          v.add(new FileInputStream("c:\\3.txt"));

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

          SequenceInputStream sis = new SequenceInputStream(en);

          FileOutputStream fos = new FileOutputStream("c:\\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();

     }
}

10  切割文件

 

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();
     }
     //切割文件,按1M
     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();

     }
}
 
时间: 2024-10-14 02:46:11

IO流 2的相关文章

Java中的IO流

Java中的IO流是实现输入/输出的基础. 按照流的方向不同:分为输入流和输出流. 按照处理数据单位的不同:分为字节流(8位)和字符流(16位). 按照功能不同:分为节点流和处理流 所有面向字节的流类都继承于InputStream类(输入流) 或OutputStream类(输出流),这两个类是抽象类,我们可以利用它的子类来完成不同的功能. InputStream.OutputStream都是抽象类 InputStream抽象了应用程序读取数据的方式 OutputStream抽象类应用程序写出数据

Java IO流 探险

Java的IO流使用了一种装饰器设计模式,它将IO流分为底层节点流和上层处理流.本篇重点在如何访问文件与目录.如何以二进制格式和文本格式来读写数据.对象序列化机制.还有Java7的"NIO.2". 装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.那么自定义的该类称为装饰类. 装饰类通常会通过构造方法接收被装饰的对象.并基于被装饰的对象的功能,提供更强的功能. IO的方式通常分为:BIO(同步阻塞).NIO(同步非阻塞).AIO

Java 之IO流及应用

IO流 IO流概述及FileWriter类的使用 FileReader类使用 缓冲流介绍和使用 IO流相关案例 NO.one IO流概述及FileWriter类使用 1.1 IO流概述及分类 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流 1.2 FileWriter类使用 A:打开帮助文档 B:点击显示,找到索引,看到输入框 C:你要学习什么内容,你就在框框里面输入什么内容 举例:Random D:看包

IO流和File

读键盘数据.显示数据6-1)io流的分类 按方向:输入流(读取数据) 输出流(写入数据) 按数据类型:字节流(基本数据类型)输出输入 字符流(字节流的包装 对字节流进行处理)输出输入四个核心类: InputStream 字节输入流 OutStream 字节输出流 Reader 字符输入流 Writer 字符输出流6-2) 文件类 File d:/lxj/xx.txt 绝对路径 构造方法: File(String dir,String fileName) File(String path)//pa

Java笔记(19):IO流(01)

1.try...catch的方式处理异常1 1 package cn.itcast_02; 2 3 /* 4 * 异常:程序出现了不正常的情况. 5 * 6 * 程序的异常:Throwable 7 * 严重问题:Error 我们不处理.这种问题一般都是很严重的,比如说内存溢出. 8 * 问题:Exception 9 * 编译期问题:不是RuntimeException的异常 必须进行处理的,因为你不处理,编译就不能通过. 10 * 运行期问题:RuntimeException 这种问题我们也不处

java基础8(io流3)

1.LineNumberReader: public int getLineNumber():获取行号 public void setLineNumber(int lineNumber):设置起始行号 String readLine():读取一行 2.操作基本数据类型的流 DataInputStream:读数据 DataOutputStream:写数据 作用:可以操作基本类型的流对象,其读写顺序必须一致,否则数据有问题. public static void main(String[] args

java IO流

* IO流用来处理设备之间的数据传输 * Java对数据的操作是通过流的方式 * Java用于操作流的类都在IO包中 * 流按流向分为两种:输入流,输出流. * 流按操作类型分为两种: * 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的 * 字符流 : 字符流只能操作纯字符数据,比较方便. * IO流常用父类 * 字节流的抽象父类: * InputStream * OutputStream * 字符流的抽象父类: * Reader * Writer * IO程序

Java:IO流与文件基础

Java:IO流与文件基础 说明: 本文所有内容包含图片均为MrSaber自己编写,转载请练习我哦. 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象称作 输入流,可以向其中写入一个字节序列的对象称作 输出流. ? 这些字节序列的来源可以是:文件.网络连接.内存块等. ? 抽象类InputStream和OutputStream是构成输入/输出(I/O)的基础. ? 因为面向字节的流

5. IO流:★★★★★

IO流:★★★★★,用于处理设备上数据. 流:可以理解数据的流动,就是一个数据流.IO流最终要以对象来体现,对象都存在IO包中. 流也进行分类: 1:输入流(读)和输出流(写). 2:因为处理的数据不同,分为字节流和字符流. 字节流:处理字节数据的流对象.设备上的数据无论是图片或者dvd,文字,它们都以二进制存储的.二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小数据单元就是字节.意味着,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据. 那么为什么要有字符流呢?因

理解IO流:InputStream和OutputStream,FileInputStream和FileOutputStream,Reader和Writer,FileReader和FileWriter,BufferedInputStream 和 BufferedOutputStream, BufferedReader 和 BufferedWriter,转换流

/* * 1.理解 "流" ? * 动态性.连续性.方向性. * * 2.在java语言中,将数据的输入/输出称之为 IO流. IO流的分类: * 1) 从方向分: 输入流 , 输出流. (参照计算机的内存) * 将数据送到内存中去称之为输入流.反之,称之为输出流. * * 2) 从处理单位来分: 字节流(8位二进制数据), 字符流(16位二进制数据). * * 3) 从是否有数据源来分: 节点流(有数据源), 处理流(必须套在节点流上). * * 3.在Java语言中,所有流类均来自