java i/o学习总结

来源:互联网 发布:淘宝的快递软件叫啥 编辑:程序博客网 时间:2024/03/29 16:28
**java  i/0系统学习经验小结一**
   总的来说学习完java后,我有两种体会,
1.java的i/0读取是有两种体系结构的,一种是基于字节的Stream,另一种是基于字符的Reader。
2.java的i/o是基于装饰器模式构建的,我们需要什么就直接加上相应的类,完成功能。
下面开始介绍java的相关内容
一,应该认识的第一个类File
  File是一个表示文件和目录路径名的类,它可以创建文件,删除文件,判断当前的File是不是目录,返回路径名等等。可以说是一i/o中非常基本的类了,它为更高层的类提供支持。
  比如FileInputStream的构造方法有一个是File对象。
    File f=new File("Test.txt");
    把Test转换为抽象的f对象,如果Test.txt不存在,只有当向这个文件写东西的时候,才会创建相应的文件,不过现在可以用f.getAbsolutePath()方法来获取相应的绝对路径名称。
如果传进去的是一个存在的目录,可以显示该目录下的所有文件。下面是显示D盘下所有的目录,f.listFiles() 返回的是File的数组,用循环得出相应的名称
         File f=new File("D:\\");
        for(File a:f.listFiles())
  System.out.println(a.getName());

二,有关字节的输入体系  

   字节输入

  在有关字节的输入过程中,首先,要知道一个输入字节的基本流InputStream,任何与字节输入有关的流都是继承它的,它的子类都包括一个基本的方法read()即从输入流中读取一个字节。
java的设计者在设计的时候,考虑到输入可能回来自多个方面,于是,把输入流根据源的不同分成了不同的输入流,如来自文件的输入流,FileInputStream。来自String的输入流,
则通过StringBufferInputStream,将String对象转换成InputStream对象。如果是来自管道的话,则用PipedInputStream。还有一个把内存当做输入对象的ByteArrayInputStream。
还有一个不得不说的FilterInputStrem ,它的构造器是一个InputStream。它用来对InputStream做特定的控制,来改变InputStream内部的一些东西,比如是否需要缓冲,需要保留要度过的行。
    我先来画一下java的继承体系
                                                      InputStream
                                    
 FileInputStream       StringBufferInputStream       ByteArrayInputStream       PipedInputStream     FilterInputStream  这些都是InputStream的子类。
                                                                                             DataInputStream    BufferedInputStream  这两个是FilterInputStream的子类
 DataInputStream是可以格式化的从输入流读取基本类型(int,double等),BufferedInputStream是对输入的流进行缓冲,以提高效率。
 下面是对于io流的一些用法
   public class Test {
public static void main(String[] args)throws IOException {
try{
byte [] a="abcdefgh".getBytes();               //首先通过字符的getBytes创建字节数组
DataInputStream in=new DataInputStream(        //DataInputStream来封装从内存中读入的流ByteArrayInputStream
new ByteArrayInputStream(               //ByteArrayInputStream的构造器需要一个字节数组,传入a
a));
while(true)
System.out.println((char)in.readByte());        //用in来读取内存中的字节,然后强制转换成char
}catch(EOFException e){                              //这是一个标志,标志读到了流的末尾
System.err.println("end of  output");
}

}
}


  下面来写一个读取二进制文件的小程序
public class Test {
public static void main(String[] args)throws IOException {
BufferedInputStream bf=new BufferedInputStream(                      //采用三级的结构,来把当前文件读入控制台
new FileInputStream(                                         //File()创建文件的抽象形式,FileInputStream从文件读入信息
new File("src\\com\\nuc\\Test.java")));              //BufferedInputStream()建立缓冲区,提升读取速度
try{
StringBuilder sb=new StringBuilder();                             //采用StringBuilder 来保存文件的信息最后统一输出,关闭文件统一在finally语句中执行
while(bf.available()!=0)
sb.append((char)bf.read());
System.out.println(sb);
}finally{
bf.close();
}
}

}


 字节输出
和输入部分相似,输出部分也是采用装饰器模式,来完成相应的输出。所有的输出,都是继承一个父类OutputStream.相对于输入的部分,输出的部分反而简单了许多。
   与输入相对应所有其子类都有一个write()方法,用来单个字节的输出。
其次,是它的三个常用的子类,ByteArrayOutputStream,在内存中创建缓冲区,讲流输入到内存中。FileOutputStream
用于将流输入到文件中。PipedOutputStream向管道输入。还有一个改变输入流的行为的FilterOutputStream。用来改变输出的特性。
 对于FilerOutputStream,首先向介绍与输入相对应的DataOutputStream。它用来写入的格式化数据。如,writeByte(),writeFloat(),以便DataInStream
读入。 还有一个PrintStream,这是为了格式化打印数据。DataOutputStream是用来处理数据的储存,PrintStream是用来处理数据的显示。
还有一个BufferedOutputStream用来当做输出的缓冲区。
   下面是一些有关的输入,输出的例子
   
向文件写入数据,并用DataInputStream读入显示到控制台
public class Test{
public static void main(String [] args) throws IOException{
DataOutputStream out=new DataOutputStream(              //格式化写入文件
new BufferedOutputStream(                       //建立缓冲区
new FileOutputStream("Test.txt")));     //FileOutputStream有一个构造器构造器是String,表示创建指定名称的文件输出。
out.writeInt(123);                                      //在这个时候,可以传进File对象。它有一个构造器支持File对象
out.writeDouble(1.00);
out.writeUTF("this is UTF");
out.close();

DataInputStream in=new DataInputStream(                  //在文件中读入,可以看我上一个博客
new BufferedInputStream(
new FileInputStream("Test.txt")));

System.out.println(in.readInt());
System.out.println(in.readDouble());
System.out.println(in.readUTF());
}
}
                      
  

这是我对java i/o字节方面的理解,有不对的地方请大家批评指正。

2 0
原创粉丝点击