Java IO(续)


3、字符流

3.1、字符流出现的原因

由于字节流操作中文不是特别方便,所以java就提供了字符流

  • 字符流=字符流+编码表

用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最底层操作会自动进行字节拼接成中文,如何是被是中文。

  • 汉字在存储的时候,无论选择那种编码存储,第一个字节都是负数

3.1、字符流写数据的五种方式

  • void write(int c)
    写一个字符
  • void write(char[] cbuf)
    写入一个字符数组
  • void write(char[] cbrf,int off,int len)
    写入字符数组的一部分
  • void write(String str)
    写一个字符串
  • void write(String str,int off,int len)
    写一个字符串的一部分

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class OutputStreamWriterDemo {
    public static void main(String[] args) throws IOException {
        //创建一个使用默认字符编码的OutputStreamWriter
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\JavaProject\\czxJava\\fos.txt"));


        //void write (int c):写一个字符
//        osw.write(91);
//        //void flush():刷新流
//        osw.flush();
//        osw.write(92);
//        osw.flush();
//        osw.write(93);

//        char[] ch = {'a','b','c','d'};
//        osw.write(ch,0,2);

        String str = "hello,you are ...";
        osw.write(str,0,str.length());
        //释放资源
        osw.close();
    }
}

3.2、字符流读数据的俩种方式

  • int read() 一次读一个字符数据
  • int read(char[] cbuf) 一次读一个字符数组数据
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class InputStreamReaderDemo  {
    public static void main(String[] args) throws IOException {
        //InputStreamReader(InputStream in),创建一个使用默认字符集的InputStreamReader
        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\JavaProject\\czxJava\\fos.txt"));

        //int read()  一次读取一个字符数据
//        int ch;
//        while ((ch=isr.read())!=-1){
//            System.out.print((char)ch);
//        }

        //int read(char[] cbuf)  一次读取一个字符数组数据
        char[] ch = new char[1024];
        int len;
        while ((len=isr.read(ch))!=-1){
            System.out.println(new String(ch,0,len));
        }

        //释放资源
        isr.close();
    }
}

3.2.1、案例1:复制Java

import java.io.*;

public class CopyDemo1 {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\JavaProject\\czxJava\\copy.java"));
        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\JavaProject\\czxJava\\src\\JavaIO\\ConversionStreamDemo.java"));

        //一次读写一个字符数据
//        int len;
//        while ((len = isr.read())!=-1){
//            osw.write(len);
//        }

        //一次读取一个字符数组
        char[] ch = new char[1024];
        int len;
        while ((len = isr.read(ch))!=-1){
            osw.write(ch,0,len);
        }
        osw.close();
        isr.close();
    }
}

升级版


import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("D:\\JavaProject\\czxJava\\src\\JavaIO\\ConversionStreamDemo.java");
        FileWriter fw = new FileWriter("D:\\JavaProject\\czxJava\\copy.java");

        int ch;
        while ((ch=fr.read())!=-1){
            fw.write(ch);
        }

        fr.close();
        fw.close();
    }
}

3.3、字符缓冲流

3.3.1、字符缓冲流

  • BufferedWiter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者接受默认大小。默认值足够大,可用于大多数用途。
  • BufferedReader:从字符输入流读取文本,缓冲字符,以提供单个字符,数组和字符串的高效读取,可以指定缓冲区的大小,或者使用默认大小。默认值足够大,可用于大多数用途。

import java.io.*;

public class BufferStreamDemo {
    public static void main(String[] args) throws IOException {
        /*
        FileOutputStream fos = new FileOutputStream("D:\\JavaProject\\czxJava\\fos.txt");
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        //写数据
        bos.write("hello,you are so stupid\r\n".getBytes());
        bos.write("i'm serious\r\n".getBytes());

        bos.close();
        */

        FileInputStream fis = new FileInputStream("D:\\JavaProject\\czxJava\\fos.txt");
        BufferedInputStream bis = new BufferedInputStream(fis);

//        int data;
//       while ((data = bis.read()) != -1){
//           System.out.print((char)data);
//       }

        //一次读取一个字节数组
        byte[] bys = new byte[1024];
        int len;
        while((len= bis.read(bys))!=-1){
            System.out.println(new String(bys,0,len));
        }
        System.out.println();
        bis.close();
    }
}

3.3.2、案例:复制java文件

import java.io.*;

public class CopyJava {
    public static void main(String[] args) throws IOException {
        //根据数据源创建字符缓冲流对象
        BufferedReader br = new BufferedReader(new FileReader("D:\\JavaProject\\czxJava\\src\\JavaIO\\StringDemo.java"));

        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\JavaProject\\czxJava\\copy.java"));

        char[] ch = new char[1024];
        int len;
        while ((len=br.read(ch)) != -1){
            bw.write(ch);
        }

        //关闭资源
        bw.close();
        br.close();
    }
}

3.3.3、字符缓冲流特有功能

  • Bufferedwriter:void newLin() 写一行行分隔符,行分隔符字符串有系统属性定义
  • BufferedReader:String readLine() 读一行文字,结果包含行的内容的字符串,不包含任何行终止字符,如果流的结尾已经到达,则返回null。
import java.io.*;


public class BufferedStreamDemo1 {
    public static void main(String[] args) throws IOException {
//        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\JavaProject\\czxJava\\bw.txt"));
//
//        bw.write("hello,dhp");
//
//        bw.close();

        BufferedReader br = new BufferedReader(new FileReader("D:\\JavaProject\\czxJava\\bw.txt"));

        /*
         String line = br.readLine();
        System.out.println(line);

        line = br.readLine();
        System.out.println(line);

        line = br.readLine();
        System.out.println(line);

        line = br.readLine();
        System.out.println(line);
        */
        String line;
        while ((line=br.readLine()) != null){
            System.out.println( line);
        }
        br.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值