IO流基础语法

字符流和字节流

字节流2个基类
- InputStream
- OutputStream

字符流2个基类
- Reader
- Writer

字符流

Writer–>FileWriter

FileWriter fw = null;
try{
    fw = new FileWriter("demo.txt"true);
    //创建新的文件,true表示不覆盖源文件续写,("demo.txt")则覆盖源文件
    fw.writer("asdf");
}
catch(IOException e){
    System.out.println(e.toString());
}
finally{
    try{
        if(fw!=null){   
            fw.close();//关闭资源之前会刷新缓冲中的数据
                    //flush需要时使用,close一定要使用
        }
    }
    catch(IOException e){
        System.out.println(e.toString());
    }
}

Reader–>FileReader

FileReader fr = new FileReader("demo.text");
char[] buf = new char[1024];
int num = 0;
while((num=fr.read(buf)) != -1){
    System.out.print(new String(buf,0,num));  
}
fr.close();

复制文件

FileWriter fw = null;
FileReader fr = null;
try{
    fw = new FileWriter("copy_demo.txt");
    fr = new FileReader("demo.txt");

    char[] buf = new char[1024];
    int len = 0;

    while((len=fr.read(buf)) != -1) {
        fw.write(buf,0,len);
    }
}
catch(IOException e) {
    throw new RuntimeException("读写失败");
}
finally{
    if(fr!=null){
        try{
            fr.close();
        }
        catch(Exception e){

        }
    }
}

字符流的缓冲区

  • BufferedWriter
  • BufferedReader

BufferedWriter

//FileWriter fw = new FileWriter("demo.text");
//BufferedWriter bw = new BufferedWriter(fw);
BufferedWriter bw = new BufferedWriter(new FileWriter("demo.txt"));
bw.writer("xxxx");
bw.newLine();//换行,跨平台
bw.flush();//重要用到缓冲区就要刷新
bw.close;//关闭缓冲区就是在关闭缓冲区中的流对象,不用再关闭fw

BufferedReader

BufferedReader br = new BufferedReader(new FileReader("demo.txt"));
String line = null;
while((line=br.readLine()) != null){
    System.out.println(line);//readLine()不返回终止符
}
br.close();

复制文件

BufferedReader br = null;
BufferedWriter bw = null;
try{
    br = new BufferedReader(new FileReader("demo.txt"));
    bw = new BufferedWriter(new FileWriter("copy_demo.txt"));

    String line = null;

    while((line=br.readLine()) != null){
        bw.write(line);
        bw.newLine();
        bw.flush();
    }
}
catch(Exception e){
    throw new RuntimeException("读写失败");
}
finally{
    try{
        if(bw!=null) bw.close();
    }
    catch(Exception e){
        throw new RuntimeException("关闭失败");
    }
    try{
        if(br!=null) br.close();
    }
    catch(Exception e){
        throw new RuntimeException("关闭失败");
    }
}
LineNunberReader

BufferesReader–>LineNumberReader

LineNUmberReader lnr = new LineNumberReader(new FileReader("demo.txt"));
String line = null;
lnr.setLineNumber(100);
while((line=lnr.readLine()) != null){
    System.out.println(lnr.getLineNumber()+":"+line);
}
lnr.close();

字节流

OutputStream–>FileOutputStream

FileOutputStream fos = new FileOutputStream("img.png");
fos.write("xxxxx".getBytes[]);//已经有数据,不需要flush或close才写入
fos.close();

InputStream–>FileInputStream

FileInputStream fis = new FileInputStream("img.png");
/*
byte[] bytes = new byte[fis.available()];//available可以直接获得读取的长度,但是容易发生内存溢出
fis.read(bytes);
System.out.println(new String(bytes));
fis.close();
*/
byte[] bytes = new byte[1024];
int len = 0;
while((len=fis.read(bytes)) != -1){
    System.out.println(new String(bytes,0,len));
}
fis.close();

复制文件

FileOutputStream fos = null;
FileInputStream fis = null;
try{
    fos = new FileOutputStream("img_copy.png");
    fis = new FileInputStream("img.png");

    byte[] buf = new byte[1024];
    int len =0;

    while((len=fis.read(buf)) != -1){
        fos.write(buf,0,len);
    }
}
catch(Exception e){
    throw new RuntimeException("读写失败");
}
finally{
    try{
        if(fos!=null) fos.close();
    }
    catch(Exception e){
        throw new RuntimeException("关闭失败");
    }
    try{
        if(fis!=null) fis.close();
    }
    catch(Exception e){
        throw new RuntimeException("关闭失败");
    }
}

字节流的缓冲区

  • BufferedOutputStream
  • BufferedInputStream
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
bis = new BufferedOutputStream(new FileOutputStream("demo.txt"));
bos = new BufferesInputStream(new FileInputStream("copy_demo.txt"));
int by = 0;
while((by=bis.read()) != -1){
    bos.write(by);
}
bos.close();
bis.close();
自定义InputStream的缓冲区–>read和write的特点

read方法读取为byte,而返回值类型为int,是为了避免读取到1111-1111返回-1与判断条件冲突的情况

所以将其提升为int,并且通过& 255(& x0ff)的方式保证提升后前3个字节补0

而write方法写入数据时,只写该数据最低8位

class MyBufferedInputStream
{
    private InputStream in;
    private byte[] buf = new byte[1024*4];
    private int pos = 0,count = 0;
    MyBufferedInputStream(InputStream in) {
        this.in = in;
    }
    //一次读一个字节,从缓冲区(字节数组)获取。
    public int myRead()throws IOException {
        //通过in对象读取硬盘上数据,并存储buf中。
        if(count==0) {
            count = in.read(buf);
            if(count<0)
                return -1;
            pos = 0;
            byte b = buf[pos];
            count--;
            pos++;
            return b&255;
        } else if(count>0) {
            byte b = buf[pos];
            count--;
            pos++;
            return b&0xff;
        }
        return -1;
    }
    public void myClose()throws IOException {
        in.close();
    }
}
/*
  11111111 11111111 11111111 11111111
& 00000000 00000000 00000000 11111111
-------------------------------------
  00000000 00000000 00000000 11111111
*/

转换流

重要特点:可以指定编码表

读取转换流

//InputStream is = System.in;//键盘录入
FileInputStream fis = new FileInputStream("demo.txt");//文件读取
InputStreamReader isr = new InputStreamReader(fis,"utf-8");
BufferedReader br = new BufferedReader(isr);

写入转换流

//OutputStream out = System.out;//输出到控制台
FileOutputStream fos = new FileOutputStream("demo.txt");//输出到文件
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
BufferedWriter bw = new BufferedWriter(osw);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值