重新认识Java-I/O流

  记录一下在工作中遇到的一些有意思的问题,在之前系统学习过Java的IO流,但是在工作中长时间没有用到导致在这几天的一个需求中抓瞎了,查了好一会的资料耽误了一段时间,好了废话不多说,下面简单讲一下需求。

  需求是这样的,数据库中有一张数据表的一个BLOB字段中存放了一个excel文件,我需要将这个文件放到服务器指定的文件夹下面。思路是这样的:1、在指定文件夹下面创建excel文件。2、jdbc取出数据库中的文件。3、各自转换为输入输出流将数据库中的文件数据导入到指定文件内。下面是代码:

  

package helloTest;

import com.fr.base.FRContext;
import com.fr.data.AbstractTableData;
import com.fr.general.data.TableDataException;
import com.fr.third.org.apache.poi.hssf.usermodel.HSSFSheet;
import com.fr.third.org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class ReadFile {
    private static PreparedStatement ps;

    /**
     * 读取保存在数据库中的文件到指定服务器文件夹下的文件
     * @auther SunJ 20190912
     * @param id
     * @return java.io.File
     */

    public File getFile(String id){
        String sql = " select filedata from credit.filedata where id = ? ";
        FRContext.getLogger().info("Query SQL of ParamTableDataDemo: \n" + sql);
        Connection conn = getConnection();
        File file = new File("D:\\root\\EFS\\data.xls");
        try {

            OutputStream outputStream = new FileOutputStream(file);
            ps = conn.prepareStatement(sql);
            ps.setString(1, id);
            ResultSet rs = ps.executeQuery();
            InputStream in = null;//文件数据输入流
            while (rs.next()) {
                in = rs.getBlob(1).getBinaryStream();
            }
            byte[] b = new byte[1024];
            int len = 0;
            while ( (len = in.read(b)) != -1) {
                outputStream.write(b, 0, len);//数据写入指定文件内
            }
            outputStream.close();
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return file;
    }

    /**
     * 读取服务器文件。
     * @auther SunJ 20190912
     * @return boolean
     */
    public boolean inputDataToDb(String filePath){
        filePath = "D:\\root\\EFS\\data.xls";
        try {
            InputStream is = new FileInputStream(filePath);
            HSSFWorkbook excel = new HSSFWorkbook(is);
            for (int numSheet = 0; numSheet < excel.getNumberOfSheets(); numSheet++) {
                HSSFSheet sheet = excel.getSheetAt(numSheet);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 建立数据库连接
     * @auther SunJ 20190912
     * @return java.sql.Connection
     */
    public Connection getConnection() {

        String driverName = "oracle.jdbc.driver.OracleDriver";
        String url = "jdbc:oracle:thin:@10.116.50.123:1521/test";
        String username = "";
        String password = "";
        Connection con;
        try {
            Class.forName(driverName);
            con = DriverManager.getConnection(url, username, password);

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return con;
    }

    public static void main(String[] args) {
        ReadFile ReadFile = new ReadFile();
        File file = ReadFile.getFile("b3448e077f3f4b229f30a86c604e23ab");
        System.out.println(file);
    }
}

原文地址:https://www.cnblogs.com/sjjava/p/11518768.html

时间: 2024-11-07 03:25:33

重新认识Java-I/O流的相关文章

Java 之IO流及应用

IO流 IO流概述及FileWriter类的使用 FileReader类使用 缓冲流介绍和使用 IO流相关案例 NO.one IO流概述及FileWriter类使用 1.1 IO流概述及分类 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流 1.2 FileWriter类使用 A:打开帮助文档 B:点击显示,找到索引,看到输入框 C:你要学习什么内容,你就在框框里面输入什么内容 举例:Random D:看包

Java基础-IO流

简单的使用IO流是很简单的~ package com.j2se.d59.demo; import java.io.*; //IO里的对象来自于java.io.*; //IO流的输入输出是相对于内存RAM的 //分类:单位[字节流.字符流]or方向[输入流.输出流]or功能[节点流.处理流] //所有的IO流由四个抽象类扩展而来: //InputStream 的子类 FileInputStream BufferedInputStream //OutputStream 的子类FileInputStr

Java I/O流操作(二)---缓冲流[转]

转自:http://blog.csdn.net/johnny901114/article/details/8710403 一.BufferWriter类 IO的缓冲区的存在就是为了提高效率,把要操作的数据放进缓冲区,然后一次性把缓冲区的内容写到目的地,而不是写一次就往目的地写一次. 在这里要注意的是当我们关闭了缓冲区对象实际也关闭了与缓冲区关联的流对象. BufferWriter类 try { FileWriter fw =new FileWriter("test.txt"); //使

黑马程序员——Java I/O流基础知识点(File类)

File工具 File类就是用俩将文件或者文件夹封装对象,弥补流对象的不足--流只能操作数据,不能操作文件夹的 封装的是路径!!! 构造方法演示 1.可以将已有的未出现的文件或者文件夹封装成对象. File f1=new File("c:\\abc\\a.txt"): File f2=new File("d:\\abc","ab.txt"打印,会打印路径.:目录分隔符,为了更好地跨平台File. File类常见功能 1,创建 createNewF

Java中IO流

* IO流用来处理设备之间的数据传输 * Java对数据的操作是通过流的方式 * Java用于操作流的类都在IO包中 * 流按流向分为两种:输入流,输出流. * 流按操作类型分为两种: * 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的 * 字符流 : 字符流只能操作纯字符数据,比较方便. 字节流 |--InputStream(字节输入流,字节流的抽象父类,抽象类不能直接创建对象,必须使用子类) |--FileInputStream(文件字节输入流,就是以字节的

Java IO包装流如何关闭?

http://www.cnblogs.com/qqzy168/p/3670915.html —————————————————————————————————————————————————————— 问题: (1)JAVA的IO流使用了装饰模式,关闭最外面的流的时候会自动调用被包装的流的close()方吗? (2)如果按顺序关闭流,是从内层流到外层流关闭还是从外层到内存关闭? 问题(1)解释: 如下例子代码: FileInputStream is = new FileInputStream("

理解Java中字符流与字节流的区别

1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序列的对象被称为输入流:能够向其写入一个字节序列的对象被称为输出流. 2. 字节流 Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据.Java中最基本的两个字节流类是InputStream和OutputStream,它们分别代表了组基本的输入字节流和输出字节流.InputStre

【转】输入/输出流 - 深入理解Java中的流 (Stream)

基于流的数据读写,太抽象了,什么叫基于流,什么是流?Hadoop是Java语言写的,所以想理解好Hadoop的Streaming Data Access,还得从Java流机制入手.流机制也是JAVA及C++中的一个重要的机制,通过流使我们能够自由地操作包括文件,内存,IO设备等等中的数据. 首先,流是什么? 流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行.设备可以是文件,网络,内存等. 流具有方向性,至于是输入流还是输出流则是一个相对的概

Java API —— IO流

1.IO流概述 · IO流用来处理设备之间的数据传输 · 上传文件和下载文件 · Java对数据的操作是通过流的方式 · Java用于操作流的对象都在IO包中 2.IO流分类 1)按照数据流向 输入流     读入数据 输出流     写出数据 2) 按照数据类型 字节流: 字节输入流 读取数据 InputStream 字节输出流 写出数据 OutputStream 字符流: 字符输入流 读取数据 Reader 字符输出流 写出数据 Writer 3)什么情况下使用哪种流呢? 如果数据所在的文件

Java中IO流的介绍

一.流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等.       一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL.        流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流.用户可以从输入流中读取信息,但不能写它.相反,对输出流,只能往输入流写,而不能读它.       实际上,流的源端和目