`

java文件流

    博客分类:
  • Java
 
阅读更多

一、流的分类

 按数据流动方向

            输入流:只能从中读取字节数据,而不能向其写出数据

            输出流:只能向其写入字节数据,而不能从中读取数据

 按照流所处理的数据类型

            字节流:用于处理字节数据。

            字符流:用于处理Unicode字符数据。

 按照流所处理的源

            节点流:从/向一个特定的IO设备读/写数据的流。(低级流)

             处理流:对已存在的流进行连接和封装的流。(高级流)

二、缓冲流

缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓

冲的功能,提高了读写的效率,同时增加了一些新的方法。

J2SDK提供了四种缓存流:

BufferedReader 

BufferedWriter 

BufferedInputStream s

BufferedOutputStream 

 

 

缓冲输入流支持其父类的mark()和reset()方法:

mark()用于“标记”当前位置,就像加入了一个书签,可以使用reset()方法返回这个标记重新读取数据。

BufferedReader提供了readLine()方法用于读取一行字符串(以\r或\n分隔)。

BufferedWriter提供了newLine()用于写入一个行分隔符。

对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush()方法将会使内存中的数据立刻写出。

三、类层次

3.1、 InputStream类层次

 

3.2、OutputStream类层次

 

3.3、Reader类层次

 

 

 

 

 

 

3.4、Writer类层次

 

四、常用的字符流与字节流的转化

 

说明:

1.字节流用于读写诸如图像数据之类的原始字节流。

2.字符流用于读写诸如文件数据之类的字符流。

3.低级流能和外设交流。

4.高级流能提高效率。

5. InputStreamReader 是字节流通向字符流的桥梁。

6. OutputStreamWriter 是字符流通向字节流的桥梁。

 

 

 

五、代码实例

 

5.1、常用读文件:

/**

     *以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。

     *@paramfileName:文件的名

     */

    publicstaticvoid readFileByBytes(String fileName) {

       File file = new File(fileName);

       InputStream in = null;

       try {

           logger.debug("以字节为单位读取文件内容,一次读多个字节:");

            /*一次读多个字节*/

           byte[] tempbytes = newbyte[100];

           int byteread = 0;

           in = new FileInputStream(file);

            /*读入多个字节到字节数组中,byteread为一次读入的字节数*/

           while ((byteread = in.read(tempbytes)) != -1) {

              logger.debug(tempbytes);

              logger.debug(0);

              logger.debug(byteread);

           }

       } catch (Exception e1) {

           logger.error("读取文本文件异常",e1);

       } finally {

           if (in != null) {

              try {

                  in.close();

              } catch (IOException e1) {

                  logger.error("读取文本文件异常",e1);

              }

           }

       }

    }

 

 

 

 

 

 

 

 

 

/**

     *以字符为单位读取文件,常用于读文本,数字等类型的文件

     *@paramfileName:文件名

     */

    publicstaticvoid readFileByChars(String fileName) {

       Reader reader = null;

       try {

           logger.debug("以字符为单位读取文件内容,一次读多个字节:");

            /*一次读多个字符*/

           char[] tempchars = newchar[100];

           int charread = 0;

           if(fileName!=null&&!"".equals(fileName)){

              reader = new InputStreamReader(new FileInputStream(fileName));

               /*读入多个字符到字符数组中,charread为一次读取字符数*/

              while ((charread = reader.read(tempchars)) != -1) {

                   /*对于windows下,rn这两个字符在一起时,表示一个换行。*/

                   /*但如果这两个字符分开显示时,会换两次行。*/

                   /*因此,屏蔽掉r,或者屏蔽n。否则,将会多出很多空行。*/

                  if ((charread == tempchars.length)

                         && (tempchars[tempchars.length - 1] != 'r')) {

                     logger.debug(tempchars);

                  } else {

                     for (int i = 0; i < charread; i++) {

                         if (tempchars[i] == 'r') {

                            continue;

                         } else {

                            logger.debug(tempchars[i]);

                         }

                     }

                  }

              }

           }

       } catch (Exception e1) {

           logger.error("读取文本文件异常",e1);

       } finally {

           if (reader != null) {

              try {

                  reader.close();

              } catch (IOException e1) {

                  logger.error("读取文本文件异常",e1);

              }

           }

       }

    }

 

/**

     *以行为单位读取文件,常用于读面向行的格式化文件

     *@paramfileName:文件名

     */

    publicstatic List<String> readFileByLines(String fileName) {

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

       if(fileName!=null&&!"".equals(fileName)){

       File file = new File(fileName);

       BufferedReader reader = null;

       try {

           logger.debug("以行为单位读取文件内容,一次读一整行:");

           reader = new BufferedReader(new FileReader(file));

           String tempString = null;

            /*一次读入一行,直到读入null为文件结束*/

           while ((tempString = reader.readLine()) != null) {

              logger.debug(tempString);

              list.add(tempString);

           }

       } catch (IOException e) {

           logger.error("读取文本文件异常",e);

       } finally {

           if (reader != null) {

              try {

                  reader.close();

              } catch (IOException e1) {

                  logger.error("读取文本文件异常",e1);

              }

           }

       }

    }

       return list;

    }

 

 

 

 

 

 

 

 

 

 

5.2、常用写文件:

/** 

    *把内容写到文件

    *@paramfilePathName文件名 

    *@paramList<String>文件内容 

    */ 

    publicstaticboolean writerFile(String filePathName,String content){

       boolean flag=false;

       OutputStreamWriter osw=null;

       try {

           if(filePathName!=null&&!"".equals(filePathName)){

              osw = new OutputStreamWriter(new FileOutputStream(filePathName));

           }

       } catch (FileNotFoundException e1) {

           flag=false;

           e1.printStackTrace();

       }

       if(osw!=null){

       BufferedWriter bw=new BufferedWriter(osw);

       try {

           if(content!=null&&!"".equals(content)){

              bw.write(content);

              flag= true;

           }

       } catch (IOException e) {

           flag=false;

           e.printStackTrace();

       }finally{

           try {

              bw.close();

              osw.close();

           } catch (IOException e) {

              flag=false;

              e.printStackTrace();

           }         

       }

       }

       return flag;

    }

 

 

/** 

    *把内容写到文件或追加到文件中

    *@paramfilePathName文件名 

    *@paramList<String>文件内容 

    */ 

    publicstaticboolean writerFileIsAppend(String filePathName,String content){

       boolean flag=false;

       OutputStreamWriter osw=null;

       try {

           if (filePathName!=null&&!"".equals(filePathName)) {

              osw = new OutputStreamWriter(new FileOutputStream(filePathName,true));

           }

       } catch (Exception e1) {

           flag=false;

           e1.printStackTrace();

       }

       if(osw!=null){

       BufferedWriter bw=new BufferedWriter(osw);

       try {

           if(content!=null&&!"".equals(content)){

              bw.write(content);

              flag= true;

           }

       } catch (IOException e) {

           flag=false;

           e.printStackTrace();

       }finally{

           try {

              bw.close();

              osw.close();

           } catch (IOException e) {

              flag=false;

              e.printStackTrace();

           }         

       }

       }

       return flag;

    }

 

 

 

 

六、RandomAccessFile

6.1:说明

RandomAccessFile是一种特殊的文件流,可以用它在文件的任何地方查找或者插入数据

RandomAccessFile同时实现了DataInput和DataOutput接口,所以可以用它来读/写文件

构造器:

        RandomAccessFile(java.io.File f,String mode)

        RandomAccessFile(String file,String mode)

 

6.2:代码示例

/**

     *Description:  读取文件最后一行内容

     *@param   fileName文件路径名+文件名

     */

    publicstatic String getfinalLineData(String pathName){

    RandomAccessFile raf = null;

    String lastLine = "";

       try {

           raf = new RandomAccessFile(pathName, "r");

           long len = raf.length();

           if (len != 0L) {

              long pos = len - 1;

              while (pos > 0) {

                  pos--;

                  raf.seek(pos);

                  if (raf.readByte() == '\n') {

                     lastLine = raf.readLine();

                     break;

                  }

              }

           }

       } catch (Exception e) {

           e.printStackTrace();

       }finally {

            if (raf != null) {

                try {

                  raf.close();

                } catch (IOException e1) {

                  e1.getStackTrace();

                }

            }

        }

       return lastLine;

    }

 

七、注意事项

1、将高级流“套接“在低级流上,这样起到缓冲的作用可以提高效率。

2、将使用完的流关闭,释放资源。

3、读取如图片、声音、影像等文件用字节流。

4、读取如文本等文件用字符流。

5、根据具体的数据格式选择合适的读写方法、如按行读写、按照字节读写等。

分享到:
评论

相关推荐

    Java文件流的常见错误

    本篇文章将深入探讨Java文件流中的一些典型错误,并提供相应的解决方案。 1. **未关闭文件流**: 在读取或写入文件后忘记关闭文件流是最常见的错误之一。这可能导致资源泄露,影响程序的稳定性和系统性能。确保在...

    JAVA文件流控制台程序

    在这个"JAVA文件流控制台程序"中,我们将深入探讨如何使用Java进行文件读写,并结合控制台输出来展示数据。 首先,我们要了解Java中的基本文件流类型。Java提供了两种类型的流:字节流(Byte Stream)和字符流...

    Java文件流关闭和垃圾回收问题

    周末碰到一段代码,是关于Java IO流的,代码中出现在一个多线程的系统中,其中一段代码在打开一个文件操作流用完以后没有及时关闭,开始以为很快会出现打开文件太多或者导致内存溢出,但是在运行了很长时间以后仍然...

    java文件流操作.docx

    以下是对标题"java文件流操作.docx"和描述中提到的知识点的详细说明: 1. **字节流(Byte Stream)**: Java中的`InputStream`类用于处理字节流,它提供了一种按字节读取文件内容的方式。`FileInputStream`是`...

    java文件流学习实验

    这个"java文件流学习实验"显然是一系列用Java编写的实验,目的是深入理解和掌握文件流的概念和应用。实验中的代码文件(Test11.java、Test12.java等)很可能包含了不同类型的文件流操作示例,如读取、写入、复制和...

    微软Java文件流操作.zip

    微软Java文件流操作主要指的是如何使用Java的标准I/O库在Windows环境下读取、写入和处理文件。在这个"微软Java文件流操作.zip"的压缩包中,可能包含了练习或示例代码,例如"lab5",用于教授和实践Java中的文件流概念...

    java读取图片文件流

    java读取本地图片文件获取流!java读取本地图片文件获取流!

    java文件流操作[定义].pdf

    在Java编程中,文件流操作是处理文件输入和输出的核心技术。文件流允许程序以高效且灵活的方式读写文件内容,无论是文本文件还是二进制文件。本篇文章将详细阐述Java中的文件流操作,包括字节流和字符流的使用。 ...

    文件和流 文件和流 java文件和流

    java文件和流java文件和流java文件和流java文件和流java文件和流java文件和流java文件和流java文件和流java文件和流

    Java流(文件读写操作)

    ### Java流(文件读写操作) #### 一、流的分类 Java中处理文件和数据时,使用流的概念来进行操作。根据不同的标准,流可以分为几种类型。 ##### 1. 按数据流动方向 - **输入流**:主要用于从数据源读取数据。输入...

    Java文件流关闭和垃圾回收问题 .wps

    Java文件流关闭和垃圾回收问题 .wps

    JAVA流文件全部例子

    JAVA流文件全部例子JAVA流文件全部例子JAVA流文件全部例子JAVA流文件全部例子JAVA流文件全部例子JAVA流文件全部例子JAVA流文件全部例子JAVA流文件全部例子JAVA流文件全部例子JAVA流文件全部例子

    java文件操作

    Java文件操作是编程中不可或缺的一部分,尤其是在处理I/O流、文件读写以及文件管理时。Apache Commons IO是一个非常实用的库,它为Java开发者提供了大量的工具类和方法,以简化文件操作。在这个场景中,我们关注的是...

    java文件流.pdf

    在Java编程中,文件流(File Stream)是处理文件输入/输出操作的关键工具。Java的I/O库提供了多种类来处理不同类型的流,如字节流(Byte Stream)和字符流(Character Stream)。以下将详细介绍文件流中的几个关键...

    高效处理文件流 java文件

    里面包含了高效处理文件流的一个java文件,工作时总会用到 个人原创 请使用者标明作者信息 谢谢 oneRose 奉献(下载后的朋友们给点意见 谢谢)

    java httpServletResponse返回流进行 下载 - 姐呵呵博客专栏 - CSDN博客1

    在返回文件流前,我们需要设置响应头,确保浏览器知道我们正在发送一个可下载的文件。关键在于设置`Content-Type`和`Content-Disposition`两个响应头: ```java response.setContentType("application/octet-stream...

    JAVA文件I/O流上传类

    JAVA文件I/O流上传类 MyFileSeparate 文件上传

    Java以流的形式上传文件

    ### Java以流的形式上传文件 在现代软件开发中,文件上传是常见的功能之一,尤其是在Web应用中。本文将详细介绍如何使用Java通过流的形式实现文件上传,并解析提供的代码示例。 #### 流的概念 在Java中,流...

Global site tag (gtag.js) - Google Analytics