1、InputStream
1、InputStream
InputStream
是Java中用于读取字节数据的抽象类。它是Java I/O(输入/输出)库的一部分,提供了读取字节数据的基本功能和方法。InputStream类用于从不同来源(如文件、网络连接等)读取字节流,并提供了多种方法用于读取数据。
常用的InputStream的子类包括:
- FileInputStream: 从文件中读取数据的输入流。
- ByteArrayInputStream: 从字节数组中读取数据的输入流。
- PipedInputStream: 与PipedOutputStream配合使用,在多线程间进行管道通信。
- FilterInputStream的具体子类(如BufferedInputStream和DataInputStream): 提供了对底层输入流进行过滤和功能增强。
在读取数据时,InputStrea
提供了read()
方法,用于读取单个字节数据,并在读取完所有数据后返回-1。通常,读取的字节数据可以根据实际需要转换为字符、整数等其他类型数据进行处理。
需要注意的是,在使用InputStream
读取数据时,要适当处理异常并关闭流以释放资源,防止资源泄漏和错误处理。另外,在高性能场景下,可以考虑使用BufferedInputStream
来提高读取效率。
2、FileInputStream
FileInputStream
类用于从文件中读取数据。它继承自InputStream
类,并提供了各种方法用于读取不同类型的数据,如字节、字符等。
通过创建FileInputStream对象并指定要读取的文件路径,可以从文件中读取数据。通过read()方法读取,直到返回-1
。
public void readInputStreamFile() throws IOException {
try (InputStream in = new FileInputStream("demo.txt");){
int n;
// 利用while同时读取并判断
while ((n = in.read()) != -1) {
System.out.println(n);
}
}
}
//注意此时try(obj)会自动调用close方法,如果是try{}需要调用in.close()关闭流
3、缓存
将读取的字节存入缓冲区,进行高效的读取。
int read(byte[] b)
:读取若干字节并填充到byte[]
数组,返回读取的字节数
int read(byte[] b, int off, int len)
:指定byte[]
数组的偏移量和最大填充数
public void readInputStreamFile() throws IOException {
try (InputStream in = new FileInputStream("demo.txt");){
int n;
// 定义1024个字节大小的缓冲区:
byte[] buffer = new byte[1024];
// 利用while同时读取并判断
while ((n = in.read(buffer)) != -1) {
System.out.println(n);
}
}
}
2、OutputStream
1、OutputStream
OutputStream是Java中用于写入字节数据的抽象类。它是Java I/O(输入/输出)库的一部分,提供了写入字节数据的基本功能和方法。OutputStream类用于向不同目标(如文件、网络连接等)写入字节流,并提供了多种方法用于写入数据。
一些常用的OutputStream的子类包括:
- FileOutputStream: 向文件中写入数据的输出流。
- ByteArrayOutputStream: 向字节数组中写入数据的输出流。
- PipedOutputStream: 与PipedInputStream配合使用,在多线程间进行管道通信。
- FilterOutputStream的具体子类(如BufferedOutputStream和DataOutputStream): 提供了对底层输出流进行过滤和功能增强。
在写入数据时,可以使用write(byte[] data)方法将整个字节数组写入输出流,也可以使用write(int data)方法将单个字节写入输出流。通常,需要将数据转换为字节数组才能写入输出流。
需要注意的是,在使用OutputStream写入数据时,要适当处理异常并关闭流以释放资源,防止资源泄漏和错误处理。另外,在高性能场景下,可以考虑使用BufferedOutputStream来提高写入效率。
通过write()方法将字节字写入到输出流:
public abstract void write(int b) throws IOException;
OutputStream也有byte[]
做缓存和一个flush()
方法,该方法用于强制把缓冲区内容输出,通常情况下,我们不需要调用这个flush()
方法,因为缓冲区写满了OutputStream
数据或者调用close()
方法前会调用该方法。
2、FileOutputStream
FileOutputStream
是Java中用于向文件写入字节数据的类。它是OutputStream的一个具体子类,用于将字节流写入到文件中。基本示例如下:
public void outputStreamFile() throws IOException {
try (OutputStream output = new FileOutputStream("demo.txt")) {
// 单个字符写入
output.write(72); // H
output.write(101); // e
output.write(108); // l
output.write(108); // l
output.write(111); // o
output.close();
// 此方法一个个字节写入过于麻烦,可以利用getBytes()方法将字符串转为字节再进行操作
String str = "hello";
output.write(str.getBytes("UTF-8")); // hello
}
}
需要注意的是,如果指定的文件路径不存在,则FileOutputStream
会自动创建该文件。如果文件已经存在,FileOutputStream
会将新写入的内容覆盖原有内容。如果要追加内容而不是覆盖原有内容,可以使用FileOutputStream
的另一个构造函数:
FileOutputStream fileOutputStream = new FileOutputStream("demo.txt", true);