输入流
我们通过一个示例,来看看输入流应该如何使用,首先我们在D
盘下创建一个hello.txt
文件。输入文本Hello Java Hello InputStream
。
在main
方法中加入如下代码:
输出:
Hello Java Hello InputStream
代码解释:
这个例子我们主要目的是,读取文件中的数据并将数据显示在控制台。
实现步骤是:首先读取文件转换成文件输入流(FileInputStream
),然后定义一个字节数组作为容器用来存储即将读取到的数据。fs.read(b)
函数的作用是将数据读取到b
数组中,最后通过编码表,将字节数组编码成字符。
输出流
我们使用输出流将字符串hello educoder
写入到一个文件中:
运行这段代码,打开D
盘下你会发现test.txt
文件被创建了,并且文件的内容是hello educoder
。
代码解释:
最佳实践
上面作为示例的两段代码都是存在很大问题的,什么问题呢?
因为在Java中对于流的操作是非常消耗资源的,如果我们使用流对一个资源进行操作了之后却没有释放它的资源,这就会造成系统资源的浪费,如果积累了很多这种空置的资源,最后可能会导致系统崩溃。
上述代码的最佳实践为:
OutputStream out = null;
try {
String file = "D://test.txt";
out = new FileOutputStream(file);
String str = "hello educoder";
byte[] b = str.getBytes();
out.write(b);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close(); // 释放该输出流
} catch (IOException e) {
e.printStackTrace();
}
}
}
核心就是在使用完流之后,释放它所占用的资源。
package step2;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Task {
public void task() throws IOException{
/********* Begin *********/
File file1 = new File("src/step2/input/task.txt");
InputStream fs = new FileInputStream(file1);//定义一个文件输入流
byte[] b1 = new byte[1024];//定义一个字节数组
fs.read(b1);//将输入流的数据读入到字节数组中
String str1 = new String(b1, "utf-8");//通过UTF-8编码表将字节转换成字符
System.out.print(str1);//输出转换成的字节
fs.close();//释放该输出流
File file = new File("src/step2/output");//首先在src的step2中的output中创建一个文件
if(!file.exists()){//如果文件存在
file.mkdir();//调用这个函数
}
String file2 = "src/step2/output/output.txt";
OutputStream out = new FileOutputStream(file2);//定义一个文件输出流
String str2 = "learning practice";
byte[] b2 = str2.getBytes(); //字符转化成字节
out.write(b2);//字符写出到文件
out.flush(); //刷新缓冲区数据(类似保存数据)
out.close();//释放该输出流
/********* End *********/
}
}
关于字节流的输入和输出流,小白介绍到这里啦!!