第8章 输入/输出流
【1】简述java流的概念、特点、及表示
[解答]:Java的流是一个比文件所包含范围更广的概念。流是一个可被顺序访问的数据序列,是对计算机输入数据和输出数据的抽象。
Java中的流是用类来表示。#
Java 流的特点:数据可以是未经加工的原始二进制数据,也可以是经一定编码处理后
html获取input输入的数据符合某种格式规定的特定数据,java中的数据流有字节流和字符流之分。
【2】描述java.io包中输入/输出流的类层次结构。
[解答]:
以字节为导向的stream
基类是InputStream和OutputSteam
stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Input和Output  stream)都包括两种类型:
a) input stream:
1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
2) StringBufferInputStream:把一个String对象作为InputStream
3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作
4) PipedInputStream:实现了pipe的概念,主要在线程中使用
b) Out stream
1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
2) FileOutputStream:把信息存入文件中
3) PipedOutputStream:实现了pipe的概念,主要在线程中使用
以Unicode字符为导向的stream包括下面几种类型:
a) Input Stream
1) CharArrayReader:与ByteArrayInputStream对应
2) StringReader:与StringBufferInputStream对应
3) FileReader:与FileInputStream对应
4) PipedReader:与PipedInputStream对应
b) Out Stream
1) CharArrayWrite:与ByteArrayOutputStream对应
2) StringWrite:无与之对应的以字节为导向的stream
3) FileWrite:与FileOutputStream对应
4) PipedWrite:与PipedOutputStream对应
以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,只是在操作时的导向不同。
【3】说明输入流,输出流的概念及作用。如何实现输入和输出流类的读写方法的传递。
[解答]:就流的运行方向来说,流分为输入流和输出流,输入流将外部数据引入计算机。输出流是交数据引导到外部设备。
输入输出流读写方法的传递一般可以以一个字节缓冲数组做为中间的桥梁。
【4】解释字节流,字符流,字节文件输入流和字符文件输出流的含义。
[解答]:字节流:以二进制数据这最基本的数据表示方式的流。
字符流:按每16位的Unicode码来处理字符数据的流。
字节文件输入流:字节文件输入流是从字节输入流中继承而来的,它用于处理二进制的文件输入操作。
字符文件输出流:字符文件输出流是从字符输出流中继承而来的,它用于处理字符为操作单位的文件数据的输出。
【5】简述File 类在文件管理中的作用与使用方法。
[解答]:作用:提供了描述文件和目录的操作与管理的方法,它不负责数据的输入,输出。专门用来管理磁盘文件与目录。
使用方法:
(1)创建File类的对象。
(2)以getName()等方法来判断或获取文件或目录信息。
(3)对文件及目录进行操作
【6】计算Fibonacii数列,a1=1,an=an-1+an-2 即前两个数是1,从3个数开始,每个数是前两个数的和,计算数列的前20项,并用字节文件流的方式输出到一个文件,要求每5项1行。
[解答]:
import java.io.File;
import java.io.FileOutputStream;
/**
* 计算Fibonacii数列的前20项
*/
public class Fibonacii {
    //数列的长度
    int i = 0;
    int[] f = null;
    public Fibonacii(int i) {
        this.i = i;
    }
    /**
    * 得到数列的函数
    * @return int[]
    */
    public int[] getFibonacii() {
        if (i < 2) {
            return new int[] { 1, 1 };
        } else {
            f = new int[i];
            //给数列赋初值
            f[0] = 1;
            f[1] = 1;
            for (int k = 2; k < i; k++) {
                f[k] = f[k - 1] + f[k - 2];
            }
            return f;
        }
    }
    /**
    * 保存入文件
    * @param name
    */
    public void saveToFile(String name) {
        try {
            File file = new File(name);
            FileOutputStream fo = new FileOutputStream(file);
            //换行
            int l = '\n';
            for (int i = 0; i < 20; i++) {
                //每5个一行
                if (i != 0 && i % 5 == 0) {
                    fo.write(l);
                }
                fo.write(f[i]);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //test and display
    public static void main(String[] args) {
        int[] fb20 = null;
        Fibonacii fb = new Fibonacii(20);
        fb20 = fb.getFibonacii();
        //打印
        for (int i = 0; i < 20; i++) {
            System.out.println(fb20[i]);
        }
        fb.saveToFile("D:\\a.dat");
    }
}
【7】利用文件输入/输出流类编程实现一个信函文件的显示与复制
[解答]:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
/**
*文件的显示和复制
*/
public class FileDisplayAndCopy {
    //复制的文件
    File fileCopy;
    //读取的文件名
    String filename="";
    //用来存放数据的StringBuffer;
    StringBuffer sb=new StringBuffer("");
    /**
    * @param fileCopy 拷贝的文件
    * @param filename 源文件
    */
    public FileDisplayAndCopy(String fileCopy,String filename){
        this.filename=filename;
        this.fileCopy=new File(fileCopy);
    }
    /**
    * 读出内容并显示
    */
    public void display(){
       
        try {
            FileReader fr=new FileReader(filename);
            BufferedReader br=new BufferedReader(fr);
            //读数据
            String str;
            while((adLine())!=null){
                sb.append(str);
                sb.append('\n');
            }
           
        } catch (Exception e) {
            e.printStackTrace();
        }
        //显示
        System.out.String());
    }
   
    public void copy(){
        try {
            FileWriter fw=new FileWriter(fileCopy);
            BufferedWriter bw=new BufferedWriter(fw);
            //写数据流
            bw.String(),String().length());
            bw.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //test
    public static void  main(String[] args){
       
        FileDisplayAndCopy fda=new FileDisplayAndCopy("d:\\a.txt","d:\\b.txt");
        fda.display();
        py();
    }
}
【8】建立一个文本文件,输入一段短文,编写一个程序,统计文件中字符的个数,并将结果写入另一个文件
[解答]:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
/**
* 统计文件中字符的个数,并将结果写入另一个文件
*/
public class FileCharCounter {
    //源文件和目的文件
    File fileDec;
    String src;
    StringBuffer sb = new StringBuffer("");
    public FileCharCounter(String dec, String src) {