I/O流的典型使用方法

缓冲输入文件

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
可以看做是“生产-消费”的一种变体,使用管道可以将设计方案与逻辑代码解耦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值