码迷,mamicode.com
首页 > 其他好文 > 详细

字符流与字节流(IO)

时间:2015-06-19 11:54:20      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:java   字节流   字符流   

字符流与字节流

一、常用字符流:

写:

FileWriter:用于新建一个写入字符的文件

BufferedWriter:将文本写入字符输出流

例:BufferedWriter   s=new BufferedWriter(new  FileWriter(“abc.txt”));

 

读:

  FileReader:用于新建一个读取字符的文件

BufferedReader:将输入流中读取文本

例:BufferedReader   s=new BufferedReader(new  FileReader(“abc.txt”));

 

 

二、常用字节流:

 

          写:

FileOutputStream:用于创建文件输出流,用于将数据写入

  BufferedOutputStream:该类实现缓冲的输出流。

读:

FileInputStream:从文件系统中的某个文件中获得输入字节

BufferedInputStream:该类实现缓冲的输入流。

例:

BufferedInputStream  s=newBufferedInputStream(new  FileInputStream(“abc.txt”));

 

三、转换流:

       OutputStreamWriter:是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

        InputStreamReader:是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

键盘录入:

BufferedReader bufr = new BufferedReader(newInputStreamReader(System.in));

输出到控制台:

BufferedWriter bufw = new BufferedWriter(newOutputStreamWriter(System.out));String line = null;

//通过while的循环,不断将数据通过键盘录入,将转换成大写字母输出到控制台上,当

录入为over时,将结束循环。

while((line=bufr.readLine())!=null){

    if("over".equals(line))

        break;

    bufw.write(line.toUpperCase());//将输入的字符转成大写字符输出

    bufw.newLine();

    bufw.flush();

    }

bufw.close();

bufr.close();

 

转换流 = 字节流+编码表。

转换流的子类File = 字节流 + 默认编码表。

FileReader fr = newFileReader("a.txt");

InputStreamReader isr = newInputStreamReader(new FileInputStream("a.txt"),"gbk");

 

 

四、其他流:

ByteArrayInputStream :在构造的时候,需要接收数据源,。而且数据源是一个字节数组。

ByteArrayOutputStream: 在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。

因为这两个流对象都操作的数组,并没有使用系统资源。

所以,不用进行close关闭。

例:

import java.io.*;

class ByteArrayStream

{

    public static void main(String[] args)

    {

       //数据源。

ByteArrayInputStream bis = newByteArrayInputStream("哈哈是计算机".getBytes());

       //数据目的

       ByteArrayOutputStream bos = new ByteArrayOutputStream();

       int len = 0;

      //从bis读取到的数据写到bos里面

       while((len=bis.read())!=-1)

       {

           bos.write(len);

       }

 

       System.out.println(bos.size());

       System.out.println(bos.toString());

    }

}

 

 

 

管道流:java管道流的读写操作用于两个线程之间  
PipedOutputStream
、PipedInputStream 连接起来就是一个管道   
管道输出流可以向管道写入数据,管道输入流可以从管道读取数据,
这种Decorator装饰 的设计模式 大大增强了java流的功能
可以在构造流的时候连接 管道输入输出流 也可以通过connect函数连接

PipedOutputStream

PipedInputStream

 

例:

package IO21;

 

 

import java.io.*;

 

class Read implements Runnable

{

    private PipedInputStream in;

    Read(PipedInputStream in)

    {

       this.in = in;

    }

    public void run()

    {

       try

       {

           byte[] buf = new byte[1024];

 

           System.out.println("读取前。。没有数据阻塞");

           int len = in.read(buf);

           System.out.println("读到数据。。阻塞结束");

 

 

 

           String s= new String(buf,0,len);

 

           System.out.println(s);

 

           in.close();

 

       }

       catch (IOException e)

       {

           throw new RuntimeException("管道读取流失败");

       }

    }

}

//实现Runnable接口

class Write implements Runnable

{

//覆盖构造方法,传管道输出流对象

    private PipedOutputStream out;

    Write(PipedOutputStream out)

    {

       this.out = out;

    }

//复写run方法

    public void run()

    {

       try

       {

           System.out.println("开始写入数据,等待6秒后。");

           Thread.sleep(6000);

           out.write("piped laila".getBytes());

           out.close();

       }

       catch (Exception e)

       {

           throw new RuntimeException("管道输出流失败");

       }

    }

}

 

class  PipedStreamDemo

{

    public static void main(String[] args) throws IOException

    {

       //创建管道输出流对象,用于数据的写入

       PipedInputStream in = new PipedInputStream();

//创建管道输入流对象,用于读取文本数据

       PipedOutputStream out = new PipedOutputStream();

       in.connect(out);//将管道输出流与输入流的连接,实现数据读写

//创建对象,开启线程

       Read r = new Read(in);

       Write w = new Write(out);

       new Thread(r).start();

       new Thread(w).start();

 

 

    }

}

 

 

 

打印流:该流提供了打印的方法,可以将各种数据类型的数据都原样打印。

a:提供了更多的功能,比如打印方法。可以直接打印任意类型的数据。

b:它有一个自动刷新机制,创建该对象,指定参数,对于指定方法可以自动刷新。

c:它使用的本机默认的字符编码.

d:该流的print方法不抛出IOException。

 

字节打印流(PrintStream):

A、file对象:File

B、字符串路径:String

C、字节输出流:OutputStream

 

字符打印流(PrintWriter):

A、file对象:File

B、字符串路径:String

C、字节输出流:OutputStream

D、字符输出流:Writer

例:

  package I020;

 

 

/*

打印流:

该流提供了打印方法,可以将各种数据类型的数据都原样打印。

 

字节打印流:

PrintStream

构造函数可以接收的参数类型:

1file对象。File

2,字符串路径。String

3,字节输出流。OutputStream

 

 

 

字符打印流:

PrintWriter

构造函数可以接收的参数类型:

1file对象。File

2,字符串路径。String

3,字节输出流。OutputStream

4,字符输出流,Writer

 

 

*/

 

import java.io.*;

 

class  PrintStreamDemo

{

    public static void main(String[] args) throws IOException

    {

//键盘录入

       BufferedReader bufr =

           new BufferedReader(new InputStreamReader(System.in));

     //将数据处理到a.txt文件中,并刷新

       PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true);

       

       String line = null;

     //将键盘录入的数据转化成大写,并实时写入a.txt文件中,遇到over时,结束键盘录入

       while((line=bufr.readLine())!=null)

       {

           if("over".equals(line))

              break;

           out.println(line.toUpperCase());

           

       }

 

       out.close();

       bufr.close();

 

    }  

}

 

字符流与字节流(IO)

标签:java   字节流   字符流   

原文地址:http://blog.csdn.net/liuchuangjin/article/details/46559193

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!