整理源于Java核心技术精讲
Writer比OutputStream 方便的一点在于可以直接使用String型数据输出
Writer
继承者FileWriter
Reader
继承者FileReader
使用Writer类进行内容的输出
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class TestDemo {
public static void main(String[] args) throws Exception{
File file = new File("D:\\1\\test.txt");
if(file.exists())
{
Writer w = new FileWriter(file);//使用子类实例化父类
String str = "hello world.";
w.write(str);
w.close();
}
}
}
使用Reader读取数据
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
public class TestDemo {
public static void main(String[] args) throws Exception{
File file = new File("D:\\1\\test.txt");
if(file.exists())
{
Reader r = new FileReader(file);
char[] data = new char[1024];
int len = r.read(data);
System.out.println(new String(data,0,len));
r.close();
}
}
}
字节流字符流的区别:
字节流针对的是终端如文件;不关闭资源,仍然可以输出。
字符流针对于缓冲区(内存),而后由缓冲区操作终端;不关闭资源,不会输出,用户可以自己调用flush()方法强制手工清空
思考题:模拟DOS系统的文件拷贝命令,由初始化参数输入源文件和拷贝文件的路径,而后执行文件拷贝操作。(考虑复制一个大文件的情况,如500MB以上)
思路:实现文件复制肯定使用的是字节流,因为文件有可能是图片,有两种实现方式
- 将复制内容读取到内存,而后将所有内容一次说输出到目标文件
采用边读边写的方式进行复制
方法二更为科学,尤其在文件比较大的情况下
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class TestDemo {
public static void main(String[] args) throws Exception{
if(args.length != 2)
{
System.out.println("执行程序命令错误");
System.exit(1);//程序退出,终止当前正在运行的java虚拟机
}
long start = System.currentTimeMillis();//记录开始时间毫秒为单位
File infile = new File(args[0]);//要复制的文件
if(!infile.exists())
{
System.out.println("源文件不存在");
System.exit(1);
}
File outfile = new File(args[1]);//目标文件
InputStream input = new FileInputStream(infile);
OutputStream output = new FileOutputStream(outfile);
int temp = 0;
byte data[] = new byte[1024];//每次读取1024
while((temp = input.read(data)) != -1)//有内容
{
output.write(data, 0, temp);//输出一个内容
}
long end = System.currentTimeMillis();
System.out.println("拷贝完成,所花费的时间:"+(end-start));
input.close();
output.close();
}
}