Java第十八课

1 IO(文件流)

1.1 回顾:

  1. 数据库访问的通用类.
    .
    所以通用类中包含了获取连接的方法;执行增删改的方法;查询的方法

  2. 完成了一个简单的员工管理(DAO):
    增加员工: 删除员工: 修改员工 : 查询员工 ;

  3. 离线的结果集:
    Javax.sql.CachedRowSet[接口]: 离线的缓存行记录集 ;可以将Resultset中的结果缓存在内存中;
    不需要实时连接;
    实例化: CachedRowSet crs = new CachedRowSetImpl();//遇到了无法识别这个类,记得要将jre->自己安装的jdk ;不要用Eclipse自带的jdk;
    常见的方法:ResultSet一致 next() getXX的方法;
    crs.populate(rs);

Java.sql.ResultSet[接口]:实时在线的结果集,如果要使用ResultSet必须保证我们的 ResultSet对象,PreparedStatement以及Connection对象不能释放;

1.2 作业讲解:

使用jdbc完成对商品数据库中的商品表的增删改查操作;但是要求:
工具类+Dao+Entity+Menu+DB(SQL)

这里写图片描述

1.3 数据库访问Dao的套路:

1) 一些准备工作:
建库,建表,插入数据,熟悉crud的sql语句; 建立工程,将数据库的驱动包(mysqlconnector….jar)添加到构建路径;
2) 将课堂的数据库访问通用类copy过来,直接用.
3) 新建实体类,注意实体类和表关系(实体类的属性和表中的列是一致的)
4) Dao类,实现了crud的操作:

Public Boolean  addXX(XX 对象){
   //调用util
    Return 是否增加成功;
}

Public Boolean  delXX(XX 对象){
   //调用util
    Return 是否删除成功;
}

Public Boolean  delXX(实体类某个标识对象唯一属性 ){
   //调用util
    Return 是否删除成功;
}

Public Boolean  updateXX(XX 对象){
   //调用util
    Return 是否修改成功;
}

查询

Public List<实体类> queryAll()
{
   //调用util完成查询,将结果处理后返回给调用者
   Return List实现类;
}



Public List<实体类> queryAll(String name)
{
   //调用util完成查询,将结果处理后返回给调用者
// sql   “… like ? ”
//  “%”+name+”%”
   Return List实现类;
}


Public实体类queryById(int id )
{
   //调用util完成查询,将结果处理后返回给调用者
   Return 实体类的对象;
}

Public实体类queryByNameAndPwd(String name,String pwd )
{
   //调用util完成查询,将结果处理后返回给调用者
   Return 实体类的对象;
}

Public  boolean queryByNameAndPwd(String name,String pwd )
{
   //调用util完成查询,将结果处理后返回给调用者
   Return 是否存在这个对象;
}

以上的套路,知识点(综合):
1) Jdbc :外部的实现类来操作mysql
2) Mysql: 建表 … sql 语句
3) OOP: 类 对象 封装 属性 方法(方法的调用 参数的传递) 重载
4) 集合:集合用来数据传递

1.4 课堂作业:

1) 完成刚刚的查询所有Emp记录的操作;
2) 在1)基础上实现按照部门编号查询员工
3) 在1)基础上实现按照姓名进行模糊查询员工
4) 在1)基础上实现员工的分页显示

1.5 问题[思考]:

这里写图片描述
我们上面查询得到的都是商品表中的记录,我们希望显示,和用户交互type显示的商品的类型名称 [小家电]

1.6 IO(input output)

这里写图片描述
主要针对于磁盘文件以及文件夹的操作:
新建文件夹,删除文件夹; 新建文件,删除文件,; 向文件写入内容,读取内容,…
浏览目录,文件属性等等

从File开始

1.6.1 File

这里写图片描述

构造方法摘要
File(File parent, String child)
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
File(String parent, String child)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File(URI uri)
通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。

boolean createNewFile()
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
boolean delete()
删除此抽象路径名表示的文件或目录。
boolean exists()
测试此抽象路径名表示的文件或目录是否存在。
String
getName()
返回由此抽象路径名表示的文件或目录的名称。
boolean isDirectory()
测试此抽象路径名表示的文件是否是一个目录。
boolean isFile()
测试此抽象路径名表示的文件是否是一个标准文件。
boolean isHidden()
测试此抽象路径名指定的文件是否是一个隐藏文件。

