——Java培训、Android培训、iOS培训、UI培训、PHP培训、期待与您交流! ——
流是一种有方向的字节/字符数据序列。
实现输入/输出操作的类库在java.io 包中。包中有一组支持打开流、向流写数据、从流读取数据和关闭流等操作的
类,要使用这些类,程序必须导入java.io 包。
建立输入输出流对象之前可以先建立一个File(文件)对象。File 对象是File 类的实例。File 对象对应一个目录或文件,对象的属性包括文件路径、名字、文件长度、可否读写等。File 对象只用来命名文件、查询文件属性和处理目
录,不提供读写文件操作。
常用的构造方法:
(1) File(String s),由s 确定File 对象的文件名。
(2) File(String directory ,String s),由directory 确定File 对象的文件目录,由s 确定文件名。
以下是创建File 对象的示意代码:
File f1 = new file(“/mydir/myfile.txt”);
File f2 = new File(“/mydir”,”myfile.text”);
//使用File 创建文件
import java.io.*;
public class CreateNewFile{
//创建一个方法完成创建文件的目的,文件的第一个参数是文件路径和文件名,第二个参数是文件内容
//如:myfile.doc HelloJava!
public void createNewFile(String fileDirectoryAndName,String fileContent){
try{
String fileName = fileDirectoryAndName;
//创建File对象,参数为String类型,表示目录名
File myFile = new File(fileName);
//判断文件是否存在,如果不存在则调用createNewFile()方法创建新目录,否则跳至异常处理代码
if(!myFile.exists())
myFile.createNewFile();
else //如果不存在则扔出异常
throw new Exception("The new file already exists!");
//下面把数据写入创建的文件,首先新建文件名为参数创建FileWriter对象
FileWriter resultFile = new FileWriter(myFile);
//把该对象包装进PrinterWriter对象
PrintWriter myNewFile = new PrintWriter(resultFile);
//再通过PrinterWriter对象的println()方法把字符串数据写入新建文件
myNewFile.println(fileContent);
resultFile.close(); //关闭文件写入流
}catch(Exception ex){
System.out.println("无法创建新文件!");
ex.printStackTrace();
}
}
public static void main(String[] args){
//创建类的对象并调用该对象的createNewFile()方法,创建新文件并写入数据
CreateNewFile createFile = new CreateNewFile();
createFile.createNewFile(args[0],args[1]);
}
}
Java 程序的输入和输出流称为流对象,文件读写的主要操作包括:建立流对象、读数据、写数据和关闭流。输入输出流由文件名或File 对象创建。
根据输入输出数据的类型是字节还是字符,java.io 提供两种基本抽象类:一种用于读写字节,另一种用于读写字符。
字节流用于读写二进制数据,比如图像和声音文件等。字节流数据是8位的,由InputStream 类和OutputStream
类为字节流提供API 和部分实现。字节流读和写操作由FileInputStream 类和FileOutputStream 类提供支持。它们分别是InputStream 和OutputStream 类的子类。
字符流数据是16 位的Unicode 字符,字符流能处理Unicode 字符集中的任何字符,由Reader 类和Writer 类为字符流提供API 和部分实现。读和写操作由FileReader 类和FileWriter 类提供支持。它们分别是Reader 和Writer 的子类。
通过流的构造方法建立流对象,创建输入输出流对象的常用构造方法用2种,下面以创建FileInputStream 类的流对象为例说明创建流对象的方法,创建FileOutputStream 类、FileReader 类和FileWriter 类的流对象与此完全类似。
由于使用输入流的构造方法创建输入流时,可能会出现FileNotFoundException 异常。所以创建输入流的代码必须出现在try…catch 语句结构中,让程序能检测并处理这个异常。所以,创建输入流代码呈以下形式:
try{
FileInputStream ins = new FileinputStream(“myfile.data”);//创建输入流对象。
}catch(FileNotFoundException e){
System.out.println(“文件找不到:”+e);
}
上述代码把输入流对象与文件关联起来,使用catch 块捕获并处理文件找不到异常。
(1) int read()从输入流读取下一个字节,返回一个整数,整数范围在0~255 之间。
(2) int read(byte b[]),从输入流读取长度为b.length 的字节数据,写入到字节数组b,并返回实际所读取的字
节数。
(3) int read(byte b[],int off, int len),从数据流中读取长度为len 的字节数据,写入到字节数组b 中从下标off 开始的数组元素中,并返回实际读取的字节数。
使用以上三个方法时,如果在读数据之前,已到达输入的末端位置,没有读入一个字节数据,用返回-1 表示流在读之前已结束。
(1) int read(),从输入流读取下一个字符。如果读前已到流的末尾,则返回-1。
(2) int read(char b[]),从输入流读取长度为b.length 的字符数据,写入到字符数组b,并返回实际所读取的
字符数。
(3) int read(char b[],int off,int len),从数据流中读取长度为len 的字符数据,写入到字符数组b 中从下标off 开始的数组元素中,并返回实际读取的字符数。
long skip(long n),从输入流的当前读位置起向前移动n 个字节/字符,并返回实际跳过的字节/字符数。
FileOutputStream 类包含下面用于输出字节和字节数组的方法:
(1) int write(int c),输出一个字节。
(2) int write(byte b[]),输出存于字节数组b 中的字节数据。
(3) int write(byte b[],int off,int len),输出字节数组b 中从下标off 开始的多至len 个字节。
FileWriter 类也包含用于输出字符和字符数组的方法:
(1) int write(int c),输出一个字符。
(2) int write(char b[]),输出存于字符数组b 中的字符数据。
(3) int write(char b[],int off,int len),输出字符数组b 中人下标off 开始的多至len 个字符。
void flush(),刷空输出流,并且输出所有存储在缓冲区的内容。
流使用结束后,关闭流并且释放与该流相关的资源用方法close()。为了程序安全,也为了提高计算机的资源利用率。流使用结束后,程序应及时关闭它。
示例:
//使用字符流将一个文件的内容复制到另一个文件
import java.io.*;
public class ReaderWriter {
public static void main(String[] args) {
File iFile = new File("f1.txt");
File oFile = new File("f2.txt");
int cache;
try {
FileReader in = new FileReader(iFile);
FileWriter out = new FileWriter(oFile);
while((cache = in.read()) != -1) {
out.write(cache);
}
in.close();
out.close();
System.out.println("Finish!");
}catch(FileNotFoundException fnfe) {
System.out.println("File not Found!");
}catch(IOException ioe) {
System.out.println("Error!");
}
}
}
当程序处理的文件按行组织,并且行不是定长时,用前面所述的流类实现很不方便。程序如果要按行输入输出,需
采用缓冲式输入输出方式。
采用缓冲式输入时,对于程序的输入请求,系统一次性输入足够多的内容放在内存缓冲区中。供程序以后的输
入请求使用,待缓冲区内容用完,再一次性输入足够多的数据。
程序要采用缓冲式输入,只要先创建FileReader 对象,再利用FileReader 对象创建BufferedReader 对象,习
惯称为FileReader 对象接到BufferedReader 对象上。如以下代码所示:
BufferedReader in;
file = new FileReader(“abc.txt”);//创建fileReader 对象
in = new BufferedReader(file);//接到BufferedReader 类对象上
in.readLine();
示例:
//BufferedReader示例
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
class BufferedDemo extends JFrame implements ActionListener {
JTextArea text;
JButton button;
FileReader file;
BufferedReader in;
BufferedDemo() {
super("BufferedReader Test");
Container con = this.getContentPane();
con.setSize(200,500);
con.setLayout(new BorderLayout());
text = new JTextArea(20,50);
text.setBackground(Color.cyan);
button = new JButton("Read File");
button.addActionListener(this);
JScrollPane jsp = new JScrollPane(text);
con.add(jsp,BorderLayout.CENTER);
con.add(button,"South");
this.setVisible(true);
this.pack();
try {
File f = new File("F:\\android\\code\\BufferedTest.java");
file = new FileReader(f);
in = new BufferedReader(file);
}catch(FileNotFoundException fnfe) {
text.setText("file not found");
button.removeActionListener(this);
}
}
public void actionPerformed(ActionEvent e) {
String s;
if(e.getSource() == button) {
try {
while((s = in.readLine()) != null) {
text.append(s + '\n');
}
}catch(IOException ioe) {
text.setText("Read Error");
}
}
}
}
public class BufferedTest {
public static void main(String[] args) {
new BufferedDemo();
}
}
采用缓冲式输出时,对于程序的输出请求,系统先将内容暂存于缓冲区,待缓冲区满或输出结束,才将暂存于缓冲
区中的内容输出到流的目的地。
BufferedWriter 类是提供缓冲式输出的类。程序只要先创建FileWriter 对象,再选用FileWriter 对象创建BufferedWriter 对象,习惯称为FileWriter 对象接到BufferedWriter 对象上。对BufferedWriter 对象使用write()方法就能实现缓冲式输出。采用缓冲式输出时,write()方法只是将字符串写入到系统内设的缓冲区,等缓冲区满后,系统自动将缓冲区中内容写入到文件。如果想立即写入到文件,则需要调用flush()方法。
示例:
//BufferedWriter 示例
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
class BufWriDemo extends JFrame implements ActionListener {
JTextArea text;
JButton button;
FileWriter file;
BufferedWriter out;
BufWriDemo() {
super("BufferedWriter Test");
Container con = this.getContentPane();
con.setLayout(new BorderLayout());
text = new JTextArea(20,30);
text.setBackground(Color.gray);
text.setText("亦余心之所善兮,虽九死其犹未悔!");
button = new JButton("Writer File");
button.addActionListener(this);
JScrollPane jsp = new JScrollPane(text);
con.setSize(40,40);
con.add(jsp,BorderLayout.CENTER);
con.add(button,"South");
con.setVisible(true);
this.pack();
try {
file = new FileWriter("filewriter.txt");
out = new BufferedWriter(file);
}catch(IOException ioe) {}
}
public void actionPerformed(ActionEvent e) {
String s;
if(e.getSource() == button) {
try {
out.write(text.getText(),0,(text.getText()).length());
out.flush();
text.setText(null);
//System.exit(0);
}catch(IOException exp) {
text.setText("File Write Error\n");
System.exit(-1);
}
}
}
}
public class BufferedWriterTest {
public static void main(String[] args) {
BufWriDemo bwd = new BufWriDemo();
bwd.pack();
bwd.setVisible(true);
}
}
——Java培训、Android培训、iOS培训、UI培训、PHP培训、期待与您交流! ——