杰神之Java字符流和转换流的使用

原创 2018年01月31日 22:01:07

字符流

在程序中一个字符根据不同编码等于不同个字节,那么java提供了Reader、Writer两个专门操作字符流的类。
·字符输出流:Writer
·字符输入流:Reader

字符输出流:Writer

此类本身也是一个抽象类,如果要想使用此类,则肯定要使用其子类,此时如果是向文件中写入内容,所以应该使用FileWriter子类,这个类只能用来操作文本(不能写图片 音频 视频)。Writer类的常用方法:

    方法或常量   描述  
    public abstract void close() throws IOException 关闭输出流  
    public void write(String str) throws IOException    将字符串输出  
    public void write(char[] cbuf) throws IOException   将字符数组输出  
    public abstract void flush() throws IOException 强制性清空缓存  

示例代码:(字符流可以直接输出字符串,不需要转换为字节)

public class Demo04 {
    public static void main(String[] args) throws IOException {
        FileWriter fw=new FileWriter("/Users/lanou/Desktop/haha/h.txt");
        fw.write(100);
        //注意字符输出流 在写入文件的时候
        //需要调用刷新方法
        //建议:每次写入 最好都刷新一次
        fw.flush();
        //字符数组写入
        char[] c= {'d','a','c','b'};
        fw.write(c);
        fw.flush();
        fw.write(c, 1, 3);
        fw.flush();

        //使用字符串直接写入
        fw.write("hello\n");
        fw.flush();

        //使用字符串偏移量写入
        fw.write("hello", 1, 2);
        fw.close();

    }
}

此时如果是想追加内容,与FileInputStream的格式是一样的,添加appemd属性为true;

字符输入流:Reader

此类本身也是一个抽象类,如果要想使用此类,则肯定要使用其子类,此时如果是向文件中写入内容,所以应该使用FileReader子类.Writer类的常用方法:

    方法或常量   描述  
    public abstract void close() throws IOException 关闭输出流  
    public int read() throws IOException    读取单个字符  
    public int read(char[] cbuf) throws IOException 将内容读到字符串数组中,返回读入的长度  

示例代码:(以字符数组的形式读取出数据)

public class Demo05 {
    public static void main(String[] args) throws IOException{
        FileReader fr =new FileReader("/Users/lanou/Desktop/haha/h.txt");
        //循环读取(两种)
        int read=0;
        while ((read=fr.read())!=-1) {
            System.out.println((char)read);
        }
        char[] c =new char[1024];
        while ((read = fr.read(c))!=-1) {
            System.out.println(new String(c, 0, read));
        }

        fr.close();
    }
}

