您的位置:

Java输入输出流

在Java程序处理文件和网络通信时,输入输出流是一个非常关键且基础的概念。它是Java程序与外界交互的桥梁,它可以读写各种类型的数据,如文本、图像、音频和视频等。本文将全面介绍Java输入输出流相关知识。

一、基础认识

在Java中,输入输出流是通过java.io包提供的。输入流从任何来源读取数据,例如从文件、网络、键盘等获取数据,而输出流将数据写回文件、网络或者控制台等。Java中的输入输出流从字节流开始,提供了InputStream和OutputStream抽象类,这两个类提供了读写字节流的相关操作。

InputStream和OutputStream类是Java输入输出流抽象类的基础,它们分别提供了读和写字节的方法,如:read()和write()。在Java中还提供了Reader和Writer类,用于读写字符流。这些类在读写文件和网络通信时都非常有效。

二、使用文件输入输出流

使用文件输入输出流时,需要导入java.io.File类,同时使用FileInputStream和FileOutputStream类开启文件输入输出流。下面是Java代码实现:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileDemo {
   public static void main(String[] args) {

      File file = new File("InputFile.txt");
      FileInputStream inputStream = null;
      FileOutputStream outputStream = null;

      try {
         //使用文件输入流读取文件
         inputStream = new FileInputStream(file);
         byte[] bytesArray = new byte[(int) file.length()];
         inputStream.read(bytesArray);

         //使用文件输出流写入文件
         outputStream = new FileOutputStream("OutputFile.txt");
         outputStream.write(bytesArray);

         System.out.println("Operation done successfully");

      } catch (IOException e) {
         e.printStackTrace();
      } finally {
        try {
            inputStream.close();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
      }
   }
}

该代码使用了FileInputStream读取文件内容,使用FileOutputStream将其写回到另一个文件中。在读取文件时,先读取文件的长度,然后在相应大小的字节数组中读取内容。在写入文件时,将读取的字节数组作为write()方法的参数传递,从而将内容写入文件。其中的try-catch快和finally快用于关闭两个流。

三、使用字节数组输入输出流

字节数组输入输出流是一种特殊的流,它用于从数据源(如字节数组)中读取数据或者向目标(如字节数组)中写入数据。下面是Java代码实现:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class ByteArrayDemo {
   public static void main(String[] args) {

      byte[] bytes = { 10, 20, 30, 40, 50 };
      ByteArrayInputStream byteArrayInputStream = null;
      ByteArrayOutputStream byteArrayOutputStream = null;

      try {
         //使用ByteArrayInputStream读取字节数据
         byteArrayInputStream = new ByteArrayInputStream(bytes);
         
         //使用ByteArrayOutputStream输出字节数据
         byteArrayOutputStream = new ByteArrayOutputStream();
         int data;
         
         while ((data = byteArrayInputStream.read()) != -1) {
            byteArrayOutputStream.write(Character.toUpperCase(data));
         }

         System.out.println(Arrays.toString(byteArrayOutputStream.toByteArray()));
         
      } catch (IOException e) {
         e.printStackTrace();
      } finally {
         try {
            byteArrayInputStream.close();
            byteArrayOutputStream.close();
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }
}

该代码使用ByteArrayInputStream读取字节数组,使用ByteArrayOutputStream将其转为大写字母,再将其转为字节数组并打印输出。这里使用了字符函数Character.toUpperCase()将小写字母转换为大写字母,然后使用write()方法写入ByteArrayOutputStream流中。

四、使用字符输入输出流

Java字符输入输出流分别由Reader和Writer抽象类构成,用于读取或写入字符流。下面是Java代码实现:

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class FileWriterDemo {
   public static void main(String[] args) {

      String str = "Java I/O stream is really powerful";
      char[] chars = new char[str.length()];

      try {
         //使用FileWriter将字符写入文件
         Writer writer = new FileWriter("output.txt");
         writer.write(str);
         writer.close();

         //使用字符读取流读取文件内容
         Reader reader = new FileReader("output.txt");
         reader.read(chars);
         reader.close();

         System.out.println(chars);

      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

该代码使用FileWriter将字符流写入文件中并关闭FileWriter实例,然后使用FileReader读取写入的文件内容并存储在字符数组chars中,并且打印输出内容。这里需要注意,如果使用FileWriter时没有指定第二个参数:true,那么将覆盖原先的内容。

五、使用数据输入输出流

数据输入输出流是一种输入输出流,用于读写Java基本类型数据,如int、double、long等,以及字符串、字符数组、字节数组等数据类型。下面是Java代码实现:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

public class DataInputStreamDemo {
   public static void main(String[] args) {

      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
      DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream);

      try {
         //使用数据输出流写入基本数据类型
         dataOutputStream.writeDouble(Math.random());
         dataOutputStream.writeBoolean(true);
         dataOutputStream.writeByte(100);
         dataOutputStream.writeChar('A');

         byte[] bytes = byteArrayOutputStream.toByteArray();
         
         //使用数据输入流读取基本数据类型
         DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(bytes));

         System.out.println(dataInputStream.readDouble());
         System.out.println(dataInputStream.readBoolean());
         System.out.println(dataInputStream.readByte());
         System.out.println(dataInputStream.readChar());

         dataOutputStream.close();
         dataInputStream.close();
         
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

该代码使用ByteArrayOutputStream将写入的基本数据类型数据转换为字节数组,然后使用DataInputStream读取并打印输出读取的数据。这里首先通过writeDouble()、writeBoolean()、writeByte()和writeChar()等方法向数据输出流写入数据类型,然后将其转换为字节数组。这里需要注意的是写入和读取应该是对应的,在读取时也应该按写入的类型按顺序读取。

六、总结

在Java输入输出流中,我们通过讲解文件输入输出流、字节数组输入输出流、字符输入输出流和数据输入输出流等方式,详细介绍了Java输入输出相关知识。输入输出流是Java程序与外界交互的桥梁,可以读写各种类型的数据。涉及到输入输出流操作时,需要注意流的关闭,以免导致资源泄漏。