缓冲输入文件
BufferedReader当readLine()返回null时,代表已经达到了文件末尾。
package com.zachary.io.input;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author Zachary.Zheng
* @version 1.0
* @date 2020年5月5日 下午2:02:07
*/
public class BufferedInputFile {
/**
* BufferedReader 缓冲输入文件测试
* InputStream转Reader
* @param file
* @return
* @throws IOException
*/
public static String readFileInputStream(String file) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
StringBuilder sb = new StringBuilder();
String s;
while((s = in.readLine()) != null) {
sb.append(s + "\n");
}
in.close();
return sb.toString();
}
/**
* BufferedReader 缓冲输入文件测试
* @param file
* @return
* @throws IOException
*/
public static String readFileReader(String file) throws IOException {
BufferedReader in = new BufferedReader(new FileReader(file));
StringBuilder sb = new StringBuilder();
String s;
while((s = in.readLine()) != null) {
sb.append(s + "\n");
}
in.close();
return sb.toString();
}
public static void main(String[] args) throws IOException {
System.out.println(readFileReader("src/com/zachary/io/input/BufferedInputFile.java"));
}
}
从内存中输入
StringReader read()是以int形式返回下一个字节。
package com.zachary.io.input;
import java.io.IOException;
import java.io.StringReader;
/**
* @author Zachary.Zheng
* @version 1.0
* @date 2020年5月5日 下午2:20:51
*/
public class MemoryIput {
public static void stringReader() throws IOException {
StringReader in = new StringReader("地方大锅饭归属感方式");
int c;
while((c = in.read()) != -1) {
System.out.println((char)c);
}
in.close();
}
public static void main(String[] args) throws IOException {
// 从内存中输入
StringReader in = new StringReader(BufferedInputFile.readFileReader("src/com/zachary/io/input/MemoryIput.java"));
int c;
while((c = in.read()) != -1) {
System.out.println((char)c);
}
in.close();
// 直接讲字符串用来创建一个StringReader对象
stringReader();
}
}
格式化的内存输入
DataInputStream用readByte()一次一个字节的读取字符,因此任何字节的值都是合法的,因此返回值不能用来检查输入是否结束。可以使用available()检查有多少可供读取的字符。
package com.zachary.io.input;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
/**
* @author Zachary.Zheng
* @version 1.0
* @date 2020年5月5日 下午2:35:03
*/
public class FormattedMemoryInput {
public static void main(String[] args) throws IOException {
// 格式化的内存输入
DataInputStream in = new DataInputStream(new ByteArrayInputStream(
BufferedInputFile.readFileReader("src/com/zachary/io/input/FormattedMemoryInput.java").getBytes()));
while(in.available() != 0) {
System.out.println((char)in.readByte());
}
}
}
基本的文件输出
FileWriter可以向文件写入数据,使用BufferedWriter将其包装起来用缓冲输出。
package com.zachary.io.output;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StringReader;
import com.zachary.io.input.BufferedInputFile;
/**
* @author Zachary.Zheng
* @version 1.0
* @date 2020年5月5日 下午2:41:50
*/
public class BasicFileOutput {
public static void writeByFileWrite() throws IOException {
String file = "file/output/BasicFileOutput_writeByFileWrite.out";
BufferedReader in = new BufferedReader(
new StringReader(BufferedInputFile.readFileReader("src/com/zachary/io/output/BasicFileOutput.java")));
File f = new File("file/output");
f.mkdirs(); // 创建文件夹
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file)));
String s;
while((s = in.readLine()) != null) {
out.write(s + "\n");
}
out.close();
in.close();
System.out.println(BufferedInputFile.readFileInputStream("file/output/BasicFileOutput_writeByFileWrite.out"));
}
public static void writeByOutputStream() throws IOException {
String file = "file/output/BasicFileOutput_writeByOutputStream.out";
BufferedReader in = new BufferedReader(
new StringReader(BufferedInputFile.readFileInputStream("src/com/zachary/io/output/BasicFileOutput.java")));
File f = new File("file/output");
f.mkdirs(); // 创建文件夹
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))));
String s;
while((s = in.readLine()) != null) {
out.write(s + "\n");
}
out.close();
in.close();
System.out.println(BufferedInputFile.readFileInputStream("file/output/BasicFileOutput_writeByOutputStream.out"));
}
}
文本文件输出的快捷方式
PrintWriter构造器重写,可以直接使用String创建对象。
package com.zachary.io.output;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.LineNumberInputStream;
import java.io.PrintWriter;
import java.io.StringBufferInputStream;
import java.io.StringReader;
import com.zachary.io.input.BufferedInputFile;
/**
* @author Zachary.Zheng
* @version 1.0
* @date 2020年5月5日 下午3:48:25
*/
@SuppressWarnings("deprecation")
public class FileOutputShortcut {
public static void fileOutputShortcut() throws IOException {
BufferedReader in = new BufferedReader(new StringReader(
BufferedInputFile.readFileReader("src/com/zachary/io/output/FileOutputShortcut.java")));
PrintWriter out = new PrintWriter("file/output/FileOutputShortcut.out");
String s;
int lineCount = 1;
while ((s = in.readLine()) != null) {
out.println(lineCount + ": " + s);
lineCount++;
}
out.close();
in.close();
}
public static void main(String[] args) throws IOException {
fileOutputShortcut();
}
}
存储和恢复数据
DataOutputStream写数据,Java可以保证我们使用DataInputStream能够准确的读取数据。
package com.zachary.io.output;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author Zachary.Zheng
* @version 1.0
* @date 2020年5月5日 下午4:25:28
*/
public class StoringAndRecoveringData {
public static void dataOutputStream() throws IOException {
String file = "file/output/Data.txt";
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
out.writeDouble(3.14159);
out.writeUTF("That was pi");
out.writeDouble(1.41413);
out.writeUTF("Square root of 2");
out.close();
DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
System.out.println(in.readDouble());
System.out.println(in.readUTF());
System.out.println(in.readDouble());
System.out.println(in.readUTF());
in.close();
}
public static void main(String[] args) throws IOException {
dataOutputStream();
}
}
读写随机访问文件
RandomAccessFile拥有读取各种基本数据类型和UTF-8字符串的各种方法。
package com.zachary.io.output;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* @author Zachary.Zheng
* @version 1.0
* @date 2020年5月5日 下午4:39:59
*/
public class UsingRandomAccessFile {
static String FILE = "file/output/rtest.dat";
public static void display() throws IOException {
RandomAccessFile rf = new RandomAccessFile(FILE, "r"); // 只读
for(int i =0; i< 7; i++) {
System.out.println("Value " + i + ": " + rf.readDouble());
}
System.out.println(rf.readUTF());
rf.close();
}
public static void readAndWriteFile() throws IOException {
RandomAccessFile rf = new RandomAccessFile(FILE, "rw");
for(int i =0; i< 7; i++) {
rf.writeDouble(i * 1.414);
}
rf.writeUTF("The end of the file");
rf.close();
display();
System.out.println("====================================");
rf = new RandomAccessFile(FILE, "rw");
// double总是8个字节长,所以seek找到第五个双精度
rf.seek(5*8);
rf.writeDouble(47.00001);
rf.close();
display();
}
public static void main(String[] args) throws IOException {
readAndWriteFile();
}
}
管道流
PipedInputStream,PiepdOutputStream,PipedReader,PipedWriter
可以看做是“生产-消费”的一种变体,使用管道可以将设计方案与逻辑代码解耦。