String[] list()
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
File[] listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。

boolean mkdir()
创建此抽象路径名指定的目录。
boolean mkdirs()
创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。

1.6.2 案例1文件[夹]创建

这里写图片描述

1.6.3 案例2文件列表:

这里写图片描述

1.6.4 课堂练习1(遍历文件):

1) 遍历文件:
C:\windows\目录下的所有文件,并按照文件的大小排序输出[文件名,文件大小,上一次修改时间,是否只读]

参考答案:

package filepackage;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;

/**
 * C:\\windows\目录下的所有文件,并按照文件的"大小"排序输出[文件名,文件大小,上一次修改时间,是否只读]
 * 
 * @author Administrator
 *
 */
public class TestSortFile {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 用来存储某目录下的文件的
        ArrayList<File> list = new ArrayList<>();

        // 创建FIle对象
        File file = new File("c:\\windows");

        // 格式化时间字符串
        SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 判断其是否是目录
        if (file.isDirectory()) {
            // 得到这个目录下的文件[文件夹]信息
            File[] files = file.listFiles();
            // 提取文件出来
            for (File f : files) {
                // 如果这个File对象是一个文件存储出来
                if (f.isFile()) {
                    list.add(f);
                }

            }

            // 集合的数据应该是很多file对象,都是文件;
            // 通过file的length作为标准进行比较;
            // 排序:1) 冒泡 . 2) Arrays.sort(T[]) 最好是数组 3)

            Collections.sort(list, new Comparator<File>() {

                @Override
                public int compare(File f1, File f2) {
                    // TODO Auto-generated method stub
                    return (int) (f1.length() - f2.length());
                }
            });

            // 输出结果
            for (File f : list) {
                // f.lastModified() 毫秒值
                Date modify = new Date(f.lastModified());

                // 格式化返回一个字符串
                String modifyStr = simple.format(modify);

                System.out.println("文件名 :" + f.getName() + ",[长度] :" + f.length() + ",[上次修改时间] :" + modifyStr);
            }

        }

    }

}

1.6.5 课堂练习2(遍历多级目录文件)

2) 遍历多级文件:
C:\windows\目录下的所有文件,包括子目录下的文件; [难 面试题]

package filepackage;

import java.io.File;

/**
 * C:\\windows\目录下的所有文件,包括我们的子目录,并按照文件的"大小"排序输出[文件名,文件大小,上一次修改时间,是否只读]
 * 
 * @author Administrator
 *
 */
public class TestForeachFile {

    // 定义一个方法,有参数,是一个File对象
    // 判断file对象时一个文件的话,直接打印这个文件的信息
    // 如果file对象是一个目录的话,自己调用自己,再遍历

    /**
     * 显示文件方法
     * 
     * @param file
     *            File对象
     */
    private static void showFiles(File file) {
        // 判断file对象时一个文件的话,直接打印这个文件的信息
        if (file.isFile()) {
            System.out.println("getAbsolutePath :" + file.getAbsolutePath() + "文件名: " + file.getName());
        } else {
            // 判断file是否为空
            if (null != file && file.listFiles() != null) {
                // 如果file对象是一个目录的话,要遍历,自己调用自己,再遍历
                for (File f : file.listFiles()) {
                    showFiles(f);
                }
            }
        }

    }

    /**
     * 
     * @param args
     */
    public static void main(String[] args) {

        // 得到File对象
        File file = new File("c:\\windows");

        // 调用showFiles的方法
        showFiles(file);

    }

}

一个小问题
这里写图片描述

1.6.6 通过问题引入流的概念:

接上一个案例,将磁盘目录(子目录)中的所有文件都能显示出来,控制台输出,如果是将这些显示在控制台的字符串保存到文件中呢?
针对于文件内容的操作:
1. 将内存中的信息写入到磁盘的文件中去 :输出流(outputstream)
2. 将磁盘文件中的内容读取出来,放在内存中: 输入流(inputstream)
这里写图片描述
能否反过来:
从文件->内存?

