读书人

Java IO中-字节流与字符源

发布时间: 2012-08-30 09:55:54 作者: rapoo

Java IO中---字节流与字符流

?

publicabstract class InputStream extends Object implements Closeable

publicabstract class OutputStream extends Object implements Closeable, Flushable????

publicabstract class Reader extends Object implements Readable, Closeable

publicabstract class Writer extends Object implements Appendable, Closeable,Flushable

package com.iflytek.io02;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;/** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */public class OutputStreamDemo01 {public static void main(String[] args) throws Exception {File file = new File("d:" + File.separator + "demo.txt");// 要操作的文件OutputStream out = null;// 声明字节输出流// out = new FileOutputStream(file);// 通过子类实例化out = new FileOutputStream(file, true);// 表示可以追加jString str = "王旭东\r\n";// 要输出的信息byte b[] = str.getBytes();// 将String变为byte数组out.write(b);// 写入数据// for (int i = 0; i < b.length; i++) {// out.write(b[i]);// }// 通过循环一个个写入out.close();}}?

?

package com.iflytek.io02;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;/** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */public class InputStreamDemo01 {public static void main(String args[]) throws Exception {File file = new File("d:" + File.separator + "demo.txt");// 要操作的文件InputStream input = null;// 声明字节输入流input = new FileInputStream(file);// 通过子类进行实例化操作byte b[] = new byte[1024];// 开辟空间存储读取的内容int len = input.read(b);// 将内容读取到byte数组中System.out.println(new String(b, 0, len));// 输出内容input.close();}}?

package com.iflytek.io02;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;/** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */public class InputStreamDemo02 {public static void main(String args[]) throws Exception {File file = new File("d:" + File.separator + "demo.txt");InputStream input = new FileInputStream(file);byte b[] = new byte[(int) file.length()];// 开辟空间接收读取的内容for (int i = 0; i < b.length; i++) {b[i] = (byte) input.read();// 一个个的读取数据}System.out.println(new String(b));// 输入内容,直接转换input.close();// 关闭}}

?

范例:Writer

package com.iflytek.io02;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;/** * @author xudongwang  2012-1-8 * *  Email:xdwangiflytek@gmail.com */public class WriterDemo {public static void main(String args[]) throws IOException {File file = new File("d:" + File.separator + "demo.txt");Writer out = null;// 声明字符输出流//out = new FileWriter(file);// 通过子类实例化out = new FileWriter(file,true);//表示可以追加String str = "王旭东\r\n";// 要输出的信息out.write(str);// 写入数据out.close();}}

?

?范例:Reader

package com.iflytek.io02;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.io.Reader;/** * @author xudongwang 2012-1-8 *  *         Email:xdwangiflytek@gmail.com */public class ReaderDemo {public static void main(String args[]) throws IOException {File file = new File("d:" + File.separator + "demo.txt");Reader input = null;input = new FileReader(file);char c[] = new char[1024];int len = input.read(c);System.out.println(new String(c, 0, len));input.close();}}

?

package com.iflytek.io02;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.io.Reader;/** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */public class ReaderDemo02 {public static void main(String args[]) throws IOException {File file = new File("d:" + File.separator + "demo.txt");Reader input = null;input = new FileReader(file);char c[] = new char[(int) file.length()];for (int i = 0; i < c.length; i++) {c[i] = (char) input.read();// 一个个读取}System.out.println(new String(c));input.close();}}

?下面我们来通过一组实例来观察字节流与字符流的区别:此程序就是向文件中保存内容

?

package com.iflytek.io02;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;/** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */public class OutputStreamDemo {public static void main(String args[]) throws IOException {File file = new File("d:" + File.separator + "demo.txt");OutputStream out = new FileOutputStream(file);String str = "java";byte b[] = str.getBytes();out.write(b);}}

?注意:以上的操作并没有进行关闭操作,发现内容却可以正常的输出;

?

package com.iflytek.io02;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;/** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */public class WriterDemo02 {public static void main(String args[]) throws IOException{File file = new File("d:" + File.separator + "demo.txt");Writer out = new FileWriter(file);String str = "java";out.write(str);}}

?此时,字符流中也没有进行流的关闭操作,但与字节流不同的是,字符流并没有将内容成功的写入进去。如果此时在字符流操作的最后加入out.flush()操作,则可以成功的写入;

字节流在操作的时候是直接与文件本身进行关联的,不使用缓冲区

package com.iflytek.io02;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;/** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */public class ByteArrayInputStreamDemo {public static void main(String args[]) {String str = "hello world!";ByteArrayInputStream bis = null;// 内存输入流,从程序向内存写入ByteArrayOutputStream bos = null;// 内存输出流bis = new ByteArrayInputStream(str.getBytes());// 将内存保存在内存中bos = new ByteArrayOutputStream();int temp = 0;while ((temp = bis.read()) != -1) {// 依次读取char c = (char) temp;bos.write(Character.toUpperCase(c));// 输出}String newStr = bos.toString();// 取出内存输出的内容System.out.println(newStr);}}

?注意,虽然内存流在J2EE阶段没什么感觉,但是在Java WEB中的Ajax技术中会结合XML解析和JavaScript、Ajax完成一些动态效果;

package com.iflytek.io02;import java.io.File;import java.io.FileOutputStream;import java.io.PrintStream;/** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */public class PrintStreamDemo {public static void main(String args[]) throws Exception {File file = new File("d:" + File.separator + "demo.txt");PrintStream ps = new PrintStream(new FileOutputStream(file));ps.print("hello");ps.print("world");ps.print(10);ps.print(10.0);ps.close();}}

?此处,发现使用打印流输出比较方便,所以建议以后都使用打印流完成输出;

package com.iflytek.io02;import java.io.File;import java.io.FileOutputStream;import java.io.PrintStream;/** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */public class PrintStreamFormatDemo {public static void main(String args[]) throws Exception {File file = new File("d:" + File.separator + "demo.txt");PrintStream out = new PrintStream(new FileOutputStream(file));String name = "王旭东";int age = 21;float score = 99.0f;char sex = 'N';out.printf("姓名:%s;年龄:%d;成绩:%5.2f;性别:%c。",name,age,score,sex);out.close();}}

?这里需要注意,在打印流中始终记住一下原则:

package com.iflytek.io02;/** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */public class SystemerrDemo {public static void main(String args[]) {try {Integer.parseInt("hello");} catch (Exception e) {System.out.println(e);//e打印出来是黑字System.err.println(e);//e打印出来是红字}}}

?其区别只能从概念上讲:

package com.iflytek.io02;import java.io.InputStream;/** * @author xudongwang 2012-1-8 * * Email:xdwangiflytek@gmail.com */public class SystemInDemo {public static void main(String args[]) throws Exception {InputStream input = System.in;System.out.println("请输入内容:");int temp = 0;StringBuilder bud = new StringBuilder();while ((temp = input.read()) != -1) {char c = (char) temp;if (c == '\n') {break;}bud.append(c);}System.out.println("输入的内容是:" + bud);}}

?虽然此时读取时没有长度但此处注意的是每次读取的是字节,所以在输入中文时会出现错误,只能通过后面的BufferedReader来实现;

?

重定向问题:

System.out、System.err都有固定的输出目标,都是屏幕。而System.in有固定的输入目标,都是键盘;但是在System类中提供了一系列的输入输出重定向,可以改变System.out、System.er、System.in的输入输出位置。

?????? System. out重定向:public static void setOut(PrintStream out)

?????? System.err重定向:public static void setErr(PrintStream err)

?????? System.in重定向:public static void setIn(InputStream in)

?

BufferedReader

实际上表示缓冲区读取,可以一次性的将内容全部读取出来

其构造方法:public BufferedReader(Reader in)

?????? 注意:在Java中提供了两个专门的类,去实现字节流与字符流的转换:

????????????? InputStreamReader:将字节的输入流变为字符输入流;

文件字节流(输入流)字符流(输入流)控制台???

????????????? OutputStreamWriter:将字符的输出流变为字节的输出流;

程序字符流(输出流)字节流(输出流)文件??????

通过public String readLine()throws IOException来读取数据,表示一次性读取一行数据,而且这里需要注意的是如果返回的内容是String是最好的操作;

?

读书人网 >编程

热点推荐