第十一章、IO流技术

一、输入输出IO流

1、数据源及流的概念

/**
 * 使用try-catch-finally经典语法结构,测试流的使用
 */
public class Test02 {

    public static void main(String[] args) {
        readFile();
        writeFile();
    }

    public static void readFile(){
        FileInputStream fis=null;
        try {
            fis=new FileInputStream("d:/b.txt");
            int s1=fis.read();
            int s2=fis.read();
            int s3=fis.read();
            int s4=fis.read();
            int s5=fis.read();

            System.out.println((char)s1);
            System.out.println((char)s2);
            System.out.println((char)s3);
            System.out.println((char)s4);
            System.out.println(s5); //由于文件内容已经读取完毕,返回-1

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //流对象用完后必须关闭,否则总是占用系统资源
            try {
                if(fis!=null){
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void writeFile(){
        FileOutputStream fos=null;
        try {
            fos=new FileOutputStream("d:/c.txt");
            fos.write('x');
            fos.write('r');
            fos.write('m');

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(fos!=null){
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
/**
 * 使用try-with-resource新语法结构,使用流对象
 */
public class Test03 {

    public static void main(String[] args) {
        readFile();
        writeFile();
    }

    public static void readFile(){
        try(FileInputStream fis=new FileInputStream("d:/b.txt");) {
            int s1=fis.read();
            int s2=fis.read();
            int s3=fis.read();
            int s4=fis.read();
            int s5=fis.read();

            System.out.println((char)s1);
            System.out.println((char)s2);
            System.out.println((char)s3);
            System.out.println((char)s4);
            System.out.println(s5); //由于文件内容已经读取完毕,返回-1

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void writeFile(){
        try(FileOutputStream fos=new FileOutputStream("d:/c.txt");) {
            fos.write('x');
            fos.write('r');
            fos.write('m');

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2、Java中流的概念细分

/**
 * 流的使用,经典代码
 */
public class Test04 {

    public static void main(String[] args) {

        writeFile();
        readFile();
//        copyFile("d:/主图2021年.jpg","d:/主图2021年_copy.jpg");
        copyFileBuffer("d:/主图2021年.jpg","d:/主图2021年_copy2.jpg");
    }

    public static void readFile(){

        try(FileInputStream fis=new FileInputStream("d:/c.txt")){

            StringBuilder sb=new StringBuilder();
            int tmp=0;
            while((tmp=fis.read())!=-1){
                sb.append((char)tmp);
            }

            System.out.println(sb);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void writeFile(){

        try(FileOutputStream fos=new FileOutputStream("d:/c.txt")){

            fos.write("abcde".getBytes());

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //读一个字节,写一个字节,效率最低的原始版本
    public static void copyFile(String srcPath,String desPath){

        try(FileInputStream fis=new FileInputStream(srcPath);
            FileOutputStream fos =new FileOutputStream(desPath)){

            int tmp=0;
            while((tmp=fis.read())!=-1){
                fos.write(tmp);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //使用缓存,提高读取效率
    public static void copyFileBuffer(String srcPath,String desPath){

        try(FileInputStream fis=new FileInputStream(srcPath);
            FileOutputStream fos =new FileOutputStream(desPath)){

            byte[] buffer=new byte[1024];
            while((fis.read(buffer))!=-1){
                fos.write(buffer);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

二、IO流体系介绍

1、文件字符流

/**
 * 关于文件字符流的测试操作,实现了文本文件的拷贝
 */
public class TestFileReaderWriter {

    public static void main(String[] args) {

        try(FileReader fr=new FileReader("d:/a.txt");
            FileWriter fw=new FileWriter("d:/a_copy.txt");){
            int tmp=0;
            while((tmp=fr.read())!=-1){
                fw.write(tmp);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 2、缓冲字节流

/**
 * 测试缓冲字节流
 */
public class TestBufferInputOutputStream {

    public static void main(String[] args) {

        try(FileInputStream fis=new FileInputStream("d:/反诈视频3.mp4");
            FileOutputStream fos=new FileOutputStream("d:/反诈视频3_copy.mp4");
            BufferedInputStream bis=new BufferedInputStream(fis);
            BufferedOutputStream bos=new BufferedOutputStream(fos);){

            int tmp=0;
            while((tmp=fis.read())!=-1){
                bos.write(tmp);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

3、缓冲字符流

/**
 * 使用缓冲字符流
 */
public class TestBufferReaderWriter {

    public static void main(String[] args) {

        try(BufferedReader br=new BufferedReader(new FileReader("d:/a.txt"));
            BufferedWriter bw=new BufferedWriter(new FileWriter("d:/a2.txt"));){

            String tmpString="";
            while((tmpString=br.readLine())!=null){
                bw.write(tmpString);
                bw.newLine();
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4、字节数组流

/**
 * 使用字节数组流
 */
public class TestByteInputOutputStream {

    public static void main(String[] args) {

        test01("abcdefg".getBytes());
    }

    public static void test01(byte[] bytes){

        int tmp=0;
        int num=0;  //用于表示读取的字节数

        try(ByteArrayInputStream bis=new ByteArrayInputStream(bytes);){

            while((tmp=bis.read())!=-1){
                System.out.println((char)tmp);
                num++;
            }

            System.out.println("读取的字节数是:"+num);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5、数据流

/**
 * 使用数据流
 */
public class TestDataInputOutputStream {

    public static void main(String[] args) {
//        writeData();
        readData();
    }

    public static void writeData(){

        try(DataOutputStream dos=new DataOutputStream(new FileOutputStream("d:/data.txt"));){

            dos.writeChar('a');
            dos.writeInt(10);
            dos.writeDouble(Math.random());
            dos.writeBoolean(true);
            dos.writeUTF("你好java!");

            //手动刷新缓冲区,将流中的数据写入到文件
            dos.flush();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void readData(){

        try(DataInputStream dis=new DataInputStream(new FileInputStream("d:/data.txt"))){

            //读取数据时,需要和写入的顺序保持一致!否则不能正确的读取数据
            System.out.println(dis.readChar());
            System.out.println(dis.readInt());
            System.out.println(dis.readDouble());
            System.out.println(dis.readBoolean());
            System.out.println(dis.readUTF());

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

6、对象流 

public class Users implements java.io.Serializable{

    private int id;
    private String uname;
    transient private String pwd;

    public Users() {
    }

    public Users(int id, String uname, String pwd) {
        this.id = id;
        this.uname = uname;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

public class TestObjectInputOutputStream {

    public static void main(String[] args) {

        writeObject();
        readObject();
    }

    public static void writeObject(){

        try(ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("d:/object_data.txt"))){

            ArrayList<Users> list=new ArrayList<>();
            list.add(new Users(1001,"张三","123456"));
            list.add(new Users(1002,"李四","123456"));
            list.add(new Users(1003,"王五","123456"));

            oos.writeObject(list);
            oos.flush();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void readObject(){

        try(ObjectInputStream ois=new ObjectInputStream(new FileInputStream("d:/object_data.txt"))){

            ArrayList<Users> list=(ArrayList) ois.readObject();

            for(Users u:list){
                System.out.println(u.getId()+","+u.getUname()+","+u.getPwd());
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

 7、转换流

/**
 * 测试转换流
 */
public class TestInputStreamReader {

    public static void main(String[] args) {

        try(BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out))){

            String str=br.readLine();

            while(!"exit".equals(str)){
                bw.write("键盘输入:"+str);
                bw.newLine();
                bw.flush();

                str=br.readLine();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

8、任意访问文件流

/**
 * 测试任意访问文件流
 */
public class TestRandomAccessFile {

    public static void main(String[] args) {

        try(RandomAccessFile raf=new RandomAccessFile("d:/data2.txt","rw")){

            int[] data={10,20,30,40,50,60,70,80,90,100};

            for(int i=0;i<data.length;i++){
                raf.writeInt(data[i]);
            }

            //直接从data2.txt中读取数据,位置从第4字节开始
            raf.seek(4);
            System.out.println(raf.readInt());

            //在第8个字节处,插入一个新数据45,替换以前的数据30
            raf.seek(8);
            raf.writeInt(45);

            for(int i=0;i<10;i++){
                raf.seek(i*4);
                System.out.print(raf.readInt()+"\t");
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

三、Apache IO 包的使用

/**
 * 测试Apache Commons组件下的IO工具库
 */
public class TestApacheFileUtils {

    public static void main(String[] args) {

        writeFile();
        readFile();
        readURL();
        fileCopy();
        directoryCopy();
    }

    public static void writeFile(){

        StringBuilder sb=new StringBuilder();

        for(int i=0;i<1000;i++){
            sb.append(Math.random()+"\n");
        }

        try {
            FileUtils.write(new File("d:/apache-test.txt"),sb.toString(),"gbk");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void readFile(){

        try {
            List<String> content=FileUtils.readLines(new File("d:/apache-test.txt"),"gbk");
            for(String temp:content){
                System.out.println(temp);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void readURL(){

        try {

            URL url=new URL("http://www.baidu.com");
            InputStream is=url.openStream();
            String content=IOUtils.toString(is,"UTF-8");

            System.out.println(content);

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void fileCopy(){
        File srcFile=new File("d:/a.txt");
        File desFile=new File("d:/aa.txt");

        try {
            FileUtils.copyFile(srcFile,desFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void directoryCopy(){
         File dir1=new File("d:/tmp");
         File dir2=new File("d:/tmp2");

        try {

            FileUtils.copyDirectory(dir1, dir2, new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    if(pathname.isDirectory()||pathname.getName().endsWith("jpg")){
                        return true;
                    }else{
                        return false;
                    }
                }
            });


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值