需要用到文件流,而文件流有方向性

1.6.7 OutPutStream:输出流

这里写图片描述
这里写图片描述

1.6.8 FileOutputStream:

public class FileOutputStream
extends OutputStream
文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。文件是否可用或能否可以被创建取决于基础平台。特别是某些平台一次只允许一个 FileOutputStream(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。
FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter
方法摘要
void close()
关闭此文件输出流并释放与此流有关的所有系统资源。
protected void finalize()
清理到文件的连接,并确保在不再引用此文件输出流时调用此流的 close 方法。
FileChannel
getChannel()
返回与此文件输出流有关的唯一 FileChannel 对象。

FileDescriptor
getFD()
返回与此流有关的文件描述符。
void write(byte[] b)
将 b.length 个字节从指定 byte 数组写入此文件输出流中。
void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
void write(int b)
将指定字节写入此文件输出流。

1.6.9 FileWriter:

这里写图片描述
这里写图片描述
我们发现所有的方法中,这个方法是最简单的;

文件写入
这里写图片描述

这里写图片描述

1.6.10 字节流和字符流:

Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。

Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和 java 内 Unicode 字符流之间的转换。而类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。

1.6.11 flush:

这里写图片描述

1.6.12 课堂练习3FileWriter:

实现将刚刚的控制台输入文件名写入文件中来

package fileWriterpackage;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class TestFileWriter2 {

    static StringBuffer info = new StringBuffer();

    /**
     * 显示文件方法
     * 
     * @param file
     *            File对象
     */
    private static void showFiles(File file) {
        // 判断file对象时一个文件的话,直接打印这个文件的信息
        if (file.isFile()) {
            info.append(file.getAbsolutePath() + "\r\n");
        } else {
            // 判断file是否为空
            // file.listFiles() 返回值是一个数组 ,没有对应的结果 返回值null
            if (null != file && file.listFiles() != null) {
                // 如果file对象是一个目录的话,要遍历,自己调用自己,再遍历
                for (File f : file.listFiles()) {
                    showFiles(f);
                }
            }
        }

    }

    public static void main(String[] args) {

        // 调用showFile
        File file = new File("E:\\JJA-1801-就业班");
        showFiles(file);

        // info.txt 文件随意命名,只要是一个文件都行
        try {
            FileWriter fw = new FileWriter("e:\\temp\\info.txt");

            // 写入文件write ,其实理解为将文字内容写入缓冲区,如果希望真正写入文件
            // 要么 flush 要么close
            fw.write(info + "");
            // fw.flush();
            // 记得要释放
             fw.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

1.6.13 BufferedWriter:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

测试一下: bufferedWriter和FileWriter的效率:

1.6.14 InputStream:输入流

这里写图片描述
这里写图片描述

1.6.15 FileReader:

1.6.16 BufferedReader:

这里写图片描述
这里写图片描述
这里写图片描述

package filereaderpackage;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TestBufferedReader {

    public static void main(String[] args) {

        // 实例化FileReader对象
        FileReader fr = null;
        try {
            fr = new FileReader("E:\\temp\\t.txt");
            // 实例化BufferedReader
            BufferedReader br = new BufferedReader(fr);
            // 读呗

            // 如果要读取多行数据,请使用循环
            // 如果没有读到数据 null

            // String str = br.readLine();
            String str = null;
            while ((str = br.readLine()) != null) {

                System.out.println(str);
            }

            br.close();

            fr.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

1.6.17 课堂练习:

使用BuffededWriter来实现从控制台输入个人信息[身份证号码,姓名,年龄,择偶标准],保存到文件中;
使用BufferedReader将磁盘的个人信息读取出来

1.6.18 流小结:

这里写图片描述

1.6.19 结构图

这里写图片描述

1.6.20 Collections的sort方法:

这里写图片描述
这里写图片描述
这里写图片描述

1.7 总结:

1) 数据库访问的套路:
2) File:类 功能?常见属性和方法 listFiles();
3) 流的理解 :
4) 输出流: outputstream 从内存到文件
5) 输入流:inputstream 从文件到内存

1.8 作业布置:

预习作业: 序列化 反序列化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值