📜  使用 FileOutputStream 创建文件

📅  最后修改于: 2022-05-13 01:54:52.973000             🧑  作者: Mango

使用 FileOutputStream 创建文件

FileOutputStream 类属于字节流,以单个字节的形式存储数据。它可用于创建文本文件。文件表示将数据存储在第二个存储介质(如硬盘或 CD)上。文件是否可用或是否可以创建取决于底层平台。特别是某些平台,允许一次仅由一个 FileOutputStream(或其他文件写入对象)打开一个文件以进行写入。在这种情况下,如果涉及的文件已经打开,则此类中的构造函数将失败。

FileOutputStream 用于写入原始字节流,例如图像数据。对于写入字符流,请考虑使用 FileWriter。

重要方法:

  • void close() :关闭此文件输出流并释放与此流关联的所有系统资源。
  • protected void finalize() :清理与文件的连接,并确保在不再引用此流时调用此文件输出流的 close 方法。
  • void write(byte[] b) :将指定字节数组中的 b.length 个字节写入此文件输出流。
  • void write(byte[] b, int off, int len) :从偏移量 off 开始的指定字节数组中写入 len 个字节到此文件输出流。
  • void write(int b) :将指定字节写入此文件输出流。

将按照以下步骤创建存储一些字符(或文本)的文本文件:

  1. 读取数据:首先要从键盘读取数据。为此,将键盘与某个输入流类相关联。使用 DataInputSream 类从键盘读取数据的代码如下:
    DataInputStream dis =new DataInputStream(System.in);

    这里 System.in 表示与 DataInputStream 对象链接的键盘

  2. 将数据发送到 OutputStream:现在,将要存储数据的文件关联到某个输出流。为此,请借助可以将数据发送到文件的 FileOutputStream。将 file.txt 附加到 FileOutputStream 可以这样完成:
    FileOutputStream fout=new FileOutputStream(“file.txt”);
  3. 从 DataInputStream 读取数据:下一步是从 DataInputStream 读取数据并将其写入 FileOutputStream 。这意味着从dis对象读取数据并将其写入fout对象,如下所示:
    ch=(char)dis.read();
    fout.write(ch);
  4. 关闭文件:最后,任何文件都应在对其进行输入或输出操作后关闭,否则可能会损坏文件中的数据。关闭文件是通过关闭关联的流来完成的。例如, fout.close(): 将关闭 FileOutputStream ,因此无法将数据写入文件。

执行:

//Java program to demonstrate creating a text file using FileOutputStream
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
class Create_File
{
    public static void main(String[] args) throws IOException 
    {
        //attach keyboard to DataInputStream
        DataInputStream dis=new DataInputStream(System.in);
  
        // attach file to FileOutputStream
        FileOutputStream fout=new FileOutputStream("file.txt");
  
        //attach FileOutputStream to BufferedOutputStream
        BufferedOutputStream bout=new BufferedOutputStream(fout,1024);
        System.out.println("Enter text (@ at the end):");
        char ch;
  
        //read characters from dis into ch. Then write them into bout.
        //repeat this as long as the read character is not @
        while((ch=(char)dis.read())!='@')
        {
            bout.write(ch);
        }
        //close the file
        bout.close();
    }
}

如果再次执行该程序,file.txt 的旧数据将丢失,任何最近的数据仅存储在该文件中。如果我们不想丢失文件的先前数据,只需将新数据附加到现有数据的末尾,这可以通过在文件名中写入 true 来完成。

FileOutputStream fout=new FileOutputStream(“file.txt”,true);

使用 BufferedOutputStream 提高效率

通常,每当我们使用 FileOutputStream 将数据写入文件时:

fout.write(ch);

在这里,调用 FileOutputStream 将字符写入文件。让我们估计一下从键盘读取 100 个字符并将它们全部写入文件所需的时间。

  • 让我们假设使用 DataInputStream 将数据从键盘读入内存,将 1 个字符读入内存需要 1 秒,而 FileOutputStream 再花 1 秒将这个字符写入文件。
  • 因此,读取和写入文件需要 200 秒。这是在浪费很多时间。另一方面,如果使用 Buffered 类,它们会提供一个缓冲区,该缓冲区首先填充来自缓冲区的字符,这些字符可以立即写入文件。缓冲类应与其他流类一起使用。
  • 首先,DataInputStream 通过为每个字符花费 1 秒从键盘读取数据。该字符被写入缓冲区。因此,要将 100 个字符读入缓冲区,需要 100 秒时间。现在 FileOutputStream 将在一个步骤中写入整个缓冲区。因此,读取和写入 100 个字符只需要 101 秒。同理,阅读类用于提高阅读操作的速度。将 FileOutputStream 附加到 BufferedOutputStream 为:
    BufferedOutputStream bout=new BufferedOutputStream(fout,1024);

    这里,缓冲区大小被声明为 1024 字节。如果未指定缓冲区大小,则使用 512 字节的默认大小

BufferedOutputStream 类的重要方法:

  • void flush() :刷新这个缓冲的输出流。
  • void write(byte[] b, int off, int len) :从偏移量 off 开始的指定字节数组中写入 len 个字节到此缓冲输出流。
  • void write(int b) :将指定字节写入此缓冲输出流。

输出:

C:\> javac Create_File.java
C:\> java Create_File
Enter text (@ at the end):
This is a program to create a file
@

C:/> type file.txt
This is a program to create a file

相关文章:

  • 字符流与字节流
  • Java中的文件类
  • 使用 FileWriter 和 FileReader 在Java中处理文件