天天看点

Java Api之IO流输入与输出

1输入与输出

input 某个设备或者环境进行数据的输入
output 某个设备或者环境进行数据的输出

在java中,java将输入输出抽象为流对象(IO流)来解决,我们以文件设备来解释:

 输入流 从文件读取数据或者从键盘输入数据
输出流 向文件写入数据

Io流在java中又分为字节流和字符流:

字节流 所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列
字符流 字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!

2、字符流

 字符输出流超类 字符输出流子类
Writer FileWriter
BufferedWriter
字符输入流超类 字符输入流子类
 Reader FileReader
BufferedReader

(1)  字符输出流FileWriter

FileWriter的构造方法:

  FileWriter(File file) 根据给定的file对象构造一个FileWriter对象
  FileWriter(String filename) 根据给定的文件名对象构造一个FileWriter对象

举例:使用字符流向一个文件输出Hello World!

步骤:

1) 创建文件;

2) 创建输出流对象;

3) 把输出流对象指向文件;

4) 清空缓存。

5) 关闭输出流

package com.file;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class FileCreate {
    public static void main(String[] args) {
        //创建file对象
        File file=null;
        FileWriter fw=null;
        try {
            //创建文件
            file=new File("D:/test/newFile.txt");
            file.createNewFile();
            //创建文件输出流
            fw=new FileWriter(file);
            //把内容写入文件
            fw.write("Hello World!");
            //清空缓存,把内容写入文件
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fw!=null){
                try {
                    //关闭输出流
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
           
Java Api之IO流输入与输出

      当我们每次使用输出流向文件里写输出数据的时候,写入数据会覆盖文件里原有数据,若是我们想要文件里原有数据不被覆盖,我们可使用FileWrite的追加构造方法:

FileWriter(File file,boolean append) 构造方法的第二个boolean参数用来表示是否追加
FileWriter(String filename, boolean append)

     例如我们再向上例中Hello World!后追加Hello China!

package com.file;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class FileCreate {
    public static void main(String[] args) {
        //创建file对象
        File file=null;
        FileWriter fw=null;
        try {
            //创建文件
            file=new File("D:/test/newFile.txt");
            file.createNewFile();
            //创建文件输出流,输出数据将追加在文件中原有数据后面
            fw=new FileWriter(file,true);
            //把内容写入文件
            fw.write("Hello China!");
            //清空缓存,把内容写入文件
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fw!=null){
                try {
                    //关闭输出流
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
           
Java Api之IO流输入与输出

从上里可以看出,两次输入的数据(Hello World!Hello China!)是在一行,如果我们想让追加后的数据另起一行呢

在输入数据时“\r\n”表示换行,效果如下:

package com.file;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class FileCreate {
    public static void main(String[] args) {
        //创建file对象
        File file=null;
        FileWriter fw=null;
        try {
            //创建文件
            file=new File("D:/test/newFile.txt");
            file.createNewFile();
            //创建文件输出流,输出数据将追加在文件中原有数据后面
            fw=new FileWriter(file,true);
            //把内容写入文件,并换行
            fw.write("Hello Beijing!\r\n");
            //清空缓存,把内容写入文件
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fw!=null){
                try {
                    //关闭输出流
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
           
Java Api之IO流输入与输出

在windows系统中“\r\n”表示换行

在Linux系统中“\n”表示换行

在ios系统中“\r”表示换行

FilterWriter的writer方法还有其他写入功能:

writer(Char[ ] chuf) 写入字符数组
writer(Char[ ] chuf,int offset,int length) 写入字符数组的某一部分
writer(int i) 写入单个字符(int转换为ASCII)
writer(String str) 写入字符串
writer(String [ ] str,int offset,int length) 写入字符串的某一一部分

其他相关方法清查与API

(2)字符输入流FileReader

FileReader的构造方法:

FileReader(File file) 在给定从中读取数据的File的情况下传建一个新的FileReader
FileReader(String fileName) 在给定从中读取数据的File文件名的情况下传建一个新的FileReader

举例:使用字符流从一个文件读取数据!

  步骤:

1) 创建输入流对象;

2) 把输出流对象指向文件;

3) 读取数据;

4) 关闭输入流。

package com.file;

import java.io.*;

public class FileIO {
    public static void main(String[] args) {
        //创建FileReader对象
        FileReader fr=null;
        try {
            //把输入流指向需要读取的文件
            fr=new FileReader("D:/test/newFile.txt");
            //创建字符数组
            char[] chars=new char[1024];
            int num=-1;
            //读取数据,如果读取完毕,则num将返回-1
            while ((num=fr.read(chars))!=-1){
                //将字符数组中数据转换为字符串并输出到控制台
                String str=new String(chars,0,num);
                System.out.println(str);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fr!=null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
           
Java Api之IO流输入与输出

  (3)字符输入流之BufferedReade

       BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine,读取一个文本行,从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。

BufferedReader提供了readLine()方法来读取一行数据

package com.file;

import java.io.*;

public class FileIO {
    public static void main(String[] args) {
        //创建FileReader对象
        FileReader fr=null;
        //BufferedReader
        BufferedReader br=null;
        try {
            //把输入流指向需要读取的文件
            fr=new FileReader("D:/test/newFile.txt");
            //用BufferedReader包装FileReader
            br=new BufferedReader(fr);
            //创建字符串
            String str=null;
            //读取数据,如果读取完毕,则str将返回null
            while ((str=br.readLine())!=null){
                //将字符串输出到控制台
                System.out.println(str);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fr!=null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
           
Java Api之IO流输入与输出

(4)字符输入流之BufferedWriter

       将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。 该类提供了 newLine() 方法,它使用平台自己的行分隔符概念。

package com.file;

import java.io.*;

public class FileCreate {
    public static void main(String[] args) {
        //创建file对象
        File file=null;
        FileWriter fw=null;
        BufferedWriter bw=null;
        try {
            //创建文件
            file=new File("D:/test/newFile.txt");
            if (!file.exists()){
                file.createNewFile();
            }
            //创建文件输出流,输出数据将追加在文件中原有数据后面
            fw=new FileWriter(file,true);
            //用BufferedWriter包装FileWriter
            bw=new BufferedWriter(fw);
            //把内容写入文件,并换行
            bw.write("Hello Xian!");
            bw.newLine();
            bw.write("Hello madi");
            //清空缓存,把内容写入文件
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fw!=null){
                try {
                    //关闭输出流
                    bw.close();
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
           
Java Api之IO流输入与输出

3、字节流

(1)字节输出流OutputStream

       OutputStream是整个IO包中字节输出流的最大父类,此类是一个抽象类,如果想要使用此类的话,则首先必须通过子类实例化对象,那么如果现在要操作的是一个文件,则可以使用:FileOutputStream类。通过向上转型之后,可以为OutputStream实例化。具体事例如下:

package com.file;

import java.io.*;

public class OutputStreamDemo {
    public static void main(String[] args) {
        //创建文件对象
        File file = new File("D:/test/newFile2.txt");
        //声明输出流
        OutputStream os=null;
        try {
            //将输出流指向文件对象
            os=new FileOutputStream(file);
            String str="Hello World";
            byte[] bytes=str.getBytes();
            //向指定文件输出数据
            os.write(bytes);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(os!=null){
                try {
                    //关闭输出流
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }}}
           
Java Api之IO流输入与输出

(2)字节输入流InputStream

      既然程序可以向文件中写入内容,则就可以通过InputStream从文件中把内容读取进来,

     与OutputStream类一样,InputStream本身也是一个抽象类,必须依靠其子类,如果现在是从文件中读取,就用FileInputStream来实现。具体事例如下:

package com.file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class InputStreamDemo {
    public static void main(String[] args) {
        //构造一个文件输入流对象
        InputStream is=null;
        try {
            //将输入流对象指向文件
            is=new FileInputStream("D:/test/newFile2.txt");
            byte[] bytes=new byte[1024];
            //temp用来存储读入的字节长度
            int temp;
            //循环读取数据
            while ((temp=is.read(bytes))!=-1){
                String str=new String(bytes,0,temp);
                System.out.print(str);
            }
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (is!=null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
    }
    }
           
Java Api之IO流输入与输出

(3)字节输入流之InputStreamReader

        InputStreamReader将字节流转换为字符流。是字节流通向字符流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码。

    构造方法:

构造一个默认编码集的InputStreamReader类 InputStreamReader isr = new InputStreamReader(InputStream in);
构造一个指定编码集的InputStreamReader类 InputStreamReader isr = new InputStreamReader(InputStream in,String charsetName);
package com.file;

import java.io.*;

public class InputStreamDemo {
    public static void main(String[] args) {
        //构造一个文件输入流对象
        InputStream is=null;
        InputStreamReader isr=null;
        try {
            //将输入流对象指向文件
            is=new FileInputStream("D:/test/newFile2.txt");
            //用InputStreamReader包装FileInputStream
            isr=new InputStreamReader(is);
            char[] chars=new char[1024];
            //temp用来存储读入的字节长度
            int temp;
            //循环读取数据
            while ((temp = isr.read(chars))!= -1){
                String str=new String(chars,0,temp);
                System.out.print(str);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (isr!=null){
                try {
                    isr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is!=null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
    }
           
Java Api之IO流输入与输出

(4)字节输出流之OutputStreamWriter

       OutputStreamWriter将字节流转换为字符流。是字节流通向字符流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码。

    构造方法:

构造一个默认编码集的OutputStreamWriter类 OutputStreamWriter osw = new OutputStreamWriter(OutputStream out);
构造一个指定编码集的OutputStreamWriter类 OutputStreamWriter osw = new OutputStreamWriter(OutputStream out,String charsetName);
package com.file;

import java.io.*;

public class OutputStreamDemo {
    public static void main(String[] args) {
        //创建文件对象
        File file = new File("D:/test/newFile2.txt");
        //声明输出流
        OutputStream os=null;
        //声明OutputStreamWriter对象
        OutputStreamWriter osw=null;
        try {
            //将输出流指向文件对象
            os=new FileOutputStream(file,true);
            //用OutputStreamWriter包装OutputStream
            osw=new OutputStreamWriter(os);
            String str="\r\nHello China!";
            //向指定文件输出数据
            osw.write(str);
            osw.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (osw!=null){
                try {
                    osw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(os!=null){
                try {
                    //关闭输出流
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }
}
           
Java Api之IO流输入与输出

继续阅读