Java IO学习笔记+代码(3)

发布时间:2019-09-03 08:54:39编辑:auto阅读(1439)

    字符流处理
    /*
     * ProcesserCharacterStream.java
     *
     * Created on 2006年8月23日, 上午8:02
     *
     * 字符流处理
     *
     * java.io包中加入了专门用于字符流处理的类,这些类都是Reader和Writer类的子类,
     * Reader和Writer是两个抽象类,只提供了一系列用于字符流处理的接口,不能生成这
     * 两个类的实例。
     * java.io包中用于字符流处理的最基本的类是InputStreamReader和OutputStreamWriter,
     * 用来在字节流和字符流之间作为中介。
     *
     * 下面是InputStreamReader类和OutputStreamWriter类的常用方法:
     *
    * public InputStreamReader(InputStream in)
     * 根据当前平台缺省的编码规范,基于字节流in生成一个输入字符流。
    * public InputStreamReader(InputStream in, String sysCode)throws UnSupportedEncodingException
     * 按照参数sysCode指定的编码规范,基于字节流in构造输入字符流,如果不支持参数sysCode中指定的编码规范,就会产生异常。
    * public OutputStreamWriter(OutputStream out)
     * 根据当前平台缺省的编码规范,基于字节流out生成一个输入字符流。
    * public OutputStreamWriter(OutputStream out, String sysCode) throws UnsupportedEncodingException
     * 按照参数sysCode指定的编码规范,基于字节流out构造输入字符流,如果不支持参数sysCode中指定的编码规范,就会产生异常。
    * public String getEncoding()
     * 获得当前字符流使用的编码方式。
    * public void close() throws IOException
     * 用于关闭流。
    * public int read() throws IOException
     * 用于读取一个字符。
    * public int read(char[] cbuf, int off, int len)
     * 用于读取len个字符到数组cbuf的索引off处。
    * public void write(char[] cbuf, int off, int len) throws IOException
     * 将字符数组cbuf中从索引off处开始的len个字符写入输出流。
    * public void write(int c) throws IOException
     * 将单个字符写入输入流。
    * public void write(String str, int off, int len) throws IOException
     * 将字符串str中从索引off位置开始的ltn个字符写入输出流。
     *
     * 此外,为了提高字符流处理的效率,在Java语言中,引入了BufferedReader和BufferWriter类,这两个类对字符流进行块处理。
     * 两个类的常用方法如下:
     * public BufferedReader(Reader in)
     * 用于基于普通字符输入流in生成相应的缓冲流。
     * public BufferedReader(Reader in, int bufSize)
     * 用于基于普通字符输入流in生成相应的缓冲流,缓冲区大小为参数bufSize指定。
     * public BufferedWriter(Writer out)
     * 用于基于普通字符输入流out生成相应的缓冲流。
     * public BufferedWriter(Writer out, int bufSize)
     * 用于基于普通字符输入流out生在相应缓冲流,缓冲流大小为参数bufSize指定。
     * public String readLine() throws IOException
     * 用于从输入流中读取一行字符。
     * public void newLine() throws IOException
     * 用于向字符输入流中写入一行结束标记,值得注意的是,该标记不是简单的换行符"\n",而是系统定义的属性line.separator。
     */
    package study.iostudy;
    import java.io.*;
    public class ProcesserCharacterStream
    {
        public static void main(String[] args)
                throws FileNotFoundException, IOException
        {
            String lineStr;
            FileInputStream fileInStream;
            InputStreamReader inputReader;
            BufferedReader bufReader;
            FileOutputStream fileOutStream;
            OutputStreamWriter outputWriter;
            BufferedWriter bufWriter;
            fileInStream = new FileInputStream("d:\\mydir\\secondFile.txt");
            inputReader = new InputStreamReader(fileInStream);
            bufReader = new BufferedReader(inputReader);
            System.out.println("------------------------------------------------");
            System.out.println("There are file content before modify:");
            while ((lineStr = bufReader.readLine()) != null)
                System.out.println(lineStr);
            bufReader.close();
            inputReader.close();
            fileInStream.close();
            fileOutStream = new FileOutputStream("d:\\mydir\\secondFile.txt");
            outputWriter = new OutputStreamWriter(fileOutStream);
            bufWriter = new BufferedWriter(outputWriter);
            String newStr = new String("Modify the file ! \r\nThis is a nice thing. \r\nWe can write anything.");
            bufWriter.write(newStr, 0, newStr.length());
            System.out.println(newStr);
            bufWriter.close();
            outputWriter.close();
            fileOutStream.close();
            fileInStream = new FileInputStream("d:\\mydir\\secondFile.txt");
            inputReader = new InputStreamReader(fileInStream);
            bufReader = new BufferedReader(inputReader);
            System.out.println("------------------------------------------------");
            System.out.println("There are file content after modify:");
            while ((lineStr = bufReader.readLine()) != null)
                System.out.println(lineStr);
            bufReader.close();
            inputReader.close();
            fileInStream.close();
        }
    }
     
    接收键盘输入数据
    /*
     * OutputKeyPress.java
     *
     * Created on 2006年8月23日, 上午9:27
     *
     * 接收键盘输入数据
     */
    package study.iostudy;
    import java.io.*;
    public class OutputKeyPress
    {
        public static void main(String[] args)
        {
            System.out.println("This is a example about acceptance of keyboard.");
            String tempStr = "0";
            try
            {
                InputStreamReader inputReader;
                BufferedReader bufReader;
                inputReader = new InputStreamReader(System.in);
                bufReader = new BufferedReader(inputReader);
                tempStr = bufReader.readLine();
                System.out.println("Input num is: " + tempStr);
            }catch(IOException e)
            {
                e.printStackTrace();
            }
            int n = Integer.parseInt(tempStr);
            int nultiNum = 1;
            for (int i =1; i <= n; i++)
            {
                nultiNum *= i;
            }
            System.out.println("multiply of input number is: " + nultiNum);
        }   
    }
     
    过滤流
    /*
     * FilterStream.java
     *
     * Created on 2006年8月23日, 上午9:40
     *
     * 过滤流
     *
     * 过滤流在读/写数据的同时可以对数据进行处理,并提供了同步机制,
     * 这样在同一时刻只有一个线程可以访问一个I/O流。在java.io包中,
     * FilterInputStream和FilterOutputStream类是所有过滤输入流和
     * 输出流的父类,它们是抽象类,本身不能生成任何实例,在这两上类
     * 之下,分别实现了几物特殊的过滤输入流和输出流,利用这些特殊输
     * 入流和输出流的实例可以进行流处理。
     *
     * 下面介绍几个过滤输入流和输出流的子类:
     *
     * BufferedInputStream 和 BufferedOutputStream
     * 这两个类实现了带缓冲的过滤流,将任意的输入流和输出流绑定到缓
     * 冲流上就会提高性能。
     * 对于BufferedInputStream类,当系统读取数据时,数据按块读入缓
     * 冲区,随后读操作直接访问缓冲区。使用BufferedOutputStream进行
     * 输出时,数据首先写入缓冲区,当缓冲区满时,缓冲区中的数据写入
     * 连接的输出流,BufferedOutputStream类提供的方法flush()可以强
     * 制将缓冲区的内容全部写入输出流。
     *
     * DataInputStream 和 DataOutputStream
     * 这两个类不仅能读写数据流,而且能读写各种各样的Java语言本身固
     * 有的数据类型,如int、float等。
     *
     * PushbackInputStream
     * PushbackInputStream类提供了方法将刚读过的字节退回到输入流中,
     * 后面的内容就可以用到该字节。
     */
     
    package study.iostudy;
    import java.io.*;
    public class FilterStream
    {
        public static void main(String[] args)
        {
            try
            {
                FileInputStream inStream;
                FileOutputStream outStream;
                BufferedInputStream bufInObj;
                BufferedOutputStream bufOutObj;
                DataInputStream dataInObj;
                PushbackInputStream pushObj;
                byte[] tempBuf = new byte[1024];
                int copyLen;
                inStream = new FileInputStream("d:\\mydir\\secondFile.txt");
                outStream = new FileOutputStream("d:\\mydir\\thirdFile.txt");
                bufInObj = new BufferedInputStream(inStream);
                bufOutObj = new BufferedOutputStream(outStream);
                dataInObj = new DataInputStream(inStream);
                System.out.println(dataInObj.readBoolean());
                while ((copyLen = bufInObj.read(tempBuf, 0, 1024)) != -1)
                {
                    String copyStr = new String(tempBuf);
                    System.out.println(copyStr);
                    bufOutObj.write(tempBuf, 0, copyLen);
                    bufOutObj.flush();
                }
                int pushData;
                byte[] pushByte = {'o', 'k'};
                pushObj = new PushbackInputStream(
                        new FileInputStream("d:\\mydir\\thirdFile.txt"), 1000);
                while ((pushData = pushObj.read()) != -1)
                {
                    if (Character.isLetter((char)pushData))
                    {
                        System.out.print((char)pushData);
                    }
                    else
                    {
                        System.out.println();
                        pushObj.unread(pushByte);
                    }
                }
            }catch(FileNotFoundException e)
            {
                System.out.println("File not found or persission denied.");
            }catch(IOException e)
            {
                System.out.println("error:" + e);
            }
        }
        /*
         * 在上面的程序中,我们首先声明了FileInputStream类对象inStream和
         * FileOutputStream类的对象outStream,接着声明了BufferInputStream
         * 类对象bufObj、BufferedOutputStream类对象bufOutObj、
         * DataInputStream类对象dataInObj以及PushbackInputStream类对象pushObj,
         * 在try代码块中对上面这些对象进行初始化,程序的目的是通过BufferedInputStream
         * 类对象bufInObj和BufferedOutputStream类对象bufOutObj将secondFile.txt
         * 文件中内容输出到屏幕,并将该文件的内容写入thirdFile.txt文件中,值得注意的是,
         * 将secondFile.txt文件中的内容输出之前,程序中使用
         * "System.out.println(dataInObj.readBoolean());" 语句根据readBoolean()结果
         * 输出了true,而secondFile.txt文件开始内容为“Modify”,和一个字符为M,
         * 因此输出的文件内容没有“M”字符,thirdFile.txt文件中也比secondFile.txt
         * 文件少第一个字符“M”。随后,通过PushbackInputStream类对象pushObj读取
         * thirdFile.txt文件中的内容,输出读到的字符,当读到的不是字符,输出回车,将字符
         * 数组pushByte写回到thirdFile.txt文件中,也就是“ok”写回文件中。
         */
     
    }
     
    顺序输入流
    /*
     * SequenceStream.java
     *
     * Created on 2006年8月23日, 上午10:55
     *
     * 顺序输入流
     *
     * java.io包中提供了SequenceInputStream类,用于将多个输入流顺序连接起来,
     * 使它们看起来就像一个较长的流。
     */
    package study.iostudy;
    import java.io.*;
    public class SequenceStream
    {
        public static void main(String[] args)
        {
            FileInputStream fileStream1, fileStream2;
            try
            {
                String allStr;
                fileStream1 = new FileInputStream("d:\\mydir\\secondFile.txt");
                fileStream2 = new FileInputStream("d:\\mydir\\thirdFile.txt");
                SequenceInputStream seqStream = new SequenceInputStream(
                        fileStream1, fileStream2);
                BufferedInputStream bufObj = new BufferedInputStream(seqStream);
                byte[] bufByte = new byte[1024];
                while (bufObj.read(bufByte, 0, 1024) != -1)
                {
                    String tempStr = new String(bufByte);
                    System.out.println(tempStr);
                }
            }catch(FileNotFoundException e)
            {
                System.out.println("File not found or no permission.");
            }catch(IOException e)
            {
                System.out.println("error:" + e);
            }
        }
    }
     
    对象串行化
     
    /*
     * SerializableObject.java
     *
     * Created on 2006年8月23日, 上午11:26
     *
     * 对象串行化
     *   对象通过写出描述自己状态的数值来记录自己,这个过程叫做对象串行化。对象的寿命通
     * 常是随着生成该对象的程序的终止而终止,在有些情况下,需要将对象的状态保存下来,然后
     * 在必要的时候将对象恢复,值得注意的是,如果变量是另一个对象的引用,则引用的对象也要
     * 串行化,串行化是一个递归的过程,可能会涉及到一个复杂树结构的串行化,比如包括原有对
     * 象,对象的对象等。
     *   在java.io包中,接口Serializable是实现对象串行化的工具,只有实现了Serializable
     * 的对象才可以被串行化。Serializable接口中没有任何的方法,当一个类声明实现Seriali-
     * zable接口时,只是表明该类遵循串行化协议,而不需要实现任何特殊的方法。
     *   在进行对象串行化时,需要注意将串行化的对象和输入、输出流联系起来,首先通过对
     * 象输出流将对象状态保存下来,然后通过对象输入流将对象状态恢复。
     */
     
    package study.iostudy;
     
    import java.io.*;
     
    class Book implements Serializable
    {
        String isbn;
        String name;
        int page;
        String type;
        public Book(String isbn, String name, int page, String type)
        {
            this.isbn = isbn;
            this.name = name;
            this.page = page;
            this.type = type;
        }
    }
     
    public class SerializableObject implements Serializable
    {
        public static void main(String[] args)
                throws IOException, ClassNotFoundException
        {
            Book bookObj = new Book("7-02-016450-1", "Java", 218, "programming");
            FileOutputStream fileOStream = new FileOutputStream("temp.ser");
            ObjectOutputStream objOutStream = new ObjectOutputStream(fileOStream);
            try
            {
                objOutStream.writeObject(bookObj);
                objOutStream.close();
            }catch(IOException e)
            {
                e.printStackTrace();
            }
            bookObj = null;
            FileInputStream fileInStream = new FileInputStream("temp.ser");
            ObjectInputStream objInStream = new ObjectInputStream(fileInStream);
            try
            {
                bookObj = (Book)objInStream.readObject();
                objInStream.close();
            }catch(IOException e)
            {
                e.printStackTrace();
            }
            System.out.println("------------------------------------------------");
            System.out.println("There are information about book:");
            System.out.println("ISBN Number: " + bookObj.isbn);
            System.out.println("Book Name: " + bookObj.name);
            System.out.println("Book Page: " + bookObj.page);
            System.out.println("Book Type: " + bookObj.type);
        }
    }

关键字