A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

六.IO流
IO流大致分类
以Stream结尾的为字节流,以Writer或者Reader结尾的为字符流

所有的输入流都是抽象类IuputStream或者是抽象类Reader的子类,所有的输出流都是抽象OutputStream或者是抽象类Writer的子类。字符流能实现的功能字节流都能实现,但字节流能实现的功能字符流不一定能实现。如:图片,视频等二进制文件,只能使用字节流读写。

字节流

输入流 InputStream
字节流 FileInputStream
字节缓冲流 BufferedInputStream
输出流 OutputStream
字节流 FileOutputStream
缓冲字节流 BufferedOutputStream
字符流

字符流 Reader
字符流 FileReader
缓冲字符流 BufferedReader
转换流 InputStreamReader
字符流 Writter
字符流 FileWriter
缓冲字符流 BufferedWriter
转换流 OutputStreamWriter
public static void main(String[] args) throws Exception {
          InputStream in = new FileInputStream("C:\\Users\\学生29\\Desktop\\a.jpg"); //该资源的位置
          OutputStream out = new FileOutputStream("E:\\a.jpg"); //到哪里去 文件名称
          long begintime = System.currentTimeMillis();
          int len = 0; //局部变量 没有默认的初始化值
          byte[] b = new byte[1024 * 10];  //b表示缓冲区
          while ((len = in.read(b)) != -1){  //read(b)输入方法
              out.write(b,0,len); //write(b,0,len)输出方法
          }
          long endtime = System.currentTimeMillis();
          long time = endtime - begintime;
          System.out.println("消耗的时间为:" + time);
          out.close(); //关闭流 【先开后关,后开先关】
          in.close();
      }

RandomAccessFile

这个类的实例支持对随机存放文件的读和写
随机访问
操作文件
既可以读又可以写
内部维护了用于存储数据的byte数组
提供了对数组操作的文件指针
文件指针可以通过getFilePointer方法获取,并通过seek方法设置
InputStream有个方法read()可用于读取内容
int len = 0;
  while((len = in.read()) != -1){
  out.write(len);
  }

在指定位置
创建一个文件
读取txt的内容
将读取的内容输出道新文件
int b = in.read();
if(b == -1){
       break;
}

字节流和字符流的区别

字节流不是汉字的内容,而是字母、数字等,字符流则是汉字,(简体和繁体);
字节流按字节读写,而字符流按字符读写;
字节流是以stream结尾,而字符流是以reader和writer结尾;
字节流采用ASCII编码,而字符流采用Unicode编码;
字节流默认不使用缓冲区,字符流使用缓冲区。

七.Jdbc
创建过程
/**
        * 前提:
        *  想使用jdbc连接:导入一个jar包
        *              |-----------mysql-connector-java-5.1.47------------|
        *  1.注册驱动
        *  2.通过驱动管理(DrviverManage)获取连接class.forName(url user password)
        *  3.通过连接(connection)对象创建statement(陈述 声明)对象
        *  4.通过statement对象执行SQL语句  execute执行
        *  5.操作结果集对象ResultSet
        *  6.释放资源
        */

增删改一个套路【比较繁琐】
        //全局变量        
        private static String url = "jdbc:mysql://localhost:3306/bookmanage";
    private static String driverClassName = "com.mysql.jdbc.Driver";
    private static String username = "root";
    private static String password = "root";

    @Test
    public void addJdbc(){
        try {
            Class.forName(driverClassName);
            Connection con = DriverManager.getConnection(url, username, password);
            Statement statement = con.createStatement();
            statement.execute("insert into dept(id,name,location) values (100,'学术部','深圳')");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Test
    public void delJdbc(){
        try {
            Class.forName(driverClassName);
            Connection con = DriverManager.getConnection(url, username, password);
            Statement statement = con.createStatement();
            String sql;
            sql="delete from dept where id=100";
            statement.execute(sql);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    @Test
    public void editJdbc(){
        try {
            Class.forName(driverClassName);
            Connection con = DriverManager.getConnection(url, username, password);
            Statement statement = con.createStatement();
            statement.execute("update dept set location='上海' where id = 33");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

查询
         @Test
    public void listJdbc(){
        try {
            Class.forName(driverClassName);
            Connection con = DriverManager.getConnection(url, username, password);
            Statement statement = con.createStatement();
            String sql;
            sql="select * from dept";
            ResultSet rs = statement.executeQuery(sql);
            int id = 0;
            String name = "";
            String location = "";
            while (rs.next()){  //处理结果集
                 id = rs.getInt("id");
                 name = rs.getString("name");
                 location = rs.getString("location");
                System.out.println(id + "   " + name + "   " + location);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
或者
public void add2() throws Exception{
        Class.forName(driverClassName);
        Connection con = DriverManager.getConnection(url, username, password);
        PreparedStatement ps = con.prepareStatement("insert into lib(id,name,price,date) values(?,?,?,?)");
        ps.setInt(1,111);
        ps.setString(2,"蜜汁炖鱿鱼");
        ps.setDouble(3,36.9);
        String date = "1999-8-8 19:52:00";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //转换
        Date d = sdf.parse(date);
        long time = d.getTime();
        ps.setDate(4,new java.sql.Date(time));
        int rows = ps.executeUpdate();
        if (rows > 0){
            System.out.println("success");
        }else{
            System.out.println("error");
        }

简单化
public class JdbcUtil2 {
    public static void main(String[] args) {
//       update("insert into  category (id,name) values (221,'公关部')");
//       update("delete from category where i                                                           d=?");
//       update("update category set name='社会' where id=77");
       query("select * from category");
    }

    public static Connection load(){
        String driverClassName = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql:///bookmanage";
        String username = "root";
        String password = "root";
        try {
            Class.forName(driverClassName);
            Connection connection = DriverManager.getConnection(url, username, password);
            return connection;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 增删改  用update
     */
    public static void update(String sql){
        Connection con = load();
        try {
            Statement sta = con.createStatement();
            boolean execute = sta.execute(sql);
            if (!execute){
                System.out.println("执行成功");
            }else {
                System.out.println("执行失败");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
        /**  
     * 查询  用query
     */
    public static void query(String sql){
        Connection con = load();
        try {
            PreparedStatement ps = con.prepareStatement(sql);
            ResultSet resultSet = ps.executeQuery();
            while (resultSet.next()){
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println(id + "   " + name);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
   }
}

疑问
/**
*   Statement  是编译对象  是执行sql语句的
*      |-----PreparedStatement 是预编译对象  是执行sql语句的
*为什么不采用Statement?
     *  答:因为有可能会发生 SQL安全问题!  SQL注入
     *  因此 子类PreparedStatement 解决上面的可会出现的问题,没有 SQL安全问题。所以采用它
*    executeUpdate(): 增删改 使用 Update方法  --- >    对应到  QueryRunner 类中的update()
*    executeQuery():    查 使用 Query方法    --- >    对应到  QueryRunner 类中的query()
*/


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马