概述
本篇博客向大家介绍的是如何运用java中的Stream进行文件读写,也就是说明如何通过Stream将字符串写到文件中,以及怎么把文件中的内容以字符串的形式读出来。具体地,我会介绍关于Stream的一些内容。
什么是Stream
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。这样,我们就可以通过流来和文件进行交互。下面的javaI/O流的层次关系图。
这里我们着重介绍一下和文件读写有关的两种流FileInputStream 和 FileOutputStream。
FileInputStream:该流用于从文件读取数据,它的对象可以用关键字 new 来创建。如:FileInputStream f1 = new FileInputStream(filename);创建了InputStream对象,就可以使用下面的方法来读取流或者进行其他的流操作。
方法 | 描述 |
---|---|
public void close() throws IOException{} | 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 |
protected void finalize()throws IOException {} | 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 |
public int read(int r)throws IOException{} | 这个方法从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1。 |
public int read(byte[] r) throws IOException{} | 这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。 |
public int available() throws IOException{} | 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值。 |
FileOutputStream:该类用来创建一个文件并向文件中写数据。如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。创建方式为:FileOutputStream f1 = new FileOutputStream(filename);创建OutputStream 对象完成后,就可以使用下面的方法来写入流或者进行其他的流操作。
方法 | 描述 |
---|---|
public void close() throws IOException{} | 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 |
protected void finalize()throws IOException {} | 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 |
public void write(int w)throws IOException{} | 这个方法把指定的字节写到输出流中。 |
public void write(byte[] w) | 把指定数组中w.length长度的字节写到OutputStream中。 |
Stream策略主要思想
根据上面对FileInputStream 和 FileOutputStream两种流的介绍,大家大致可以想到方法了吧。就是获取文件的流,然后通过流进行数据获取,只不过因为流中的数据都是字节形式的,所以我们需要用byte[]作为接收的容器,之后再将接收的内容转换为字符串类型即可。
Stream策略实现方法
从文件中读:首先获取文件的输入流FileInputStream f1 = new FileInputStream(filename),然后声明一个byte[]用来存放数据。之后通过FileInputStream的read(byte[] r)方法将数据读入字节数组中。最后将其转换为字符类型,转换可以直接用String的一个构造方法String(byte bytes[], int offset, int length)。另外当字节数组太小导致不能一次读完内容的时候还要多次读取。
往文件中写:首先获取文件的输出流FileOutputStream f1 = new FileOutputStream(filename);,然后将要写入文件的字符串通过outString.getBytes()方法转换为字节数组中。最后调用FileOutputStream的write(byte[] w)方法将数据写入即可。
代码展示
package readandwrite;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Stream {
public String myread(String filename) throws Exception {
// TODO 自动生成的方法存根
long starttime = System.currentTimeMillis();
StringBuilder astringBuilder = new StringBuilder();
try {
FileInputStream f1 = new FileInputStream(filename);
byte [] b = new byte[1024];
int n = 0;
while ((n = f1.read(b)) != -1) { // 当n不等于-1,则代表未到末尾
astringBuilder.append(new String(b, 0, n));
}
f1.close();
} catch (FileNotFoundException e) {
// TODO: handle exception
throw new Exception(e.toString());
} catch (IOException e) {
// TODO: handle exception
throw new Exception(e.toString());
}
long endtime = System.currentTimeMillis();
System.out.println("Stream策略读文件花费了:" + (endtime - starttime) + "ms");
return astringBuilder.toString();
}
public void mywrite(String outString, String filename) throws Exception {
// TODO 自动生成的方法存根
long starttime = System.currentTimeMillis();
try {
FileOutputStream f1 = new FileOutputStream(filename);
byte[] b = outString.getBytes();
f1.write(b);
f1.close();
} catch (FileNotFoundException e) {
// TODO: handle exception
throw new Exception(e.toString());
} catch (IOException e) {
// TODO: handle exception
throw new Exception(e.toString());
}
long endtime = System.currentTimeMillis();
System.out.println("Stream策略写文件花费了:" + (endtime - starttime) + "ms");
}
public static void main(String[] args) {
String outfilename = "src\\txt\\cd.txt";
String outString = "This is Stream strategy!";
Stream myStream = new Stream();
try {
myStream.mywrite(outString, outfilename);
System.out.println(myStream.myread(outfilename));
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}