黑马程序员——Java基础---I/O流

——Java培训、Android培训、iOS培训、UI培训、PHP培训、期待与您交流! ——

一、字节流和字符流

        流是一种有方向的字节/字符数据序列。

        实现输入/输出操作的类库在java.io 包中。包中有一组支持打开流、向流写数据、从流读取数据和关闭流等操作的
类,要使用这些类,程序必须导入java.io 包。

二、File 对象

        建立输入输出流对象之前可以先建立一个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 的子类。

1. 建立流对象

      通过流的构造方法建立流对象,创建输入输出流对象的常用构造方法用2种,下面以创建FileInputStream 类的流对象为例说明创建流对象的方法,创建FileOutputStream 类、FileReader 类和FileWriter 类的流对象与此完全类似。

  • (1) FileInputStream(String name),直接指定的文件名创建输入流。
  • (2) FileInputStream(File filename),用文件对象创建输入流。

      由于使用输入流的构造方法创建输入流时,可能会出现FileNotFoundException 异常。所以创建输入流的代码必须出现在try…catch 语句结构中,让程序能检测并处理这个异常。所以,创建输入流代码呈以下形式:

try{
FileInputStream ins = new FileinputStream(“myfile.data”);//创建输入流对象。catch(FileNotFoundException e){
System.out.println(“文件找不到:”+e);
}

      上述代码把输入流对象与文件关联起来,使用catch 块捕获并处理文件找不到异常。

2. 输入流的常用方法

FileInputStream 类包含下面用于读字节和字节数组的方法:

(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 表示流在读之前已结束。

FileReader 类包含下面用于读字符和字符数组的方法:

(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 个字节/字符,并返回实际跳过的字节/字符数。

3. 输出流的常用方法

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!");
        }
    }
}

四、缓冲式输入输出

      当程序处理的文件按行组织,并且行不是定长时,用前面所述的流类实现很不方便。程序如果要按行输入输出,需
采用缓冲式输入输出方式。

1.缓冲式输入

      采用缓冲式输入时,对于程序的输入请求,系统一次性输入足够多的内容放在内存缓冲区中。供程序以后的输
入请求使用,待缓冲区内容用完,再一次性输入足够多的数据。
      程序要采用缓冲式输入,只要先创建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();
    }
}

2.缓冲式输出

      采用缓冲式输出时,对于程序的输出请求,系统先将内容暂存于缓冲区,待缓冲区满或输出结束,才将暂存于缓冲
区中的内容输出到流的目的地。
      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培训、期待与您交流! ——

你可能感兴趣的:(黑马程序员)