2020-11-08 IO流

IO 流

一、java IO流的概念

java的io是实现和输入的基础,可以方便的实现数据的输入和输出操作。在java中把不同的舒润/输出源(键盘,文件,网络连接等)抽象表述为“流”(stream)。

二、IO流的分类

(一、)按照不同的分类方式,可以把不同的类型。常用的分类三种:

1.按照流的流分向,可以分为输入流和输出流;

输入流:

  1. 输入流:只能从中读取数据,而不能向其写入数据;
  2. InputStream和Reader为基类

输出流

  1. 输出流:只能向其写入数据,而不能向其读取数据;

  2. OutputStream和Writer为基类

2.操作单元划分,可以划分为字节流和字符流;

字节流

  1. 字节输入流:InputStream基类
  2. 字节输出流:OutputStream基类

字符流

  1. 字符输入流:Reader基类
  2. 字节输出流:Writer基类

3.按照流的角色划分为节点流和处理流;

节点流

节点流:节点流从一个特定的数据源读写数据。即节点流是直接操作文件,网络等的流,例如FileInputStream和FileOutputStream,他们直接从文件中读取或往文件中写入字节流。

img

处理流

处理流:“连接”在已存在的流(节点流或处理流)之上通过对数据的处理为程序提供更为强大的读写功能。过滤流是使用一个已经存在的输入流或输出流连接创建的,过滤流就是对节点流进行一系列的包装。例如BufferedInputStream和BufferedOutputStream,使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率,以及DataInputStream和DataOutputStream,使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。他们都属于过滤流。

(二、)java输入/输出流体系中常用的流的分类表

分类 字节输入流 字节输出流 字符输入流 字符输出流
抽象基类 InputStream OutputStream Reader Writer
访问文件 FilelnputStream FileOutlnputStream FileReader FileWriter
访问数组 ByteArraylnStream ByteArrayOutlnStream CharArrayReader CharArrayWriter
访问字符串 StringReader StringWriter
缓冲流 BufferedlnputStream BufferedOutlnputStream BufferedReader BufferedWriter
转化流 InputStreamReader OutputStreamWriter
对象流 ObjectlnputStream ObjectOutputStream

转换流都能将字符流转成字节流

2.1InputStream

引入相关的类: InputStream ins =null;

构建输入流,例如FileInputStream:

ins =new FileInputStream(new File(path));

操控字节输入流的,所用的方法也是针对字节的。

常用方法:

三、工作内容

3.1创建文件夹

File file = new File("D://b");
file.mkdir();

3.2创建文档

public void fileTest() throws Exception{
        File file = new File("D://a.txt");
        boolean newFile = file.createNewFile();
        System.out.println(newFile);
    }

3.3删除文档或文档夹

public void fileTest() throws Exception{
        File file = new File("D://a.txt");
         boolean newFile = file.delete();
        System.out.println(newFile);
    }

3.4检查文档是否可以写,读,执行,存在

public void fileTest() throws Exception{
        File file = new File("D://a.txt");
        //能否执行
        System.out.println(file.canExecute());
        //能否读
        System.out.println(file.canRead());
        //能否写入
        System.out.println(file.canWrite());
        //文档是否存在
        System.out.println(file.exists());
    }

3.5文档路径显示

System.out.println(file.getCanonicalPath());

3.6查看是否为文件夹

System.out.println(file.isDirectory());

3.7finally(最终)

try {
    System.out.println("The count is " + Integer.parseInt(count));
} catch (NumberFormatException e) {
    System.out.println("No count");
} finally {
    System.out.println("In finally");
}

3.8io流拷贝文件

package com.xinzhi;

import org.junit.Test;

import java.io.*;

/**
 * @author:荆少奇
 * @create:2020/11/8 17:29
 */
