敢敢单单总结一下IO流相关基础知识和小应用!小目录在下荒~~!

java io流设置字符集 java 字符输入流_java io流设置字符集

  1. 字节输入流和字节输出流
  2. 字符输入流和字符输出流
  3. 装饰流
  4. 简单实现文件的拷贝

1. 字节流

字节输入流

指的是数据输入源(如键盘),获取字节数据到应用程序里,跟类为抽象类InputStream 文件字节流常用new FileInputStream
提供如下方法:

File filef = new File("G:\\DEV\\201907E\\testIO\\Hello.dat");
InputStream is = new FileInputStream(filef);
InputStream iss = new FileInputStream("Hello.dat");//相对路径
is.read();	//从文件里读取一个字节并返回
byte[] byets =  new byte[3];	
is.read(byets);	//从文件了里读取一个字节数组的量的字节
is.read(byets,1,2);	//一次读取最多2个字节,从字节数组1位置开始寸
is.skip(2);		//跳过两个字节
is.close();		//关闭输入流,释放资源
is.available();	//返回可以读取的字节数
is.mark(2);	//标记当前位置,读取超过2字节数量,则标记失效
is.reset();	//mark定位到最后一次调用的位置
is.markSupported();//查看是否支持mark和reset(有缓冲区才支持)

字节输出流

指的是应用程序里输出到外面,比如文件,屏幕,根类为抽象类OutputStream(和字节输入流基本相对应)

File filet = new File("G:\\DEV\\201907E\\testIO\\Hello.dat");
OutputStream os = new FileOutputStream(filef,true);//true代表追加录入,默认为false
OutputStream oss = new FileOutputStream("Hello.dat",true);
os.write(5);	//写入低八位
byte[] byetss =  new byte[3];	
os.write(byetss);
os.write(byetss,1,2);
os.flush(); //强制录入(因为录入的内容会先存到缓存,如果数据少,要强制fulsh一下)
os.close(); //如果close掉输出流,也会自动清空缓存,存入文件的

2. 字符流

字符输入流

根父类是Reader,常用文件字符流 FileReader

File filer = new File("G:\\DEV\\201907E\\testIO\\Hello.dat");
Reader reader = new FileReader(filer);
Reader reader2 = new FileReader("Hello.dat");
reader.read();	//读取一个字符
char[] chars = new char[3];
reader.read(chars);	//读取一个字符数组的量
reader.read(chars,1,2);
reader.skip(2);	//跳过2个字符
reader.mark(2);
reader.reset();
reader.markSupported();
reader.close();

字符输出流

根父类是Writer,常用文件字符流 FileWriter

File filew = new File("G:\\DEV\\201907E\\testIO\\Hello.dat");
Writer writer = new FileWriter(filew,true);
Writer writer2 = new FileWriter("Hello.dat",true);
writer.write(3);	//写入整数低16位
char[] charw = new char[3];
writer.write(charw);
writer.write(charw, 0, 2);//从0开始读取2个字符写入
writer.write("asd");//写String
writer.write("asd", 1, 1);//从1开始读取1个字符写入
writer.flush();
writer.close();

3. 装饰流

撒是装饰流?就是不能单独作为流,但可以套在文件输入流和文件输出流上,给他们增加功能,比如输入输出boolean类型,输入输出Double类型
装饰流有很多,数据流,缓冲流,对象流,随机流,这里就简单总结前三种了

数据流

顾名思义,就是可以比字符输入输出更好,实现数据的输入输出。这个方式是与机器无关的,程序从底层输入输出流搞到基本java数据类型---------->>数据流分为数据输入流和数据输出流,示例代码:

File filef = new File("G:\\DEV\\201907E\\testIO\\Hello.dat");
File filet = new File("G:\\DEV\\201907E\\testIO\\Hello1.dat");
InputStream is = new FileInputStream(filef);
OutputStream os = new FileOutputStream(filet,true);
DataInputStream dis = new DataInputStream(is);	//数据输入流
DataOutputStream dos = new DataOutputStream(os);	//数据输出流

//输入输出方法基本对应,就拿输入举栗子了~!
dis.readBoolean();
dis.readByte();
dis.readChar();
dis.readLong();
dis.readInt();
dis.readShort();
dis.readFloat();
dis.readDouble();
dis.readUTF();
dis.skipBytes(2);//跳过两个字节
缓冲流

缓冲流是在基本输入输出流的基础上,加一个缓冲区,也就是input的时候,先把输入流的字节放在缓冲区,然后程序从缓冲区读。反之,output的时候,先输出到缓冲区里,然后等缓冲区满了或者调了flush()方法,再真的输出到文件,示例:

File filef = new File("G:\\DEV\\201907E\\testIO\\Hello.dat");
File filet = new File("G:\\DEV\\201907E\\testIO\\Hello1.dat");
InputStream is = new FileInputStream(filef);	//字节输入流
OutputStream os = new FileOutputStream(filet,true);//字节输出流
Reader reader = new FileReader(filef);	//字符输入流
Writer writer = new FileWriter(filet,true);//字符输出流

//字节缓冲输入输出流
BufferedInputStream bis = new BufferedInputStream(is);
BufferedInputStream bis1 = new BufferedInputStream(is,3);//可以指定缓冲区大小,不写默认
BufferedOutputStream bos1 = new BufferedOutputStream(os,3);//可以指定缓冲区大小,不写默认

//字符缓冲输入输出流
BufferedReader br = new BufferedReader(reader);
BufferedWriter bw = new BufferedWriter(writer,3);
//输入输出方法和普通的一样,下面是新增方法
br.readLine();	//读一行,返回string
bw.newLine();	//写行分隔符
对象流

对象流就是把对象保存到比如文件,读取的时候还可以读到对象,比如学生对象,各种属性,都是可以读取到的。
对象流必须让该对象实现序列化,也就是实现Serializable接口---------->示例代码:

class Student implements Serializable{
    private static final long serialVersionUID = 1L;
    private String sno;
    private String sname;
    private Integer age;
}
class TestDemo{
    public static void main(String[] args){
File filef = new File("G:\\DEV\\201907E\\testIO\\Hello");
File filet = new File("G:\\DEV\\201907E\\testIO\\Hello");

OutputStream os = new FileOutputStream(filet);//字节输出流
ObjectOutputStream oos = new ObjectOutputStream(os);//对象输出流
InputStream is = new FileInputStream(filef);	//字节输入流
ObjectInputStream ois = new ObjectInputStream(is);//对象输入流

Student stu = new Student("123","ads",5);

oos.writeObject(stu);//对象录入文件
oos.flush();
oos.close();

Student stu1 = (Student) ois.readObject();//从文件读出对象
System.out.println(stu1);
ois.close();
    }
}

4. 简单实现文件的拷贝

public static void main(String[] args)
{
    File file = new File("G:\\NB.dat"); //源文件
    File newFIle = new File(file.getName());//新文件,存到项目根目录
    
    try
    {
        FileInputStream fis = new FileInputStream(file);// 输入流
        FileOutputStream fos = new FileOutputStream(newFIle);

        int ret = 0;
        while((ret=bfis.read())!=-1)
        {
            fos.write(ret);
        }
        
        fis.close();
        fos.flush();
        fos.close();   
    } catch (FileNotFoundException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }	//
catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }	
}