`
niqinwen
  • 浏览: 32604 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Java.io 包详解

 
阅读更多
Java中比较丰富的I/O操作,使得Java能够被众多公司接受的一个优势之一。
数据流的概念和对文件I/O的理解、处理以及操作。数据流指一定字节长度和方向的线性有序数据。虽然输入、输出数据都以线性有序字节流的形式存在,但这些数据流的内容可以构成不同文件格式:文本文件、二进制文件、对象文件、压缩文件等等。
Java中的I/0须知道以下内容:
文件的格式、文件内容、数据流方向、文件路径和缓冲。

1.基本知识
stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在
Java的I/O中,所有的stream(包括Input和Out stream)都包括两种类型:
  • 以字节为导向的stream以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字
    节为导向的stream包括下面几种类型:
    1) input stream:
    1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
    2) StringBufferInputStream:把一个String对象作为InputStream
    3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作
    4) PipedInputStream:实现了pipe的概念,主要在线程中使用
    5) SequenceInputStream:把多个InputStream合并为一个InputStream
    2) Out stream
    1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
    2) FileOutputStream:把信息存入文件中
    3) PipedOutputStream:实现了pipe的概念,主要在线程中使用
    4) SequenceOutputStream:把多个OutStream合并为一个OutStream
  • 以Unicode字符为导向的stream(我个人比较喜欢这个,easy,fast),表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型: 1) Input Stream
    1) CharArrayReader:与ByteArrayInputStream对应
    2) StringReader:与StringBufferInputStream对应
    3) FileReader:与FileInputStream对应
    4) PipedReader:与PipedInputStream对应
    2) Out Stream
    1) CharArrayWriter:与ByteArrayOutputStream对应
    2) StringWriter:无与之对应的以字节为导向的stream
    3) FileWriter:与FileOutputStream对应
    4) PipedWriter:与PipedOutputStream对应
    以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现
    的功能相同,字是在操作时的导向不同。如CharArrayReader:和ByteArrayInputStream的
    作用都是把内存中的一个缓冲区作为InputStream使用,所不同的是前者每次从内存中读取
    一个字节的信息,而后者每次从内存中读取一个字符。
    负责字符流和字节流之间转换的工作有InputStreamReader和OutputStreamReader来完成。把一个以字节为导向的stream转换成一个以字符为导向的stream。


    stream添加属性:
    运用上面介绍的Java中操作IO的API,我们就可完成我们想完成的任何操作了。但通过Fil
    terInputStream和FilterOutStream的子类,我们可以为stream添加属性。下面以一个例子
    来说明这种功能的作用。
    如果我们要往一个文件中写入数据,我们可以这样操作:
    FileOutStream fs = new FileOutStream(“test.txt”);
    然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是,如
    果我们想实现“先把要写入文件的数据先缓存到内存中,再把缓存中的数据写入文件中”
    的功能时,上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和Fi
    lterOutStream的子类,为FileOutStream添加我们所需要的功能。

    FilterInputStream的各种类型
    用于封装以字节为导向的InputStream

    1) DataInputStream:从stream中读取基本类型(int、char等)数据。
    2) BufferedInputStream:使用缓冲区
    3) LineNumberInputStream:会记录input stream内的行数,然后可以调用getLineNumber()和setLineNumber(int)
    4) PushbackInputStream:很少用到,一般用于编译器开发.
    用于封装以字符为导向的InputStream
    1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream
    2) BufferedReader:与BufferedInputStream对应
    3) LineNumberReader:与LineNumberInputStream对应
    4) PushBackReader:与PushbackInputStream对应
    FilterOutStream的各种类型
    用于封装以字节为导向的OutputStream

    1) DataIOutStream:往stream中输出基本类型(int、char等)数据。
    2) BufferedOutStream:使用缓冲区
    3) PrintStream:产生格式化输出
    用于封装以字符为导向的OutputStream
    1) BufferedWriter:与对应
    2) PrintWriter:与对应
    RandomAccessFile
    1) 可通过RandomAccessFile对象完成对文件的读写操作
    2) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写
    3) 可以直接跳到文件中指定的位置

    2. File
    File类是基础类,作为文件操作的对象。既可以是文件,也可以是目录。

    (1)四个静态常量:
    static String pathSeparator 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
    static char pathSeparatorChar 与系统有关的路径分隔符。
    static String separator 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
    static char separatorChar 与系统有关的默认名称分隔符

    其中,pathSeparator作为分隔符来区分不同的路径(在Windows下是;(分号),在Linux下是:(冒号))。separator是路径中使用的分隔符(在Windows下是\,在Linux下是/)。

    在File类中有很多有用的方法,可以参考阅读API。但是其中的如下方法要列出来说明下。
    String[] list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
    String[] list(FilenameFilter filter) 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
    File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
    File[] listFiles(FileFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
    File[] listFiles(FilenameFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
    static File[] listRoots() 列出可用的文件系统根。


    在下面的例子中使用了上面表格中列出的内容。
    Java代码 收藏代码
    1. packagecom.java.io;
    2. importjava.io.File;
    3. importjava.io.FileFilter;
    4. importjava.io.FilenameFilter;
    5. publicclassIO{
    6. publicstaticvoidmain(String[]args){
    7. System.out.println("----------------------Separator----------------------");
    8. System.out.println("pathSeparator:"+File.pathSeparator+"\t"+"separator:"+File.separator);
    9. System.out.println("----------------------ListRoots----------------------");
    10. File[]roots=File.listRoots();
    11. for(Filefile:roots){
    12. System.out.print(file+"\t");
    13. }
    14. System.out.println();
    15. System.out.println("----------------------List----------------------");
    16. Filefile=newFile("F:\\");
    17. System.out.print("List:\t\t\t\t");
    18. String[]fileNames=file.list();
    19. for(Stringname:fileNames){
    20. System.out.print(name+"\t");
    21. }
    22. System.out.println();
    23. System.out.print("List(filter):\t\t\t");
    24. String[]_fileNames=file.list(newFilenameFilter(){
    25. @Override
    26. publicbooleanaccept(Filefile,Stringname){
    27. returnfile.isDirectory()&&name.contains("E");//列出名字中有大写E的文件夹
    28. }
    29. });
    30. for(Stringname:_fileNames){
    31. System.out.print(name+"\t");
    32. }
    33. System.out.println();
    34. System.out.print("ListFiles():\t\t\t");
    35. File[]files=file.listFiles();
    36. for(File_file:files){
    37. System.out.print(_file+"\t");
    38. }
    39. System.out.println();
    40. System.out.print("ListFiles(FilenameFilter):\t");
    41. File[]_files=file.listFiles(newFilenameFilter(){
    42. @Override
    43. publicbooleanaccept(Filefile,Stringname){
    44. returnfile.isDirectory()&&name.contains("E");//列出名字中有大写E的文件夹
    45. }
    46. });
    47. for(File_file:_files){
    48. System.out.print(_file+"\t");
    49. }
    50. System.out.println();
    51. System.out.print("ListFiles(FileFilter):\t\t");
    52. File[]__files=file.listFiles(newFileFilter(){
    53. @Override
    54. publicbooleanaccept(Filefile){
    55. returnfile.isDirectory()&&file.getName().contains("E");
    56. }
    57. });
    58. for(File_file:__files){
    59. System.out.print(_file+"\t");
    60. }
    61. System.out.println();
    62. }
    63. }

    结果:
    ---------------------- Separator ----------------------
    pathSeparator: ; separator: \
    ---------------------- List Roots ----------------------
    C:\ D:\ E:\ F:\ G:\ H:\
    ---------------------- List ----------------------
    List: 579492bc12f33c12d7238760d8111512 Eclipse FavoriteVideo KwDownload Lectures RECYCLER System Volume Information
    List(filter): Eclipse RECYCLER
    ListFiles(): F:\579492bc12f33c12d7238760d8111512 F:\EclipseF:\FavoriteVideo F:\KwDownload F:\Lectures F:\RECYCLER F:\System Volume Information
    ListFiles(FilenameFilter): F:\Eclipse F:\RECYCLER
    ListFiles(FileFilter): F:\Eclipse F:\RECYCLER

    3. 比较常用的I/O操作。
    FileInputStream/BufferedInputStream
    FileOutputStream/BufferedOutputStream/PrintStream
    FileReader/BufferedReader/InputStreamReader
    FileWriter/BufferedWriter/OutputStreamWriter

    Java中的管道模型,很好的对一层层的处理进行了封装,这使得Java的I/O处理使用起来相当灵活。一些常用的封装有:
    BufferedReader reader = new BufferedReader(new FileReader(new File("c:\\test.txt"))); //读取文件1
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("c:\\test.txt"))); //读取文件2
    InputStreamReader isr= new InputStreamReader(new FileInputStream(new File("c:\\test.txt"))); //读取文件3
    BufferedWriter writer = new BufferedWriter(new FileWriter(new File("c:\\test.txt"))); //写文件1
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("c:\\test.txt"))); //写文件2
    OutputStreamWriter osw= new OutputStreamWriter(new FileOutputStream(new File("c:\\test.txt"))); //写文件3
    System.setOut(new PrintWriter(new File("c:\\test.txt"))); //改变输出,将输出重定向到文件中

    4. 按照上面的介绍,如果想使用某一个管道模式来读写文件将会变得非常简单,只要查看下API文档,按照上面的结构很容易就能够实现自己想要的功能。
    下面是一个简单的例子。
    Java代码 收藏代码
    1. packagecom.java.io;
    2. importjava.io.File;
    3. importjava.io.FileNotFoundException;
    4. importjava.io.FileReader;
    5. importjava.io.IOException;
    6. importjava.io.LineNumberReader;
    7. importjava.io.PrintStream;
    8. publicclassIO1{
    9. publicstaticvoidmain(String[]args){
    10. LineNumberReaderreader=null;
    11. try{
    12. System.setOut(newPrintStream(newFile("d:\\test2.txt")));
    13. reader=newLineNumberReader(newFileReader(newFile("d:\\test.txt")));
    14. Stringline="";
    15. while((line=reader.readLine())!=null){
    16. intnumber=reader.getLineNumber();
    17. System.out.println(number+"\t"+line);
    18. }
    19. }catch(FileNotFoundExceptione){
    20. e.printStackTrace();
    21. }catch(IOExceptione){
    22. e.printStackTrace();
    23. }finally{
    24. try{
    25. if(reader!=null){
    26. reader.close();
    27. }
    28. }catch(IOExceptione){
    29. e.printStackTrace();
    30. }
    31. }
    32. }
    33. }

    注:d:\test.txt 文件如附件,运行前该文件是存在的。运行程序之后,在d盘根目录下会生成一个test2.txt的文件,里面的内容如附件test_test2.rar。

    5. Object读写事例
    Java代码 收藏代码
    1. packagecom.java.io;
    2. importjava.io.File;
    3. importjava.io.FileInputStream;
    4. importjava.io.FileNotFoundException;
    5. importjava.io.FileOutputStream;
    6. importjava.io.IOException;
    7. importjava.io.ObjectInputStream;
    8. importjava.io.ObjectOutputStream;
    9. importjava.io.Serializable;
    10. publicclassOBJ_IO{
    11. publicstaticvoidWriteOBJ(Personperson,StringfileName){
    12. ObjectOutputStreamoos=null;
    13. try{
    14. oos=newObjectOutputStream(newFileOutputStream(newFile(fileName)));
    15. oos.writeObject(person);
    16. }catch(FileNotFoundExceptione){
    17. e.printStackTrace();
    18. }catch(IOExceptione){
    19. e.printStackTrace();
    20. }finally{
    21. if(oos!=null){
    22. try{
    23. oos.close();
    24. }catch(IOExceptione){
    25. e.printStackTrace();
    26. }
    27. }
    28. }
    29. }
    30. publicstaticPersonreaderPersonOBJ(StringfileName){
    31. Personperson=null;
    32. ObjectInputStreamoos=null;
    33. try{
    34. oos=newObjectInputStream(newFileInputStream(newFile(fileName)));
    35. person=(Person)oos.readObject();
    36. }catch(FileNotFoundExceptione){
    37. e.printStackTrace();
    38. }catch(IOExceptione){
    39. e.printStackTrace();
    40. }catch(ClassNotFoundExceptione){
    41. e.printStackTrace();
    42. }finally{
    43. if(oos!=null){
    44. try{
    45. oos.close();
    46. }catch(IOExceptione){
    47. e.printStackTrace();
    48. }
    49. }
    50. }
    51. returnperson;
    52. }
    53. publicstaticvoidmain(String[]args){
    54. StringfileName="d:\\person.obj";
    55. Personperson=newPerson("Eric",22);
    56. WriteOBJ(person,fileName);
    57. person=readerPersonOBJ(fileName);
    58. System.out.println(person.getName());
    59. System.out.println(person.getAge());
    60. }
    61. }
    62. classPersonimplementsSerializable{
    63. privatestaticfinallongserialVersionUID=-6018738718323071804L;
    64. privateStringname;
    65. privateintage;
    66. publicPerson(Stringname,intage){
    67. super();
    68. this.name=name;
    69. this.age=age;
    70. }
    71. publicStringgetName(){
    72. returnname;
    73. }
    74. publicvoidsetName(Stringname){
    75. this.name=name;
    76. }
    77. publicintgetAge(){
    78. returnage;
    79. }
    80. publicvoidsetAge(intage){
    81. this.age=age;
    82. }
    83. }

    结果:
    Eric
    22
    (注:在d盘会生成一个person文件,如附件person.obj.zip)

    6. RandomAccessFile类
    该类似于C++中的文件读取,可以查看相关API文档进行阅读。

    7. 压缩文件的读取操作。
    在java.util.zip目录下有GZIPInputStream GZIPOutputStream ZipInputStream 和 ZipOutputStream等类。以Zip来事例如何生成并读写Zip文件。
    Java代码 收藏代码
    1. packagecom.java.io;
    2. importjava.io.File;
    3. importjava.io.FileInputStream;
    4. importjava.io.FileNotFoundException;
    5. importjava.io.FileOutputStream;
    6. importjava.io.IOException;
    7. importjava.util.Arrays;
    8. importjava.util.zip.ZipEntry;
    9. importjava.util.zip.ZipInputStream;
    10. importjava.util.zip.ZipOutputStream;
    11. publicclassZip{
    12. /**
    13. *
    14. *@paramcontent要写到压缩包内文件的内容
    15. *@paramfileName相当于最外面压缩包的名字
    16. *@paramentryName相当于压缩包内文件的名字
    17. */
    18. publicstaticvoidwriteZip(Stringcontent,StringfileName,StringentryName){
    19. ZipOutputStreamzos=null;
    20. try{
    21. zos=newZipOutputStream(newFileOutputStream(newFile(fileName)));
    22. zos.setMethod(ZipOutputStream.DEFLATED);//设置压缩方法
    23. zos.putNextEntry(newZipEntry(entryName));
    24. byte[]bytes=content.getBytes();
    25. intoff=0;
    26. intlen=bytes.length;
    27. zos.write(bytes,off,len);
    28. zos.finish();
    29. }catch(FileNotFoundExceptione){
    30. e.printStackTrace();
    31. }catch(IOExceptione){
    32. e.printStackTrace();
    33. }finally{
    34. if(zos!=null){
    35. try{
    36. zos.close();
    37. }catch(IOExceptione){
    38. e.printStackTrace();
    39. }
    40. }
    41. }
    42. }
    43. publicstaticvoidreadZip(StringfileName){
    44. ZipInputStreamzis=null;
    45. try{
    46. Filefile=newFile(fileName);
    47. zis=newZipInputStream(newFileInputStream(file));
    48. while(zis.getNextEntry()!=null){
    49. byte[]bytes=newbyte[1024];
    50. inttemp=-1;
    51. intindex=0;
    52. while((temp=zis.read())!=-1){
    53. bytes[index++]=(byte)temp;
    54. }
    55. System.out.println(newString(bytes,0,index));
    56. }
    57. }catch(FileNotFoundExceptione){
    58. e.printStackTrace();
    59. }catch(IOExceptione){
    60. e.printStackTrace();
    61. }
    62. }
    63. publicstaticvoidmain(String[]args){
    64. StringfileName="d:\\test.zip";
    65. Stringcontent1="Thisistestcontent";
    66. writeZip(content1,fileName,"content.txt");
    67. readZip(fileName);
    68. }
    69. }

    结果:
    This is test content
    (注:会在d盘生成一个test.zip文件。见附件test.zip)

  • 分享到:
    评论

    相关推荐

      java.io 流详解,配许多具体实例。

      程序详细讲解了java流的具体知识,包括字节流,字符流,转化流,节点流,处理流,转换流,数据流,及可序列化的Object流。每个例子,都包含一个readme.txt文件,此文件包含对每个例子的功能解释,和重要的代码实现。

      java.io详解

      详细介绍了java.io输入输出流,以及常用到的方法

      java jdk io包类详解

      java的jdk源码解析,主要解析io、nio相关的类组织结构图

      Java_IO流详解

      Java_IO流详解Java_IO流详解Java_IO流详解

      java_io详解

      关于java io技术的详解:IO(Input/Output)是计算机输出/输出的接口。Java的核心库java.io提供了全面的IO接口,包括:文件读写,标准设备输出等等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出...

      java.nio API详解

      在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API。对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来...

      java_IO 详解java_IO 详解

      java_IO 详解java_IO 详解java_IO 详解java_IO 详解java_IO 详解java_IO 详解java_IO 详解java_IO 详解java_IO 详解java_IO 详解java_IO 详解java_IO 详解java_IO 详解

      JavaIO流详解归纳.pdf

      JavaIO流详解归纳 Java 的核心库 java.io 提供了全面的 IO 接口,包括文件读写、标准设备输出等。Java 中 IO 是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。在项目开发中,IO 是非常...

      Java教程之javaIO详解

      Java教程之javaIO详解Java教程之javaIO详解Java教程之javaIO详解

      JAVA-IO详解.txt

      JAVA-IO详解.txt JAVA-IO详解.txt JAVA-IO详解.txt

      java IO操作详解.pdf

      java IO操作详细解释 清华大学java io专用教材

      java中的io详解.

      java io 输入输出详细介绍. 从菜鸟化身为高手

      Java_IO流详解归纳.pdf

      Java_IO流详解归纳.pdf

      JavaIO文件复制优化-JavaIO优化详解(下载可用)

      JavaIO文件复制优化——JavaIO优化详解(下载可用)。个人经导师指导并认可通过的98分大作业设计项目,适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。...

      java中的io流详解

      java中的io流 有例子演示 更容易学习和掌握

      java IO详解课件

      深入全面的介绍了java中IO的常用的用法,以及一些使用的注意事项

      java IO流详解

      文档是关于JAVA常用IO流的学习笔记,可以用于参考,学习。

      java IO流详解-01.ppt

      IO系统-01.ppt IO系统-01.ppt IO系统-01.ppt IO系统-01.ppt IO系统-01.ppt

      java IO部分详解

      java IO部分详解各种流的解析例如 InputStream

    Global site tag (gtag.js) - Google Analytics