在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程序与外界交互的桥梁,可以读写各种类型的数据。涉及到输入输出流操作时,需要注意流的关闭,以免导致资源泄漏。
原创文章,作者:TKIY,如若转载,请注明出处:https://www.506064.com/n/147510.html
微信扫一扫
支付宝扫一扫