重新认识Java-I/O流

Posted sjjava

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重新认识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: 
" + 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);
    }
}

 

以上是关于重新认识Java-I/O流的主要内容,如果未能解决你的问题,请参考以下文章

Java-I/O输入输出

java-I/O-bmp-反色,单原色输出

如何清除片段中的参数?

java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段

OnDetach/onAttach 片段重新创建片段活动