字符流InputStreamReader和OutputStreamWriter是Writer和Read的子类;是字节流通向字符流的桥梁,也就是可以把字节流转化为字符流。
InputStreamReader 构造方法:
-
InputStreamReader(Inputstream in)
创建一个使用默认字符集的 InputStreamReader。 -
InputStreamReader(Inputstream in,Charset cs)
创建使用给定字符集的 InputStreamReader。
-
InputStreamReader(InputStream in, CharsetDecoder dec)
创建使用给定字符集解码器的 InputStreamReader。
-
InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader。
例如:
FileInputStream s;//文件字节流;try {s = new FileInputStream(path);//根据路径创建一个对象InputStreamReader is=new InputStreamReader(s);//根据文件流创建字符流对象;} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}
OutputStreamWriter的构造方法
-
OutputStreamWriter(OutputStream out)
创建使用默认字符编码的 OutputStreamWriter -
OutputStreamWriter(OutputStream out, String charsetName)
创建使用指定字符集的 OutputStreamWriter。 -
OutputStreamWriter(OutputStream out, Charset cs)
创建使用给定字符集的 OutputStreamWriter。 -
OutputStreamWriter(OutputStream out, CharsetEncoder enc)
创建使用给定字符集编码器的 OutputStreamWriter。
例如:
InputStreamReader isr; try { isr = new InputStreamReader(client.getInputStream()); //client为Server对象; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
无论是InputStreamReader,还是OutputStreamWriter,我们都需要通过在实例化对象的时候我们给定一个(Inputstream或是Outputstream对象,这个过程也就是把字节流转化为字符流;
而我们之所以要用到字符流,是因为用字符流处理中文比较方便;字节流处理8位数据,而字符流则是用于处理16位数据;但是每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。也就是要实现一次从字节流转化为字符流的过程;
在实际使用中,为了提高效率,我们一般用,BufferedReader和BufferedWrite来处理:
BufferedReader:缓冲字符流:
BufferedReader处理字符流是比较方便的,它可以处理一行数据;直接从文件中读取一行字符串;
BufferedReader一共有两个构造方法:
一、创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader o=new BufferedReader(reader);
传入一个Read类(用于读取字符流的抽象类)的对象;
二、创建一个使用指定大小输入缓冲区的缓冲字符输入流。
BufferedReader i=new BufferedReader(reader, sz);
传入一个Read类(用于读取字符流的抽象类)的对象;并且传入一个int型,指定输入缓冲区的大小 ,,没有指定的话是使用默认的大小。大多数情况下,默认值就足够大了。
BufferedReader
我们用第一个实例化的参数来创建一个BufferedReader类的对象:
BufferedReader in= new BufferedReader(new InputStreamReader(System.in));
在JAVA的Server和ServerSocket中我们也用到了BuffererReader的readLine()方法来读取一个行数据:
InputStreamReader isr; try { isr = new InputStreamReader(client.getInputStream()); BufferedReader buf = new BufferedReader(isr); while (isStop) { String str = buf.readLine(); //读取一行 // 如果对到的数据为NUll,则跳出循环 if (str == null) break; System.out.println(str); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
BufferedWriter
构造方法:
BufferedWriter(Writer out)
创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz)
创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
实例:
OutputStreamWriter osw; try { osw = new OutputStreamWriter(client.getOutputStream()); BufferedWriter bufw = new BufferedWriter(osw); bufw.write("欢迎连接服务器"); bufw.flush();// 冲洗刷新; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
注意的是,OutputStreamWriter需要调用flush()方法进行刷新缓冲流,在关闭的时候也要调用该方法。