内存流
- 常用的内存流包括字节数组流 ByteArrayInputStream、字符数组流 CharArrayReader、字符串流 BufferedReader;
1. 字节数组流
- 如果程序在运行的过程中要产生一些 临时文件,可以采用虚拟文件方式实现,JDK 中提供了 ByteArrayInputStream 和 ByteArrayOutputStream 两个类,可以实现类似于内存虚拟文件的功能;
- 其中 ByteArrayInputStream 是输入流的一种实现,而 ByteArrayOutputStream 是输出流的一种实现;
- java.io.ByteArrayInputStream,详见:Class ByteArrayInputStream;java.io.ByteArrayOutputStream,详见:Class ByteArrayOutputStream;
- ByteArrayInputStream 类的使用:
import java.io.InputStream;
import java.io.OutputStream;
public class Test {
public static void main(String[] args) throws Exception {
String tmp = "abc";
byte[] src = tmp.getBytes();
ByteArrayInputStream input = new ByteArrayInputStream(src);
ByteArrayOutputStream output = new ByteArrayOutputStream();
new Test().transform(input, output);
byte[] result = output.toByteArray();
System.out.println(new String(result));
}
public void transform(InputStream in, OutputStream out) {
int c = 0;
try {
while ((c = in.read()) != -1) {
int C = (int) Character.toUpperCase((char) c);
out.write(C);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. 字符数组流
- 字符数组流包括字符数组输入流 CharArrayReader 和字符数组输出流 CharArrayWriter,操作的数据都以字符为单位;
- CharArrayReader 继承自 Reader 类,用于读取字符数组;而 CharArrayWriter 继承自 Writer 类,用于输出字符数组;
- java.io.CharArrayReader,详见:Class CharArrayReader;java.io.CharArrayWriter,详见:Class CharArrayWriter;
- 字符数组的应用:
import java.io.CharArrayReader;
import java.io.IOException;
public class Test {
private static final int LEN = 5;
private static final char[] ArrayLetters = new char[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
public static void main(String[] args) {
tesCharArrayReader();
}
private static void tesCharArrayReader() {
try {
CharArrayReader car = new CharArrayReader(ArrayLetters);
for (int i = 0; i < LEN; i++) {
if (car.ready() == true) {
char tmp = (char) car.read();
System.out.printf("%d : %c\n", i, tmp);
}
}
if (!car.markSupported()) {
System.out.println("mark not supported!");
return;
}
car.mark(0);
car.skip(5);
char[] buf = new char[LEN];
car.read(buf, 0, LEN);
System.out.printf("buf=%s\n", String.valueOf(buf));
car.reset();
car.read(buf, 0, LEN);
System.out.printf("buf=%s\n", String.valueOf(buf));
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. 字符串流
- 字符串流包括字符串输入流 BufferedReader 和字符串输出流 BufferedWriter;
- BufferedReader 类是 Reader 类的子类,使用该类可以以 行 为单位读取数据;
- java.io.BufferedReader,Class BufferedReader;
- BufferedReader 类提供了 Reader 类没有的 ReaderLine() 方法,该方法可以读取文本行,使用如下:
import java.io.BufferedReader;
import java.io.FileReader;
public class Test {
public static void main(String[] args) {
FileReader fr;
try{
fr=new FileReader("C:\\Users\\80626\\Desktop\\1.txt");
BufferedReader br = new BufferedReader(fr);
String aline;
while((aline=br.readLine())!=null){
String s= new String(aline);
System.out.println(s);
}
fr.close();
br.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
- BufferedWriter 类是 Writer 类的子类,使用该类可以以 行 为单位写出数据;
- java.io.BufferedWriter,详见:Class BufferedWriter;
- BufferedWriter 类提供了 Writer 类没有的 newLine() 方法,该方法是换行标记,使用如下:
import java.io.BufferedWriter;
import java.io.FileWriter;
public class Test {
public static void main(String[] args) {
FileWriter fw;
try {
fw = new FileWriter("C:\\Users\\80626\\Desktop\\1.txt");
BufferedWriter bw = new BufferedWriter(fw);
bw.write("line 1");
bw.newLine();
bw.write("line 2");
bw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
a. 综合应用
- 创建两个 File 类对象;
- 判断两个文件是否存在,不存在就新建该文件;
- 将从一个文件中读取的数据复制到另一个文件中,最终使得两个文件内容相同;
import java.io.*;
public class Test {
public static void main(String[] args) {
try {
FileReader fr;
fr = new FileReader("C:\\Users\\80626\\Desktop\\1.txt");
File file = new File("C:\\Users\\80626\\Desktop\\2.txt");
FileWriter fos = new FileWriter(file);
BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fos);
String str = null;
while ((str = br.readLine()) != null) {
bw.write(str);
bw.newLine();
}
br.close();
bw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}