例如:写文本文件,在D盘目录创建文本文件Hello.txt,并往里写入若干行文本。
importjava.io.*;
/*
* 写入到D盘一个文本文件,并往里写入若干行文字。
*如果该次磁盘下有重复的内容,则删除重复的内容后再写入一个新的内容。
*/
publicclass TestWriteText
{
publicstatic void main(String[] args)
{
//在main方法中声明抛出IO异常。
//定义写入路径的字符串。
String fileName
try
{
//使用面向字符流的FileWriter类。
//直接调用构造方法,传递写入路径。FileWriter类的构造方法有五个。
FileWriterwriter = new FileWriter(fileName);
//FileWriter类的Write()方法向文件中写入字符。
writer.write("Hello!\n");
writer.write("Thisis my first text file,\n");
writer.write("I'mvery happy!\n");
writer.write("EveryDay is a new Day!\n");
writer.write("我爱我家!");
//清空流里的内容并关闭它,如果不调用该方法还没有完成所有数据的写操作,程序就结束了。
writer.close();
}
catch(IOExceptioniox)
{
System.out.println("Problemwriting" + fileName);
}
}
}
如果我们调用这个构造方法的话:FileWriter(fileName,true);则不允许重复,如果在D:盘中存在这个文件则不允许重复。
使用面向字符流的对象FileWrite类
我们可以看到Hello.txt是一个普通的ASCII码文本文件,每个英文字符占一个字节,中文字符占两个字节。
java程序中的字符串则是每个字符占用两个字节,采用Unicode编码。
如果要写入的内容更多,就应该用高效的缓冲流类:BufferedWriter.
与FileWriter不同是多个了newLine()方法用于换行。
我们使用BufferedWriter完成Hello.txt的内容。
importjava.io.*;
/*
* 写入到D盘一个文本文件,并往里写入若干行文字。
*使用BufferedWriter会更高效,可以换行。
*/
publicclass TestBufferedWriter
{
publicstatic void main(String[] args)
{
//在main方法中声明抛出IO异常。
//定义写入路径的字符串。
String fileName
try
{
//使用面向字符流的BufferedWriter类。
//相当于在FileWriter类上再套上一层管道。
BufferedWriterout = new BufferedWriter(new FileWriter(fileName));
//FileWriter类的Write()方法向文件中写入字符。
out.write("NewHello!\n");
out.newLine();
out.write("Thisis BufferWriter范例,\n");
out.newLine();
out.write("keepalone\n");
out.newLine();
out.write("lovelife\n");
//清空流里的内容并关闭它,如果不调用该方法还没有完成所有数据的写操作,程序就结束了。
out.close();
}
catch(IOExceptioniox)
{
System.out.println("Problemwriting" + fileName);
}
}
}
读文本文件。
Reader
FileReader
BufferedReader和readLine();
从Hello.txt中读取文本并显示在屏幕上。
importjava.io.*;
/*
* 从D盘的Hello.txt 中读出文件中的数据到命令行中。
*
*/
publicclass TestBufferedReader
{
publicstatic void main(String[] args)
{
//在main方法中声明抛出IO异常。
//定义写入路径的字符串。
String fileName
String line;
try
{
// 利用BufferedReader套在FileReader,处理流套在节点流上。
BufferedReaderin = new BufferedReader(new FileReader(fileName));
//首先读取一行的内容。
linein.readLine();
//判断读写的内容是否为空。
while(line!=null)
{
//输出一行。
System.out.println(line);
//继续读出下一行的内容。
linein.readLine();
}
//关闭这个“管道”。
in.close();
}
catch(IOExceptioniox)
{
System.out.println("Problemreading" + fileName);
}
}
}
显示如下:
文件的复制(略)
写二进制文件。
什么是二进制文件?
原则上,所有文件都是由8位的字节组成的,如果文件字节中的内容应被解释为字符,则文件被称为文本文件;如果解释为其他的含义,则文件被称为二进制文件。
在文字处理程序中,如果字处理软件Word产生的doc文件中,数据要被解释为字体、格式、图像和其他费字符信息。因此,这样的文件时二进制文件不用用Reader流正确读取。
好处:
输入输出更快。
比文本文件小很多。
有些数据不容易被表示为字符。
OutputStream
FileOutputStream
DataOutputStream
将三个int类型的数字写入数据文件data.dat.
importjava.io.*;
/*
* 用字节流写二进制文件。将三个int类型255 0 -1写入数据文件data.dat中。
*
*/
publicclass TestDataOutputStream
{
publicstatic void main(String[] args)
{
//在main方法中声明抛出IO异常。
//定义写入路径的字符串。
String fileName
//定义三个变量。
intvalue0 = 255;
intvalue1 = 0;
intvalue2 = -1;
try
{
//定义处理流和结点流。
DataOutputStreamout = new DataOutputStream(new FileOutputStream(fileName));
out.writeInt(value0);
out.writeInt(value1);
out.writeInt(value2);
out.close();
}
catch(IOExceptioniox)
{
System.out.println("problemwriting" + fileName);
}
}
}
我们会看到写入到dat文件二进制内容。
利用BufferedOutputStream 写二进制文件的缓冲流类,对于写入大量的数据,可提高效率。
如果是写入各种类型的数据,我们可以参考java的API文档来确定写入哪些数据。
读二进制文件。
创建的数数据文件中的3个int型数字,显示相加的结果。
importjava.io.*;
/*
* 用字节流写二进制文件。将三个int类型255 0 -1写入数据文件data.dat中。
*
*/
publicclass TestDataInputStream
{
publicstatic void main(String[] args)
{
//在main方法中声明抛出IO异常。
//定义写入路径的字符串。
String fileName
intsum = 0;
try
DataInputStream instr= new DataInputStream(
new BufferedInputStream(newFileInputStream( fileName)));
sum += instr.readInt();
sum += instr.readInt();
sum += instr.readInt();
System.out.println(
instr.close();
}
catch ( IOException iox
System.out.println("Problem reading " + fileName);
}
}
当我们不知道是三个数据的时候,多读的话就会抛出EOFException异常,所以我们将读操作放在try中。
我们可以使用嵌套的trycatch块来对异常进行进一步的处理。
过滤流:
读或写同时对数据进行处理
通过另外一个流来构造一个过滤流
大部分提供的是FilterInputStream和FilterOutputStream的子类。
对于文件类File,File的构造方法和常用方法,处理压缩文件 java.util.zip包,对象序列化,RandomAccessFile随机文件的创建和访问,我们都可以自行查阅API文档来解决问题。