在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程序与外界交互的桥梁,可以读写各种类型的数据。涉及到输入输出流操作时,需要注意流的关闭,以免导致资源泄漏。