感觉IO这一块东西很多,要理清楚思路的话觉得太繁琐了,一会继承,一会重写函数,一会又是字段,谁有IO这一块的结构图,就是清楚地反映IO中各个类之间的关系以及函数问题的图表???谢谢了!!!!

解决方案 »

  1.   

    JDK的API文档里面有啊,楼主你去下载一个就行了。
      

  2.   

    楼主自己看吧
    http://blog.csdn.net/tanglinfeng/archive/2009/02/05/3864214.aspx
      

  3.   

    http://blog.csdn.net/imasmallbird/archive/2009/05/08/4161598.aspx
    晕了,具然不会加图片,发到博客里了~~~
      

  4.   

    IO综合案例:package tryIO;
    import java.io.*;
    import java.sql.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import java.util.*;
    public class Sample32_9 extends JFrame implements ListSelectionListener,ActionListener
    {
    //创建菜单栏、菜单以及菜单项
    JMenuBar jmb=new JMenuBar();
    JMenu jm=new JMenu("打开");
    JMenuItem[] jmi={new JMenuItem("添加图片"),new JMenuItem("删除图片"),new JMenuItem("退出")};
    //创建列表框并将列表框放置到滚动窗格中
    JList jl=new JList();
    JScrollPane jspz=new JScrollPane(jl);
    //创建标签并将标签放置到滚动窗格中
    JLabel jlp=new JLabel();
    JScrollPane jspy=new JScrollPane(jlp);
    //创建包含列表框与标签的分割窗格
    JSplitPane jsp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jspz,jspy);
    //创建文件选择器
    JFileChooser jfc=new JFileChooser();
    //声明Connection、Statement以及ResultSet的引用
    Connection con;
    Statement st;
    ResultSet rs;
    //创建用来存放列表数据的向量
    Vector listData=new Vector();
    //创建表示SQL语句的字符串
    String sqlInsert="insert into pictures values(?,?)";
    String sqlDelete="delete from pictures where pname=?";
    String sqlSelect="select pcontent from pictures where pname=?";
    //声明PreparedStatement对象的引用
    PreparedStatement psInsert;
    PreparedStatement psDelete;
    PreparedStatement psSelect;
    //Sample32_9类构造器
    public Sample32_9()
    {
    //通过循环对菜单项进行初始化
    for(int i=0;i<jmi.length;i++)
    {//将菜单项添加进菜单并为其注册监听器
    jm.add(jmi[i]);
    jmi[i].addActionListener(this);
    }
    //将菜单添加进菜单栏,并将菜单栏设置到窗体中
    jmb.add(jm);
    this.setJMenuBar(jmb);
    //将包含列表框与标签的分割窗格添加进窗体
    this.add(jsp,BorderLayout.CENTER);
    //设置分隔条的初始位置以及宽度
    jsp.setDividerLocation(100);
    jsp.setDividerSize(4);
    //设置标签的对齐方式
    jlp.setHorizontalAlignment(JLabel.CENTER);
    jlp.setVerticalAlignment(JLabel.CENTER);
    //设置列表一次只能选中一个选项
    jl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    //为列表框注册监听器
    jl.addListSelectionListener(this);
    //获取数据库连接
    this.getConnection();
    //初始化列表
    this.initList();
    //设置窗体的关闭动作、标题、大小位置以及可见性
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("数据库图片查看器");
    this.setBounds(100,100,500,400);
    this.setVisible(true);
    //为文件选择器设置后缀过滤器
    javax.swing.filechooser.FileFilter  filterJpeg = 
    new javax.swing.filechooser.FileNameExtensionFilter("JPEG文件", "jpg", "jpeg");
    javax.swing.filechooser.FileFilter  filterGif = 
    new javax.swing.filechooser.FileNameExtensionFilter("GIF文件", "gif");
    javax.swing.filechooser.FileFilter  filterPng = 
    new javax.swing.filechooser.FileNameExtensionFilter("PNG文件", "png");
    jfc.removeChoosableFileFilter(jfc.getFileFilter());
    jfc.addChoosableFileFilter(filterJpeg);
    jfc.addChoosableFileFilter(filterGif);
    jfc.addChoosableFileFilter(filterPng);
    }
    //自定义的程序启动时初始化列表的方法
    public void initList()
    {
    try
    {
    //获取Statement对象并查询所有的图片名
    st=con.createStatement();
    rs=st.executeQuery("select pname from pictures");
    //清空列表数据向量
    listData.clear();
    //将结果集中所有的名称添加进向量
    while(rs.next())
    {
    listData.add(rs.getString(1));
    }
    if(listData.isEmpty())
    {//若列表为空则将删除图片菜单项设置为不可用状态
    jmi[1].setEnabled(false);
    }
    //设置列表的数据模型
    jl.setListData(listData);
    //关闭结果集
    rs.close();
    //关闭语句
    st.close();
    }
    catch(Exception e)
    {

    }
    finally
    {//调用此方法释放资源
    this.closeStateResult();
    }
    }
    //获取选中图片文件的方法
    public File getPic()
    {
    //弹出保存对话框
    int i=jfc.showSaveDialog(this);
    if(i==JFileChooser.APPROVE_OPTION)
    {//按下保存按扭
    return jfc.getSelectedFile();
    }
    return null;
    }
    //判断数据库是否存在的方法
    public boolean isDatabaseExists()
    {
    //声明数据库文件目录对应的File对象
    File dbFileDir=new File("pic");
    //返回数据库是否存在的情况
    return dbFileDir.exists();
    }
    //自定义的获取数据库连接的方法
    public void getConnection()
    {
    try
    {
    //测试数据库是否存在
    if(!this.isDatabaseExists())
    {
    //若不存在则创建并连接数据库
    con=DriverManager.getConnection("jdbc:derby:pic;create=true","","");
    //获取Statement对象并在数据库中创建一张表
    st=con.createStatement();
    String str="CREATE TABLE pictures("+
                  "pname VARCHAR(30) PRIMARY KEY,pcontent BLOB)";
    st.execute(str);
    st.close();
    }
    else
    {
    //若数据库存在则连接数据库
    con=DriverManager.getConnection("jdbc:derby:pic","","");
    }
    //初始化三个PrepareStatement对象
    psInsert=con.prepareStatement(sqlInsert);
    psDelete=con.prepareStatement(sqlDelete);
    psSelect=con.prepareStatement(sqlSelect);
    }
    catch(Exception e)
    {

    }
    }
    //实现ListSelectionListener监听接口中的方法
    public void valueChanged(ListSelectionEvent lse)
    {
    //列表选择事件的处理方法
    if(jl.getSelectedIndex()==-1) 
    {
    //若没有列表项被选中则方法返回
    return;
    }
    try
    {
    //获取选中列表项的名称
    String pname=(String)jl.getSelectedValue();
    //设置预编译语句中字段的值
    psSelect.setString(1,pname.trim());
    //提交查询并获取结果集
    rs=psSelect.executeQuery();
    rs.next();
    //从结果集中获取图象的字节数组
    byte[] bb=rs.getBytes(1);
    //为标签设置图标
    this.jlp.setIcon(new ImageIcon(bb));
    }
    catch(Exception ee)
    {

    }
    finally
    {
    this.closeStateResult();
    }
    }
    //实现ActionListener监听接口中的方法
    public void actionPerformed(ActionEvent ae)
    {
    if(ae.getSource()==jmi[0])
    {  /*实现添加图片的功能*/  
    //获取选择的图片文件
    File f=this.getPic();
    if(f!=null)
    {
    //定义FileInputStream以及PreparedStatement对象的引用
    FileInputStream fin=null;
    if(listData.contains(f.getName())) 
    {//若同名的图片在列表中已经存在则抱错
    JOptionPane.showMessageDialog(this,
    "列表中图片的名称不能相同!!!","错误",JOptionPane.ERROR_MESSAGE);
    return;
    }
    try
    {
    //获取图片文件的长度
    long length=f.length();
    //创建byte数组其长度为图片文件的长度
    byte[] bb=new byte[(int)length];
    //创建文件类型字节流对象并为该对象指定源文件
    fin=new FileInputStream(f);
    //读取文件中的数据并存储在byte数组中
    fin.read(bb);
    //设置预编译语句中各个字段的值
    psInsert.setString(1,f.getName());
    psInsert.setBytes(2,bb);
    //执行插入动作
    psInsert.executeUpdate();
    //将文件名添加到列表数据中
    listData.add(f.getName());
    //重新设置列表的数据模型
    jl.setListData(listData);
    //使列表选中最后一行
    jl.setSelectedIndex(listData.size()-1);
    //设置删除图片菜单到可用状态
    jmi[1].setEnabled(true);
    }
    catch(Exception e)
    {

    }
    finally
    {
    try
    {//关闭输入流并释放资源
    fin.close();
    }
    catch(Exception e){}
    }
    }
    }
    else if(ae.getSource()==jmi[1])
    {  /*实现删除图片的功能*/  
    if(jl.getSelectedIndex()==-1) 
    {
    //若没有列表项被选中则方法返回
    return;
    }
    try
    {
    //获取选中列表项的名称
    String pname=(String)jl.getSelectedValue();
    //设置预编译语句中图片名称字段的值
    psDelete.setString(1,pname.trim());
    //提交更新
    psDelete.executeUpdate();
    //将需要删除图片的名称从列表中移除
    listData.remove(jl.getSelectedIndex());
    if(listData.isEmpty())
    {//如果删除后列表为空则将删除图片菜单项设置为不可编辑状态
    jmi[1].setEnabled(false);
    }
    //将窗体右侧的图片去除
    jlp.setIcon(null);
    }
    catch(Exception ee)
    {

    }
    }
    else if(ae.getSource()==jmi[1])
    {//安全退出程序
    System.exit(0);
    }
    }
    //自定义的关闭结果集的方法
    public void closeStateResult()
    {
    try
    {//关闭结果集
    rs.close();
    }
    catch(Exception e)
    {

    }
    }
    public static void main(String args[])
    {
    //创建Sample32_9窗体对象
    new Sample32_9();
    }
    }
      

  5.   

    类体系:
    不过看看thinking in java中io这一章,写的很好。
      

  6.   

    楼主参考一下这个系列博客吧,讲的不错
    thinking in java中的io体系(1) thinking in java中的io体系(2) java中的io体系(3)java中的io体系(4)java中的io体系(5)希望对楼主有帮助
      

  7.   

    够直观
    TIJ我看了
    确实不错
    推荐@@!!!
      

  8.   

    还有一个最最常用的方法
    也是所有java程序员必备的
    java的 API,查看一下就会很清楚了
    里面已经把关系以树的形式显示出来
    还有方法的介绍
      

  9.   

    Java code
    package tryIO;
    import java.io.*;
    import java.sql.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import java.util.*;
    public class Sample32_9 extends JFrame implements ListSelectionListener,ActionListener
    {
        //创建菜单栏、菜单以及菜单项
        JMenuBar jmb=new JMenuBar();
        JMenu jm=new JMenu("打开");
        JMenuItem[] jmi={new JMenuItem("添加图片"),new JMenuItem("删除图片"),new JMenuItem("退出")};
        //创建列表框并将列表框放置到滚动窗格中    
        JList jl=new JList();
        JScrollPane jspz=new JScrollPane(jl);
        //创建标签并将标签放置到滚动窗格中    
        JLabel jlp=new JLabel();
        JScrollPane jspy=new JScrollPane(jlp);
        //创建包含列表框与标签的分割窗格
        JSplitPane jsp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jspz,jspy);
        //创建文件选择器
        JFileChooser jfc=new JFileChooser();
        //声明Connection、Statement以及ResultSet的引用
        Connection con;
        Statement st;
        ResultSet rs;
        //创建用来存放列表数据的向量
        Vector listData=new Vector();
        //创建表示SQL语句的字符串
        String sqlInsert="insert into pictures values(?,?)";
        String sqlDelete="delete from pictures where pname=?";
        String sqlSelect="select pcontent from pictures where pname=?";
        //声明PreparedStatement对象的引用
        PreparedStatement psInsert;
        PreparedStatement psDelete;
        PreparedStatement psSelect;
        //Sample32_9类构造器
        public Sample32_9()
        {
            //通过循环对菜单项进行初始化
            for(int i=0;i<jmi.length;i++)
            {//将菜单项添加进菜单并为其注册监听器
                jm.add(jmi[i]);
                jmi[i].addActionListener(this);
            }
            //将菜单添加进菜单栏,并将菜单栏设置到窗体中
            jmb.add(jm);
            this.setJMenuBar(jmb);
            //将包含列表框与标签的分割窗格添加进窗体
            this.add(jsp,BorderLayout.CENTER);
            //设置分隔条的初始位置以及宽度
            jsp.setDividerLocation(100);
            jsp.setDividerSize(4);
            //设置标签的对齐方式
            jlp.setHorizontalAlignment(JLabel.CENTER);
            jlp.setVerticalAlignment(JLabel.CENTER);
            //设置列表一次只能选中一个选项
            jl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            //为列表框注册监听器
            jl.addListSelectionListener(this);
            //获取数据库连接
            this.getConnection();
            //初始化列表
            this.initList();        
            //设置窗体的关闭动作、标题、大小位置以及可见性
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setTitle("数据库图片查看器");
            this.setBounds(100,100,500,400);
            this.setVisible(true);
            //为文件选择器设置后缀过滤器
            javax.swing.filechooser.FileFilter  filterJpeg = 
            new javax.swing.filechooser.FileNameExtensionFilter("JPEG文件", "jpg", "jpeg");
            javax.swing.filechooser.FileFilter  filterGif = 
            new javax.swing.filechooser.FileNameExtensionFilter("GIF文件", "gif");
            javax.swing.filechooser.FileFilter  filterPng = 
            new javax.swing.filechooser.FileNameExtensionFilter("PNG文件", "png");                
            jfc.removeChoosableFileFilter(jfc.getFileFilter());
            jfc.addChoosableFileFilter(filterJpeg);
            jfc.addChoosableFileFilter(filterGif);
            jfc.addChoosableFileFilter(filterPng);
        }
        //自定义的程序启动时初始化列表的方法
        public void initList()
        {
            try
            {
                //获取Statement对象并查询所有的图片名
                st=con.createStatement();
                rs=st.executeQuery("select pname from pictures");
                //清空列表数据向量
                listData.clear();
                //将结果集中所有的名称添加进向量
                while(rs.next())
                {
                    listData.add(rs.getString(1));
                }
                if(listData.isEmpty())
                {//若列表为空则将删除图片菜单项设置为不可用状态
                    jmi[1].setEnabled(false);
                }
                //设置列表的数据模型
                jl.setListData(listData);
                //关闭结果集
                rs.close();
                //关闭语句
                st.close();
            }
            catch(Exception e)
            {
                
            }
            finally
            {//调用此方法释放资源
                this.closeStateResult();
            }
        }    
        //获取选中图片文件的方法
        public File getPic()
        {
            //弹出保存对话框
            int i=jfc.showSaveDialog(this);
            if(i==JFileChooser.APPROVE_OPTION)
            {//按下保存按扭
                    return jfc.getSelectedFile();    
            }
            return null;
        }    
        //判断数据库是否存在的方法
        public boolean isDatabaseExists()
        {
            //声明数据库文件目录对应的File对象
            File dbFileDir=new File("pic");
            //返回数据库是否存在的情况
            return dbFileDir.exists();
        }    
        //自定义的获取数据库连接的方法
        public void getConnection()
        {
            try
            {
                //测试数据库是否存在
                if(!this.isDatabaseExists())
                {
                    //若不存在则创建并连接数据库
                    con=DriverManager.getConnection("jdbc:derby:pic;create=true","","");
                    //获取Statement对象并在数据库中创建一张表
                    st=con.createStatement();
                    String str="CREATE TABLE pictures("+
                                  "pname VARCHAR(30) PRIMARY KEY,pcontent BLOB)";
                    st.execute(str);
                    st.close();
                }
                else
                {
                    //若数据库存在则连接数据库
                    con=DriverManager.getConnection("jdbc:derby:pic","","");
                }
                //初始化三个PrepareStatement对象
                psInsert=con.prepareStatement(sqlInsert);
                psDelete=con.prepareStatement(sqlDelete);
                psSelect=con.prepareStatement(sqlSelect);
            }
            catch(Exception e)
            {
                
            }
        }    
        //实现ListSelectionListener监听接口中的方法
        public void valueChanged(ListSelectionEvent lse)
        {
            //列表选择事件的处理方法
            if(jl.getSelectedIndex()==-1) 
            {
                //若没有列表项被选中则方法返回
                return;
            }
            try
            {
                //获取选中列表项的名称
                String pname=(String)jl.getSelectedValue();
                //设置预编译语句中字段的值
                psSelect.setString(1,pname.trim());
                //提交查询并获取结果集
                rs=psSelect.executeQuery();
                rs.next();
                //从结果集中获取图象的字节数组
                byte[] bb=rs.getBytes(1);
                //为标签设置图标
                this.jlp.setIcon(new ImageIcon(bb));
            }
            catch(Exception ee)
            {
                
            }
            finally
            {
                this.closeStateResult();
            }            
        }
        //实现ActionListener监听接口中的方法
        public void actionPerformed(ActionEvent ae)
        {
            if(ae.getSource()==jmi[0])
            {  /*实现添加图片的功能*/  
                //获取选择的图片文件
                File f=this.getPic();
                if(f!=null)
                {
                    //定义FileInputStream以及PreparedStatement对象的引用
                    FileInputStream fin=null;
                    if(listData.contains(f.getName())) 
                    {//若同名的图片在列表中已经存在则抱错
                        JOptionPane.showMessageDialog(this,
                        "列表中图片的名称不能相同!!!","错误",JOptionPane.ERROR_MESSAGE);
                        return;
                    }
                    try
                    {
                        //获取图片文件的长度
                        long length=f.length();
                        //创建byte数组其长度为图片文件的长度
                        byte[] bb=new byte[(int)length];
                        //创建文件类型字节流对象并为该对象指定源文件
                        fin=new FileInputStream(f);
                        //读取文件中的数据并存储在byte数组中
                        fin.read(bb);
                        //设置预编译语句中各个字段的值
                        psInsert.setString(1,f.getName());
                        psInsert.setBytes(2,bb);
                        //执行插入动作
                        psInsert.executeUpdate();
                        //将文件名添加到列表数据中
                        listData.add(f.getName());
                        //重新设置列表的数据模型
                        jl.setListData(listData);
                        //使列表选中最后一行
                        jl.setSelectedIndex(listData.size()-1);
                        //设置删除图片菜单到可用状态
                        jmi[1].setEnabled(true);
                    }
                    catch(Exception e)
                    {
                    
                    }
                    finally
                    {
                        try
                        {//关闭输入流并释放资源
                            fin.close();    
                        }
                        catch(Exception e){}
                    }
                }        
            }
            else if(ae.getSource()==jmi[1])
            {  /*实现删除图片的功能*/  
                if(jl.getSelectedIndex()==-1) 
                {
                    //若没有列表项被选中则方法返回
                    return;
                }
                try
                {
                    //获取选中列表项的名称
                    String pname=(String)jl.getSelectedValue();
                    //设置预编译语句中图片名称字段的值
                    psDelete.setString(1,pname.trim());
                    //提交更新
                    psDelete.executeUpdate();
                    //将需要删除图片的名称从列表中移除
                    listData.remove(jl.getSelectedIndex());
                    if(listData.isEmpty())
                    {//如果删除后列表为空则将删除图片菜单项设置为不可编辑状态
                        jmi[1].setEnabled(false);
                    }
                    //将窗体右侧的图片去除
                    jlp.setIcon(null);
                }
                catch(Exception ee)
                {
                    
                }
            }
            else if(ae.getSource()==jmi[1])
            {//安全退出程序
                System.exit(0);
            }
        }
        //自定义的关闭结果集的方法
        public void closeStateResult()
        {
            try
            {//关闭结果集
                rs.close();
            }
            catch(Exception e)
            {
                
            }
        }
        public static void main(String args[])
        {
            //创建Sample32_9窗体对象
            new Sample32_9();
        }
    }
      

  10.   

    引用楼主 WYhack 的帖子:
    感觉IO这一块东西很多,要理清楚思路的话觉得太繁琐了,一会继承,一会重写函数,一会又是字段,谁有IO这一块的结构图,就是清楚地反映IO中各个类之间的关系以及函数问题的图表???谢谢了!!!! 
    楼主参考一下这个系列博客吧,讲的不错 
    thinking in java中的io体系(1) thinking in java中的io体系(2) java中的io体系(3) java中的io体系(4) java中的io体系(5) 
      

  11.   

    引用楼主 WYhack 的帖子:
    感觉IO这一块东西很多,要理清楚思路的话觉得太繁琐了,一会继承,一会重写函数,一会又是字段,谁有IO这一块的结构图,就是清楚地反映IO中各个类之间的关系以及函数问题的图表???谢谢了!!!! 
    楼主参考一下这个系列博客吧,讲的不错 
    thinking in java中的io体系(1) thinking in java中的io体系(2) java中的io体系(3) java中的io体系(4) java中的io体系(5)