public class IOTest {
    //查找
    @Test
   public void coplyTest() {
        //把一个文件移到另一个地方
        FileInputStream is = null;
        FileOutputStream os = null;
        try {
            File file = new File("D://a/a/a.mp3");
            is = new FileInputStream("D://a/a/a.mp3");
            os = new FileOutputStream("D://a/b/a.mp3");
            long length = file.length();
            int bay = 1024;
            long completed = 0L;
            byte[] bytes = new byte[bay];
            int len;
            while ((len = is.read(bytes)) != -1){
                completed += bay;
                os.write(bytes,0,len);
                System.out.println("已经拷贝了:" + String.format("%.2f",((double)completed/length)*100) + "%");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(is != null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(os != null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

重要

is = new FileInputStream("D://a/a/a.mp3");
os = new FileOutputStream("D://a/b/a.mp3");
int bay = 1024;
byte[] bytes = new byte[bay];
int len;
while ((len = is.read(bytes)) != -1){
      os.write(bytes,0,len);
}

3.9io流读文件内容

public void readFiler() throws IOException {
        //InputStream:是一个抽象类
        // \:是一个 转移符
        //表示磁盘路径的两种表示方式:1、\\   2、/
        try {
            //从文件地址中读取内容到程序中
            //1、建立连接
            InputStream is = new FileInputStream("D://a.txt");
            //2、开始读取信息
            /*
            //方法1:一次只读一个
            System.out.println(is.read());//读取的是字节型的:49
            System.out.println((byte)is.read());//50
            */
            byte[] bytes = new byte[18];
            //把所有的数据读取到这个字节当中
            //声明一个int存储每次读取到的数据
            int i = 0;
            //定义一个记录索引的变量
            int index = 0;
            //循环读取每个数据
            while ((i = is.read()) != -1) {
                //把读取的数据放到i中
                bytes[index] = (byte) i;
                index++;
            }
            //把字节数组转成字符串
            System.out.println(new String(bytes));
            //关闭流
            is.close();
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }
    }

3.10IO流写入内容


         * IO写入内容
         * 字节流
         */
        public void writeFile() throw Exception{
            //对一根管道到文件上
            FileOutputStream fo = new FileOutputStream ("D://a");
            String str = "hello js";
            //写出去
            fo.write (str.getBytes ());

            fo.flush ();
            fo.close ();
        }
        //字符流
        public void writeFile2() throw Exception{
            //对一根管道到文件上
            FileWriter fw = new FileWriter ("D://a");
            //写出去
            fw.write ("中华人民共和国");

            fw.flush ();
            fw.close ();
        }

        public void writeFile3() throw Exception {
            //对一根管道到文件上
            FileWriter fw = new FileWriter ("D://a");
          //  BufferedWriter bw = new BufferedWriter (fw);
            //写出去
            fw.append ("aa").append ("bb").append ("cc");

            fw.flush ();
            fw.close ();
        }

3.11打印流和文件追加

public void writeFile4()throw Exception {
            //对一根管道到文件上
            FileWriter fw = new FileWriter ("D://a.txt",true);
            PrintWriter printWriter = new PrintWriter (fw);
            Scanner scanner = new Scanner (System.in);
            //  BufferedWriter bw = new BufferedWriter (fw);
            //写出去
            String flag = null;
            while (!"exit".equals (flag)){
                flag = scanner.next ();
                System.out.println (flag);
                fw.flush ();
            }

            fw.close ();
        }

3.12面向对象注册并存储

package com.xinzhi;

import java.io.*;
import java.util.Scanner;

/**
 * @author:荆少奇
 * @create:2020/11/8 21:51
 */
public class Register {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入您的用户名:");
        String userName = scanner.next();
        System.out.println("请输入您的密码:");
        String passWord = scanner.next();
        Register register = new Register();
        register.register(userName,passWord);
    }

    /**
     * 注册方法
     * @param userName
     * @param passWord
     */
    public void register(String userName,String passWord){
        User user = new User(userName,passWord);
        //方法
        saveUser(user);
    }

    /**
     * 保存用户
     * @param user
     */
    private void saveUser(User user) {
        /**
         * 输出流
         */
        Writer writer = null;
        PrintWriter pw = null;
        try {
            //常量类里的东西
            File userFile = new File(Constant.BASE_PATH + Constant.USER_FILE_NAME);
            if (!userFile.exists()) {
                userFile.createNewFile();
            }
            writer = new FileWriter (userFile,true);
            pw = new PrintWriter (writer);
            pw.append(user.getUserName())
                    //换行\n\t(制表符)
                    .append("---")
                    .append(user.getPassword())
                    .append("\n");
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if (writer != null){
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (pw != null){
                pw.close();
            }
        }
    }
}

package com.xinzhi;

/**
 * @author:荆少奇
 * @create:2020/11/8 21:56
 */
public class Constant {
    /**
     * 常量类
     * 目录
     */
    public static final String BASE_PATH = "D://";
    public static final String USER_FILE_NAME = "user.txt";
}

package com.xinzhi;

/**
 * @author:荆少奇
 * @create:2020/11/8 21:51
 */
public class User {
    private String userName;
    private String password;

    public User(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    /**
     * 获取get和set
     * @return
     */
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

数据的持久化

[图片上传失败...(image-d29c71-1604848851858)]

3.13.io流对象流序列化和反序列化

implements Serializable对象序列化接口

/**
         * 对象流
         * 序列化
         */
        public void testObjcet() throw Exception{
            //搞个文件流
            FileOutputStream fo = new FileOutputStream ("D://ab.temp");
            ObjectOutputStream oos = new ObjectOutputStream (fo);

            User user = new User ();
            user.getUserName ("中国");

            oos.writeObject (user);

            oos.flush ();
            oos.close ();
        }
/**
         * 对象流
         * 反序列化
         */
        public void testObjcet2() throw Exception{
            //搞个文件流
            FileInputStream fi = new FileInputStream ("D://ab.temp");
            ObjectInputStream ois = new ObjectInputStream (fi);

            //Objectc强转成User
            User user = (User)ois.readObject ();
            System.out.println (user.getUserName ());


            ois.close ();
        }

3.14.网络编程入门

package com.xinzhi;

import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author:荆少奇
 * @create:2020/11/8 22:44
 */
public class QQServer {
    public static void main(String[] args) throws IOException {
        //创建一个服务器
        ServerSocket ss = new ServerSocket ();
        //服务器绑定端口
        ss.bind(new InetSocketAddress (3303));
        //服务器等端口消息
        System.out.println ("服务器已经启动监听制在3303端口");
        Socket accept = ss.accept ();
        //如果有消息来了就接受
        InputStream inputStream = accept.getInputStream ();
        byte[] buff = new byte[1024];
        int len;
        while((len = inputStream.read (buff)) != -1){
            System.out.println (new String(buff,0,len));
        }
        inputStream.close ();

    }
}


package com.xinzhi;

import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

/**
 * @author:荆少奇
 * @create:2020/11/8 23:02
 */
public class QQ {

    public static void main(String[] args) throws Exception{
        //创建一个客户端
        Socket socket = new Socket ();
        //客户端连接服务器
        socket.connect (new InetSocketAddress ("192.168.1.12",3303));
        OutputStream outputStream = socket.getOutputStream ();
        String mag = "hello server!";
        outputStream.write (mag.getBytes ());

        outputStream.flush ();
        outputStream.close ();

    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。