JAVA基础 day21 字节流的输入和输出 字节流的缓冲区 (自己实现BufferedInputStream) 键盘输入 转换流的用法 改变标准输入输出设备 IO流操作的基本规律

字节流:
OutputStream:字节流写入基类。

字节流并不需要刷新操作,因为字符流底层是将传入的字节先存放在一个数组中,然后去查表得到字符,所以需要刷新。而字节流是直接将数据传送到目标位置。

FileOutputStream 文件字节写入操作类

import java.io.*;
class FileOutputStreamDemo
{
    public static void main(String[]args)throws IOException
    {
        FileOutputStream fos=new FileOutputStream("basketball.txt");
        byte[]bt={'c','d','e','f'};
        fos.write((byte)'a');
        fos.write((byte)'b');
        fos.write(bt);
        fos.close();
    }
}

FileInputStream 文件字节读出类
available()方法,可以读取文件的字节数。

import java.io.*;
class FileInputStreamDemo
{
    public static void main(String []args)throws IOException
    {
        FileInputStream fis=new FileInputStream("basketball.txt");
        int b=0;
        while ((b=fis.read())!=-1)
        {
            System.out.println((char)b);
        }
        fis.close();

    }
}

字节流缓冲区 进行复制文件

import java.io.*;
class CopyStreamDemo
{
    public static void main(String[]args)throws IOException
    {
        FileInputStream fis=new FileInputStream("basketball.jpeg");
        FileOutputStream fos=new FileOutputStream("d:\\copy.jpeg");
        BufferedInputStream bis=new BufferedInputStream(fis);
        BufferedOutputStream bos=new BufferedOutputStream(fos);
        int num=0;
        System.out.println(fis.available());
        while ((num=bis.read())!=-1)
        {
            bos.write((char)num);
        }
        fis.close();
        fos.close();
    }
}

自己实现BufferedInputStream:将数据读入缓冲区
这个程序的难点在于:
因为读取的是byte字节,所以数据中很可能会出现8个1,即-1的情况,这时候程序会直接结束,为了避免这种情况,我们返回值设置成了int类型,即4个字节,然后&上 255,就变成了00000000 00000000 00000000 1111111.就不会再出现未达到文件结尾而出现-1的情况,而写的时候,write方法会自动将int数据变为字节数据进行写入,即只写后八位。

import java.io.*;
class MyBufferedInputStream
{
    private FileInputStream fis;
    private byte[]buf=new byte[1024];
    private int count=0,pos=0;//定义一个计数器,一个指针,计数器取得每次读取的数据,然后每读取一次就递减,指针用来读取数组中的元素,每读取一个就递增。
    MyBufferedInputStream(FileInputStream fis)
    {
        this.fis=fis;
    }
    public int myRead()throws IOException
    {
        if(count==0)//当count为0时,就从文件中向数组读取数据
        {
        count=fis.read(buf);
        if(count<0)
            return -1;
        pos=0;
        byte b=buf[pos];
        count--;
        pos++;
        return b&0xff;//因为读取的是byte字节,所以数据中很可能会出现8个1,即-1的情况,这时候程序会直接结束,为了避免这种情况,我们返回值设置成了int类型,即4个字节,然后&上 255,就变成了00000000 00000000 00000000 1111111.就不会再出现未达到文件结尾而出现-1的情况
        }
        else if(count>0)//当count不为0时,就直接从数组取就行
        {
            byte b=buf[pos];
            count--;
            pos++;
            return b&0xff;
        }
        return -1;      
    }
    public void myClose()throws IOException
    {
        fis.close();
    }

}
class MyBufferedInputStreamDemo
{
    public static void main(String[]args)throws IOException
    {
        FileInputStream fis=new FileInputStream("1.mp3");
        FileOutputStream fos=new FileOutputStream("2.mp3");
        MyBufferedInputStream mbis=new MyBufferedInputStream(fis);
        BufferedOutputStream bos=new BufferedOutputStream(fos);
        int num=0;
        long start=System.currentTimeMillis();
        while((num=mbis.myRead())!=-1)
        {
            bos.write(num);
        }
        long end=System.currentTimeMillis();
        System.out.println((end-start));
        mbis.myClose();
        bos.close();

    }
}

键盘录入,当输入over时停止程序

import java.io.*;
class ReadIn
{
    public static void main(String[]args)throws IOException
    {
        InputStream in=System.in;
        byte []c=new byte[1024];

        int num=in.read(c);
        String s=new String(c,0,num);
        if(s.equals("over\r\n"))//因为输入中有个空格,所以要加\r\n,也可以用StringBuilder容器来实现 
            System.exit(0);
        else
            System.out.println(s);

    }
}

转换流:字符和字节之间转换的桥梁。通常涉及到字符编码转换时,可以使用转换流类的构造方法来指定字符编码表,这时候使用转换流。

读取转换流:InputStreamReader: 将字节流转换为字符流,将输入的字节变为字符,可以用字符流的方法。

import java.io.*;
class InputStreamReaderDemo
{
    public static void main(String[]args)throws IOException
    {
        InputStream in=System.in;
        InputStreamReader isr=new InputStreamReader(in);//接收一个字节流,转换为字符流
        BufferedReader br=new BufferedReader(isr);//字符流缓冲区就可以接收被转换的字节流
        String s=null;
        while(!(s=br.readLine()).equals("over"))
        {
            System.out.println(s);
        }
        br.close();
    }
}

写入转换流:OutputStreamWriter:将字符流变成字节流进行写入操作

import java.io.*;
class InputStreamReaderDemo
{
    public static void main(String[]args)throws IOException
    {
        InputStream in=System.in;
        InputStreamReader isr=new InputStreamReader(in);
        BufferedReader br=new BufferedReader(isr);
        //简写
        //BufferedReader br=
        //new BufferedReader(new InputStreamReader(System.out));
        OutputStream out=System.out;//可以直接用write方法写到屏幕上
        OutputStreamWriter osw=new OutputStreamWriter(out);
        BufferedWriter bw=new BufferedWriter(osw);

        String s=null;
        while(!(s=br.readLine()).equals("over"))
        {
            bw.write(s);
            bw.newLine();
            bw.flush();
        }
        br.close();
    }
}

编程:键盘输入的数据写入到文件中

import java.io.*;
class TransDemo
{
    public static void main(String[]args)throws IOException
    {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("trans.txt")));
        String s=null;
        while(!(s=br.readLine()).equals("over"))
        {
            bw.write(s);
        }
        br.close();
        bw.close();
    }
}

IO流操作的基本规律:
1.明确源和目的
源是用来读取的:InputStream,Reader
目的是用来写入的:OutputStream,Writer
2.操作的是不是纯文本
是:字符流
否:字节流
3.明确使用的对象
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台

改变标准输入输出设备
System类里的setIn和setOut方法可以改变标准的输入输出设备。
(标准的输入设备是键盘,输出设备是控制台)

编码:将系统信息打印到文本文件中

import java.io.*;
import java.util.*;
class SysInfoDemo
{
    public static void main(String []args)throws IOException
    {
         Properties p=System.getProperties();
         p.list(new PrintStream("sysinfo.txt"));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值