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

java 输入流与输出流相关知识

2009-09-04 10:31 141 查看

     流是生产或消费信息的一种抽象描述,通过java的输入/输出系统与外部设备连接,并为所有的输入/输出提供统一、简单的操作方法。

     输入流和输出流不是绝对不变的。对于一个文件而言,当向其中写入数据时,它就是一个输出流;当从其中读取数据时,它就是一个输入流。对于键盘来说,只能是输入流;显示器则只能是一个输出流。

     在io包中,还根据流中的数据类型不同,将流分为字节流类和字符流类。其中,字节流类专门负责处理以字节为传输单位的操作;而字符流类则专门负责处理以字符为传输单位的操作。

     根据流的建立方式和工作原理,还将流类分为节点流和过滤流类。节点流类用于直接在输入输出媒介之上建立流,而过滤流类则用于对节点流类功能上的扩展,此时它必须先以某一个节点流对象作为流的来源,然后可以修改已经读出或写入的数据(包括加密和压缩的数据),甚至还可以简单地利用自身提供的附加方法将已经读出或者写入的数据转化成其他格式。

      System.in是标准的输入流,默认情况下,它指的是键盘。System.out是标准的输出流,默认情况下,它指的是某一个控制台,如显示器。System.err指的是标准的错误流,它默认也是控制台。


     File类在java中,它既可以代表一个特定文件,也可以代表目录内一系列文件的集合。当代表的是一个文件的集合时,便可以使用目录所特有的属性list()方法来查询这个集合,并列出当前集合中的文件名,该方法返回的是一个字符串数组。

 

指定目录下的所有文件都列出来

import java.io.*
class  ListAllFiles{
 public void listPath(File path){
 
  File files[] = path.listFiles();//获得当前目录对象下的所有文件
  for(int i=0;i<files.length;i++){
   if(files[i].isFile()){
    System.out.println(files[i].getPath());
   }else if{
    System.out.println(files[i].getPath());
    listPath(files[i]);//递归调用listPath方法
   }
  }
 }
 
 public static void main(String [] args){
  File dir = new File(args[0]);
  ListAllFiles list = new ListAllFiles();
  list.listPath(dir);
 }
 
}

==============================================================================================================
删除某个目录下的所有文件

import java.io.*;
import java.util.*;

class DeleteDir{

 public DeleteDir(File dir){
 
  if(dir.isDirectory()){
   LinkListed dirs = new LinkedList();
   dirs.add(dir);
   
   while(dirs.size()>0){
    File currentDir = (File)dirs.getFirst();
    File[] files = currentDir.listFiles();
    boolean emptyDir = true;
    for(int i=0;i<files.length;i++){
     if(files[i].isFile()){
      System.out.println("Deleting ..." +files[i].getAbsolutePath());
      
      try{
       files[i].delete();
      }catch(SecurityException e){
       e.printStackTrace();
      }
     
     }else{
     
      dirs.addFirst(Files[i]);
      emptyDir = false;
      
     }
    
    }
    if(emptyDir){
     System.out.println("Deleting ..."+currentDir.getAbsolutionPath());
     try{
      currentDir.delete();
     }catch(SecurityException e){
      e.printStackTrace();
     }
     dirs.removeFirst();
    
    }
    }
  
  
  }
  else if(dir.isFile()){
   System.out.println("Error:"+dir.getName()+"is a file");
  }else{
   System.out.println("Error:"+dir.getName()+"is unknow");
  }
  
  public static void main(String[] args){
   File dir = new File(args[0]);
   DeleteDir delDir = new DeleteDir(dir);
  }
 
 }


}


=====================================================================================================================
flush()方法仅用于支持缓冲区操作的输出流类,而fileOutputStream类是用于直接操作目标设备所对应的节点流类,因此该流类不支持flush()方法。直接操作目标设备的节点流类还有ByteArrayOutputStream。

 

文本文件与二进制文件的区分:
简单的办法就是把所有可以用于文本编辑器打开的文件都称为文本文件,如.txt,.bat,.ini文件等。这些文件中所有的字符都是可读的ASCII码字符。除了这些文件之外其他所有不能被文本编辑器正确打开的文件都是二进制文件。Word文件不能被文本编辑器打开,自然就是二进制文件。

 

BufferInputStream类可以对任何的InputStream流进行带缓冲的封装以达到性能的改善。它的实现原理是,在已定义输入流上再定义一个具有缓冲的输入流,可以从此流中成批地读取字节,而不会每次都引起直接对数据源的读操作。数据输入时,首先被放入缓冲区,随后的读操作,就是对缓冲区中内容进行访问。

 

BufferOutputStream类可以对任何的OutputStream流进行带缓冲的封装以达到性能的改善。这是因为,用户在缓冲输出流中写入字节时,不会每次都直接对数据宿进行写操作,而是当缓冲区已满或者清空流时,数据才写到数据宿上。

 

BufferOutStream提供了一个flush()方法可以用来将缓冲区的数据强制输出到数据宿。可见,与缓冲区输入流不同的是,建立缓冲区输出流可以通过减少系统实际写数据的时间和次数来改善I/O性能。

 

flush()方法并不是对所有的输出流都起作用,而是只对那些使用了缓冲区的输出流才有效。而且如果调用了close()方法,系统也会在关闭这个流之前将缓冲区的内容刷新到外部设备中去,只是这样做会存在不安全的因素。

 

字节流与字符流的转换:
InputStreamReader:将字节转换为字符的输入流
OutputStreamWriter:将字符转换为自己的输出流 

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