利用字符流 复制文件(带异常处理):

    public static void main(String[] args) {
        //读
        FileReader fd = null;
        // 写
        FileWriter fw = null;
        try {
            fd = new FileReader("/Users/lanou/Desktop/haha/www1.txt");
            fw = new FileWriter("/Users/lanou/Desktop/haha/www.txt");
            //一个一个读写
            int len = 0;
            while ((len = fd.read()) != -1) {
                fw.write(len);
                fw.flush();
            }
        } catch (FileNotFoundException e) {
            // TODO: handle exception
            throw new RuntimeException("文件没找到");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            throw new RuntimeException("文件复制失败         ");
        } finally {
            try {
                if (fd != null) {
                    fd.close();
                }
                //两个流不能一起关,万一第一个抛出异常
                //程序停止运行,第二个流会无法关闭的
            } catch (IOException e) {
                // TODO Auto-generated catch block
                throw new RuntimeException("关闭资源失败");
            }finally {
                try {
                    if (fw != null) {
                        fw.close();
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

字节-字符转换流

OutputStreamWriter和InputStreamReader
在整个IO包中,实际上就是字节流和字符流,但是除了这两个流之外,还存在一组字节流-字符流的转换类。

OutputStreamWriter:是Writer的子类,将输出的字符流转换为字节流。即:将一个字节流的输出对象变为字节流的输出对象  
InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象。 

将字节的文件输出流,以字符的形式输出:

public class OutputStreamWriterDemo01  
{  
    public static void main(String args[]) throws Exception{    //所有异常抛出  
        File file=new File("/Users/lanou/Desktop/haha/www1.txt");  
        Writer writer=null;     //字符输出流  
        writer=new OutputStreamWriter(new FileOutputStream(file));  //字节流变为字符流  
        String str="hello world!!!!";     
        writer.write(str);  //使用字符流输出  
        writer.close();  
    }  
}  

读的时候,也可以使用字符流的形式读取字节流的文件。

public class InputStreamReaderDemo01{  
    public static void main(String args[]) throws Exception{  
        File f = new File("/Users/lanou/Desktop/haha/www.txt") ;   
        Reader reader = null ;  
        reader = new InputStreamReader(new FileInputStream(f)) ;    // 将字节流变为字符流  
        char c[] = new char[1024] ;  
        int len = reader.read(c) ;  // 读取  
        reader.close() ;    // 关闭  
        System.out.println(new String(c,0,len)) ;  
    }  
};  

对于FileWriter和FileReader的说明:
从JDK文档中可知FileOutputStream是OutputStream的直接子类,FileInputStream也是InputStream的直接子类,但是在字符流文件的两个操作类却有一些特殊,FileWriter并不是Writer的子类,而是OutputStream的子类,而FileReader也不是Reader的直接子类,是InputStreamReader的子类。

版权声明:本文为博主原创文章,未经博主允许不得转载。

黑马程序员——Java基础---IO流(字符流、字节流、转换流、流操作规律)

简述: IO(Input Output) IO流用于处理设备之间的数据传输。(比如硬盘上的文件,内存中驻留的数据)IO流是用于操作数据的,数据的最常见体现形式是:文件。 ...
  • u011965771
  • u011965771
  • 2014年11月24日 21:47
  • 1887

字节流、字符流有何区别、转换流的作用

字节流是基础,字符流是发展 字符流里面融入了编码表,在数据读取和写入的时候对文本文件进行编码 转换流,其实就是讲字节流转换为字符流,转换流在使用的时候,可以做字节数据在读取、或写入的时候进行执行变慢表...
  • geduo_83
  • geduo_83
  • 2014年03月06日 14:38
  • 1107

Java 字节流 字符流 转换流

我们知道Java中的流分为字符流和字节流,其中字符流主要针对字符文本进行处理,而字节流处理范围更为广泛,毕竟图片、电影等只要是文件都是以二进制的形式存在的,而不是字符。 字符流: FileReader...
  • puppylpg
  • puppylpg
  • 2015年05月10日 13:55
  • 5031

Java字符流与字节流转换

Java字符流与字节流转换
  • u013905744
  • u013905744
  • 2016年06月22日 19:25
  • 349

彻底明白java的字节流和字符流(转)

java的IO流分两种流 字节流 InputStream OutputStream 字符流 Reader Writer 他们都是抽象类 具体实现 字节流 FileInputStream FileO...
  • hggliu
  • hggliu
  • 2016年08月22日 20:40
  • 2648

io流学习之字节流与字符流之间的转换

一、 public class TypeToChar { /* * 字节流转换成字符流 *  * 1、字节流转换成字节流的对象,(InputStreamReader(叫做转换流):作...
  • fjx11223344
  • fjx11223344
  • 2016年07月11日 15:12
  • 845

java基础:字节流和字符流的转换

----------android培训、java培训、java学习型技术博客、期待与您交流! ---------- 我们的机器只会读字节码,而我们人却很难读懂字节码,所以人与机器交流过程中需要...
  • zhangjinyu1991
  • zhangjinyu1991
  • 2013年02月20日 16:28
  • 2446

Java中转换流的相关用法

/** 1、字节流与字符流之间的转换,称作转换流 包括:InputStreamReader--->是字节流通向字符流的桥梁、OutputStreamWriter--->是字符流通向字节流的桥梁 ...
  • u011521890
  • u011521890
  • 2015年09月27日 21:33
  • 1459

JAVA——System.in/字符流与字节流

通过键盘录入数据 当录入一行数据后,就将该行数据进行打印 如果录入的数据是over,那么停止录入import java.io.*; class ReadIn { public static...
  • Jungle_hello
  • Jungle_hello
  • 2016年05月29日 16:58
  • 1146

java转换流,io流规律

Java IO流总结之转换流  (2012-10-17 10:37:21) 转载▼ 标签:  java转换流   字符流   字节   杂谈...
  • shaozucheng
  • shaozucheng
  • 2014年06月14日 11:52
  • 884
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:杰神之Java字符流和转换流的使用
举报原因:
原因补充:

(最多只允许输入30个字)