Java中写文件操作


OutputStream 和 Writer


  • OutputStream类(直接操作byte数组)

该类是字节输出流的抽象类,定义了输出流的各种操作方法。如下图是OutputStream的层次结构:

  • ByteArrayOutputStream:字节数组流,可以捕获内存缓冲区的数据,转换为字节数组。该类有两个构造方法:

new ByteArrayOutputStream();

new ByteArrayOutputStream(int size);    //size表示初始化字节数组缓冲区的大小

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        bos.write(‘q‘);
        bos.write(‘a‘);   //将字节写入该字符数组
        bos.reset();      //重置该字节数组,即将如上写入的‘q‘ ‘a‘字节清空
        byte[] b = {‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘};
        bos.write(b, 1, 7);   //从b数组的第一个下标连续写入长度为7个字符
        try {
            FileOutputStream fs = new FileOutputStream("SourceFile/employee");
            bos.writeTo(fs);   //将字符数组写入文档
            fs.close();
            bos.flush();
            bos.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
  • FileOutputStream:以字节流的方式将二进制数据或者字符数据输出到文件中,该类有5个构造方法,我们在代码中介绍了2和4的用法:
  1. new FileOutputStream(File);
  2. new FileOutputStream(FileDescriptor);    //FileDescriptor.out将内容输出到控制台
  3. new FileOutputStream(String);              //String为文件路径
  4. new FileOutputStream(File, boolean);     //boolean为true时,则不覆盖文件,在文件的末尾添加内容,false则覆盖文件
  5. new FileOutputStream(String, boolean); //同上
        try {
            FileOutputStream fs1 = new FileOutputStream(FileDescriptor.out);
            FileOutputStream fs2 = new FileOutputStream(new File("SourceFile/employee"), true); //在该文件的末尾添加内容
            fs1.write("https://www.cnblogs.com/zhanglei93/".getBytes());   //write()方法可以写入byte数组、int
            fs1.close();
            fs2.write("https://www.cnblogs.com/zhanglei93/".getBytes());
            fs2.flush();   //清空缓存里的数据,并通知底层去进行实际的写操作
            fs2.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
  • BufferedOutputStream是一个缓冲数据输出流接口,类中有一个byte数组,调用write()函数时,首先向这个数组中写入数据,然后当某些时刻(数组写满等)会将这些数组写入到流之中,该类有两个构造方法:

new BufferedOutputStream(OutputStream)

new BufferedOutputStream(OutputStream,int)   //int的值规定了byte数组的大小

        try {
            FileOutputStream fs = new FileOutputStream("SourceFile/employee");
            BufferedOutputStream bos = new BufferedOutputStream(fs);
            bos.write("https://www.cnblogs.com/zhanglei93/".getBytes());  //write()方法可以写入byte数组、int
            fs.close();
            bos.flush();
            bos.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
  • PrintStream可以方便的输出各种类型的数据,该类主要用于操作字节流,且该类的方法不抛出IOException。该类有8个构造方法:

new PrintStream(File);

new PrintStream(OutputStream);

new PrintStream(String);    //文件路径及名称

new PrintStream(File, String);   //String  编码格式

new PrintStream(OutputStream, boolean);   //是否自动刷新

new PrintStream(OutputStream, boolean, String);    //是否自动刷新、编码格式

new PrintStream(String, String);   //文件路径及名称、编码格式

关于该类的详细说明见:http://www.cnblogs.com/skywang12345/p/io_16.html

  • Writer类(首先进行decode、encode)

该类是字符输出流的抽象类,定义了输出流的各种操作方法。如下图是OutputStream的层次结构:

  • BufferedWriter通过创建缓冲数组,将写入内容先存入缓存,该类有2个构造函数:

new BufferedWriter(Writer)

new BufferedWriter(Writer, int)   //int大小为默认数组的大小

        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter("SourceFile/employee"));
            bw.write("http://www.cnblogs.com/zhanglei93/".toCharArray());   //写入char数组
            bw.write("http://www.cnblogs.com/zhanglei93/");   //写入String,还可以写入int
            CharSequence csq = "http://www.cnblogs.com/zhanglei93/p/5846592.html";
            bw.append(csq, 0, 34);
            bw.close();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
  • CharArrayWriter创建char缓冲数组,也有两个构造函数:

new CharArrayWriter();

new CharArrayWriter(int);

      CharArrayWriter cw = new CharArrayWriter(5);
      for(Employee e : employees){
          try {
              cw.write(e.getName());
              cw.append(e.getSalary() + "");
              cw.write(e.getDate().toString() + "\r\n");
              FileWriter fw = new FileWriter("SourceFile/employee");
              cw.writeTo(fw);
              fw.close();
              cw.close();
          } catch (IOException e1) {
              // TODO Auto-generated catch block
              e1.printStackTrace();
          }
      }
  • FileWriter该类包含5个构造方法:

new FileWriter(File)

new FileWriter(FileDescriptor)

new FileWriter(String)

new FileWriter(File, boolean)

new FileWriter(String, boolean)

具体的使用方法见:http://docs.oracle.com/javase/8/docs/api/java/io/FileWriter.html

  • PrintWriter该类有8种构造方法:

具体见:http://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html

PrintWriter pw = null;

    /**
     * PrintWriter(String fileName, String csn)
     * 创建具有指定文件名称和字符集且不带自动行刷新的新 PrintWriter。如不执行pw.close()则不刷新文件内容
     * @param name
     * @param code
     * @param employees
     */
    public void writeData(String name, String code, Employee[] employees){
        try {
            pw = new PrintWriter(name, code);
            writeToFile(pw, employees);
            pw.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * PrintWriter(Writer out, boolean autoFlush)
     * 创建新 PrintWriter, flag = true表示能自动刷新,即不执行pw.close()也会自动刷新内容到文件
     * @param write
     * @param flag
     * @param employees
     */
    public void writeData(Writer write, boolean flag, Employee[] employees){
        pw = new PrintWriter(write, flag);
        writeToFile(pw, employees);
        pw.close();
    }

    private void writeToFile(PrintWriter pw, Employee[] employees){
        pw.println(employees.length);
        for(Employee e : employees)
            e.writeEmployee(pw);
    }
时间: 2024-10-03 03:05:21

Java中写文件操作的相关文章

Java中的文件操作

在使用计算机编程中,常常会用到对于文件的操作,以下是我对于Java中文件的相关内容学习之后的一个总结和在学习过程中遇到的一些问题. 一.什么是文件 对于文件进行操作,首先我们要知道什么是文件.在此之前,我们要知道,计算机其实就是一个文件系统.在计算机中,我们能在硬盘中看到的所有东西都叫文件.由此看来,计算机中文件是一个很广的范围.事实上,计算机中文件被分为了3种,一个是标准文件,一个是目录文件,还有一个就是虚拟内存文件. 这三种对于文件的分类没有一个明确的定义,后缀名是(.txt..doc..m

关于文件的INode与Java中的文件操作接口

本文由作者周梁伟授权网易云社区发布. 近日做的项目中涉及到多进程共同读写多个文件的问题,文件名和最后修改时间都是可能会被频繁修改的,因而识别文件的唯一性会产生相当的麻烦,于是专门再学习了一下文件系统对文件的组织管理方式. 一.    文件在文件系统中的组织方式 一块物理磁盘可以被分为若干个分区,分区的初始化操作就是在上面建立文件系统,如ext3,ext4,ntfs或fat32等都是文件系统的概念,还有网络文件系统如NFS等.同块磁盘上的不同分区也可以被指定不同的文件系统,文件系统对文件在磁盘上的

Java中读文件操作

InputStream & Reader InputStream(字节流),如下是InputStream的层次结构: AudioInputStream:音频输入流类,该方法可以: 从外部音频文件.流或 URL 获得音频输入流 从音频输入流写入外部文件 将音频输入流转换为不同的音频格式 AudioSystem 类包括许多操作 AudioInputStream 对象的方法: getAudioInputStream(AudioFormat.Encoding targetEncoding, AudioI

java使用FileUtils文件操作神器

前言: 在工作当中我们往往遇到很多文件的操作,我们也习惯写一些自己定义的工具类来简化文件操作,其实apache的commons的FileUtils类就是这样一个工具类,使用它能大大的简化我们对文件的操作. 准备工作: 1.下载jar     地址:http://commons.apache.org/proper/commons-io/download_io.cgi 2.把commons-io-2.4.jar 这个文件导入到你的项目中 说明: 1.由于是一个工具类使用都非常的简单 所以本文只是将其

java中的集合操作类(未完待续)

申明: 实习生的肤浅理解,如发现有错误之处,还望大牛们多多指点 废话 其实我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList<XXXXX>(); 但是我仅仅只是了解,list这个类是一个可变长用来存储的对象实例的类,我甚至觉得这个List对象可以理解成数组,但是却又与java中咱们正常理解的数组很多的不同,比如说,他的长度可以随着需要自动增长,比如说,实例化一个List类就和咱们声明数组的时候是不一样的! 今天的实习生活

C++ 写文件操作

亲爱的网友,我这里有套课程想和大家分享,如果对这个课程有兴趣的,可以加我的QQ2059055336和我联系. 课程内容简介 我们软件是基于移动设备的.所以我们必然的选择了安卓作为我们的开发工具.课程中,我们将简要的介绍Android的基本概念,然后进行我们的实战开发.在开发中,大家讲学习到基本的组件,适配UI,数据的存储,多线程下载,开机广播,闹钟提醒,短信发送等实际项目开发中碰到的有用的知识点.通过课程学习,让大家能够掌握Android软件开发的流程,注意点,及优化.帮助大家迅速的掌握Andr

第三十二课、Qt中的文件操作

一.Qt中的IO操作 1.Qt中IO操作的处理方式 (1).Qt通过统一的接口简化了文件与外部设备的操作方式 (2).Qt中的文件被看做是一种特殊的外部设备 (3).Qt中的文件操作与外部设备操作相同 2.IO操作中的关键函数接口 注意:IO操作的本质:连续存储空间的数据读写 3.Qt中IO设备类型 (1).顺序存储设备:只能从头开始顺序读写数据,不能指定数据的读写位置(串口) (2).随机存储设备:可以定位到任意位置进行数据读写(seek function函数)(文件) 4.Qt中IO设备 的

第32课 Qt中的文件操作

1. Qt的中IO操作 (1)Qt中IO操作的处理方式 ①Qt通过统一的接口简化了文件和外部设备的操作方式 ②Qt中的文件被看作一种特殊的外部设备 ③Qt中的文件操作与外部设备的操作相同 (2)IO操作中的关键函数接口——IO操作的本质:连续存储空间的数据读写 ①打开设备:bool open(OpenMode mode); ②读取数据:QByteArray read(qint64 maxSize); ③写入数据:qint64 write(const QByteArray& byteArray);

目的文件已不在原目录,程序还会继续执行写文件操作吗?

最近,在现场调试程序的同事反馈回了一个问题:目的文件已不在原目录,程序还会继续执行写文件操作.我们了解了一下,具体的情况是这样的:某软件(运行在Linux下)有一个功能是在配置好的某个目录中生成文件,在文件生成的过程中,现场同事将已经生成的文件移动到了另外一个目录中:过了一段时间后发现,程序继续向移动之后的文件中写入内容,导致该文件不断增大. 为了还原现场问题,我们编写了以下程序: /********************************************************