黑马程序员----Java(IO流)

来源:互联网 发布:微信矩阵营销 编辑:程序博客网 时间:2024/05/17 01:55

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

IO流是用来处理设备之间数据传输的,数据主要存储在硬盘、内存、高手缓存等设备中。Java对数据的操作时通过流的方式,流按照数据操作分为字符流和字节流,按照流的流向分为输入流和输出流。Java用于操作流的对象封装在IO包中。字符的编码方式主要有ASCII(American Standard Code Information Interchange),ANSI( American National Standard Institue),GB( Guo Biao),UTF(Unicode Translation Format)。IO常用的基类InputStream,OutputStream,Reader,Writer四个抽象基类。

Writer和Reader两个类的子类FileWriter和FileReader

FileWriter初始化时必须明确指定文件操作的位置,如果该目录下已有同名文件,如果FileWriter下的构造方法参数append为false,会被自动覆盖;如果为true,则不会覆盖;默认情况下append参数是false。

FileReader中read方法读取的字符数,如果已到达流的末尾,则返回 -1

流的close和flush的区别在于,close是资源关闭,关闭前会自动刷新流(即调用flush),关闭后不能调用flush或close方法,否则会抛出IO异常。

File类

流只能操作数据,如果想获得数据流的封装对象的相关信息,必须用File类。

File类和FileWriter不同:FileWriter在初始化时就已经完成了文件的创建,而File需要调用createNewFile方法来创建

File类的常用方法  

1.exists()测试此抽象路径名表示的文件或目录是否存在。

2.createNewFile()当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。倘若文件的目录不存在会报IO异常。

3.createTempFile(String prefix,String suffix)  在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。默认临时文件目录是由机器指定的,一般是“c://user//用户名//AppData//Local//temp”目录,临时文件会生成一个随机数,文件格式是前缀+随机数+后缀的格式。

4.createTempFile(String prefix,String suffix,File directory) 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。

5.delete()删除此抽象路径名表示的文件或目录。如果目录下有文件后目录,该目录无法删除。对于删除一般采用递归方式。

6.deleteOnExit()在虚拟机终止(程序退出)时,请求删除此抽象路径名表示的文件或目录。

7.mkdirs()创建多级目录。

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

public static String getLevel(int level){
  StringBuffer sb=new StringBuffer();
  sb.append("!--");
  for (int i = 0; i <level; i++) {
   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 (File file : files) {
   if (file.isDirectory()) {
    showDir(file,level);
   }else {
    System.out.println(getLevel(level)+file);
   }
  }
 }

删除带目录内容的清单:

public static void removeDir(File dir){
  File[] files =dir.listFiles();
  for (File file : files) {
   if(file.isDirectory())
    removeDir(file);
   else
    System.out.println(file.toString()+":file:"+file.delete());
  }
  System.out.println(dir+":dir:"+dir.delete());
 }

创建java文件列表清单代码:

/*
  * 1.对指定的目录进行递归
  * 2.获取递归过程中所有的java文件的路径
  * 3.将这些路径存储到集合当中
  * 4.将集合中的数据写入到文件当中
  */
 public static void javaFileList(File dir,ArrayList<File> list){
  File[] files=dir.listFiles();
  for (File file:files) {
   if (file.isDirectory()) {
    javaFileList(file, list);
   }else{
    if (file.getName().endsWith(".java"))
     list.add(file);
   }
  }
 }
 public static void writeToFile(String destPath,ArrayList<File> list) {
  BufferedWriter bw=null;
  try {
   bw=new BufferedWriter(new FileWriter(destPath));
   for (File file : list) {
    String pathName=file.getAbsolutePath();
    bw.write(pathName);
    bw.newLine();
    bw.flush();
   }
  } catch (Exception e) {
   throw new RuntimeException("将路径写入文件时发生异常");
  }finally{
   if(bw!=null){
    try {
     bw.close();
    } catch (IOException e) {
     throw new RuntimeException("字符缓存区无法关闭");
    }
   }
  } 

Properties对象

properties是HashTable 的子类,存储的键值对都是字符串,是集合技术和IO流结合的集合容器,可用于键值对形式的配置文件。

1.load(InputStream inStream)从输入流中读取属性列表(键和元素对)。然后可以用entrySet() 或KeySet方法得到集合,即的到了相关的数据,可以用for加强模式或集合的iterator()方法遍历集合。

  InputStream ips=new FileInputStream("config.properties");
  Properties properties =new Properties();
  properties.load(ips);
  Set hashSet=(Set) properties.entrySet();
  String className=properties.getProperty("className");//通过键获取值

SequenceInputStream类

SequenceInputStream(Enumeration<? extends InputStream> e) 用于合并流,用Vector<FileInputStream>容器装载,然后通过elements()方法的到Enumeration集合。
 
打印流
包括PrintWriter和PrintStream,分别表示字符流和字节流。打印流包含打印方法,可以对基本数据类型进行直接操作,可以保证数据的原样性。
PrintWriter类的构造方法几种形式
PrintWriter(File file)  使用指定文件创建不具有自动行刷新的新 PrintWriter。
PrintWriter(File file, String csn) 创建具有指定文件和字符集且不带自动刷行新的新 PrintWriter。
PrintWriter(OutputStream out) 根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。
PrintWriter(OutputStream out, boolean autoFlush) 通过现有的 OutputStream 创建新的 PrintWriter。
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
 //PrintWriter out=new PrintWriter(new FileOutputStream("demo.txt"));
 PrintWriter out=new PrintWriter(System.out,true);//当为true时,无需刷新,会自动刷新
 //out.println(97);//保证数据原样性输出,文档中仍然是97,而不是a
 //out.println(45.34);
 //out.close();
 String line=null;
 while((line=bufr.readLine())!=null){
  out.println(line.toUpperCase());
  //out.flush();
  //out.println(line);
 }
 out.close();
 bufr.close();

IO流的切割和合并:

//切割方法

public static void spiltFile() throws IOException {
  try {
   FileInputStream fis = new FileInputStream("D:\\2.jpg");
   FileOutputStream fos = null;
   byte[] buf = new byte[1024 * 100];
   int len = 0;
   int count = 1;
   while ((len = fis.read(buf)) != -1) {
    fos = new FileOutputStream("E:\\" + count++ + ".part");
    fos.write(buf, 0, len);
    fos.close();
   }
  } catch (FileNotFoundException e) {
   System.out.println("文件不存在");
  }
 }

//合并方法
 public static void merge() throws IOException {
  ArrayList<FileInputStream> arr1 = new ArrayList<FileInputStream>();
  for (int i = 1; i <= 5; i++) {
   arr1.add(new FileInputStream("E:\\" + i + ".part"));
  }
  final Iterator<FileInputStream> it = arr1.iterator();
  //Enumeration接口需要实现hasMoreElements和nextElement两个方法
  Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {
   @Override
   public FileInputStream nextElement() {
    return it.next();
   }
   @Override
   public boolean hasMoreElements() {
    return it.hasNext();
   }
  };
  //因为合并流SequenceInputStream的构造方法的参数是Enumeration,所以自己需写一个Enumeration子类
  SequenceInputStream sips = new SequenceInputStream(en);
  FileOutputStream fos = new FileOutputStream("d:\\2.gif");
  byte[] buf = new byte[1024];
  int len = 0;
  while ((len = sips.read(buf)) != -1) {
   fos.write(buf, 0, len);
  }
  sips.close();
  fos.close();
 }

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