初学者说i/o流

来源:互联网 发布:英语单词发音软件下载 编辑:程序博客网 时间:2024/06/09 05:23

今天用一上午的时间看了java流的一些基本知识点。因为在java中流的使用非常高。现在我就输入和输出流谈谈自己对流的认识。

       Java的输入输出流来源于stream(数据流)。其中流分字节流和字符流。而字节和字符流都有输出个输入和输出流。他们分别是这四个接口。

       InputStream(字节输入) outputStream(字节输出) reader(字符输入)  writer(字符输出)其中四个接口可以派生出不同功能的类。其中输出流有write()方法的三种重载。输入流有read()的三种重载。

一般就介绍几个常用的几个输入输出类:

Fileinputstream   bufferedinputstream  fileoutstream bufferedoutputstream

fileReader  bufferedreader    filewriter   bufferedwriter

其中buffered的是一种缓冲流,是对流的封装,使用buffered可以提高输出输入的效率。

现在我想用输入和输出流的列子来更好的说明。

 

 

//利用字节流向一个文件写数据

File file = new File("d:\\fish.txt");

        file.createNewFile();//先创建一个文件

    OutputStream outputStream = new FileOutputStream(file);//创建一个输出流

        String s = "我叫飞鱼";//写入数据

outputStream.write(s.getBytes());//将数据写入留中

        outputStream.close();//关闭流

 

 

介绍一个提高效率的写法

Filefile = new File("d:\\fish.txt");

        file.createNewFile();

        OutputStream outputStream = new FileOutputStream(file);

        BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(outputStream);

        String s = "我叫飞鱼";

 

        bufferedOutputStream.write(s.getBytes());

        bufferedOutputStream.close();

两个实现的功能是一样的。但是BufferedOutputStream是一种缓冲技术流。可以将数据创建于缓冲数组中。这样可以提高效率。下面关于输入输出流我都将用包装bufferedstream方法来封装实现。

 

//对一个文件的内容进行读取到控制台

InputStreaminputStream=new FileInputStream(new File("d:\\fish.txt"));

         BufferedInputStream bufferedInputStream=new BufferedInputStream(inputStream);

        byte b= (byte)bufferedInputStream.read();

        while(b!=-1){

        System.out.print((char)b);

        b=(byte) bufferedInputStream.read();

        }

bufferedInputStream.close();   

对于这个你一定会出现一个问题那就是汉字会出现乱码。因为汉字占两个字节,而每次只是输出一个字节即半个汉字,自然出乱码。

//所以下面介绍一种利用字符流进行对文件的读取。

  BufferedReader bufferedReader =new BufferedReader(new FileReader(new File("d:\\fish.txt")));

     String s= bufferedReader.readLine();

     while(s!=null){

     System.out.println(s);

     s=bufferedReader.readLine();

     }

    bufferedReader.close();

 

现在的代码是不是简练多了。对于java的输入输出流本身就是采用了一种装饰者的设计模式。所以第一句这样写就简练多了。

而字符流读取每次是读取一行。所以是readline();当然你不闲麻烦也可以read()的。

/

/利用字符流对文件进行写内容

BufferedWriterbufferedWriter =new BufferedWriter(new FileWriter(new File("d:\\fish.txt")));

    String s="我是飞鱼";  

    bufferedWriter.write(s);

bufferedWriter.close();

 

 

通过这些例子我感觉我觉得已经说的比较清楚了,当然需要一点对java基础知识的人看。

 

//现在我感觉大概差不多,就做一个从一个文件复制到另个文件的练习。我就用字符流做吧。

public static void main(String[] args) throwsException {

        BufferedReader bufferedReader = new BufferedReader(new FileReader(

                new File("d:\\fish.txt")));

        String s = bufferedReader.readLine();

        File file = new File("d:\\fishcopy.txt");

        file.createNewFile();// 建立一个文件用来存放文件内容

        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));

        while (s != null) {

            bufferedWriter.write(s + "\n");

            s = bufferedReader.readLine();

 

        }

        bufferedReader.close();

        bufferedWriter.close();

 

}

 

 

//上述例子都可在eclispe下调通。但是都抛出异常。

 

说了那么多,给该说说字符流和字节流的区别了。

我想说一句话就是字节流比字符流要好。但是字符流读取方便,可以写到缓冲区效率高。

但是字节流应用广,像视频图片音频都是用字节流的。所以用字节流不会失真。

 

还有使用流以后记得要关闭流。