
# 通过本地文件导入导出数据
在使用JAVA语言基于GaussDB数据库进行二次开发时，可以使用CopyManager接口，通过流方式将数据库中的数据导出到本地文件或者将本地文件导入数据库中，文件支持CSV、TEXT等格式。
代码运行的前提条件：在数据库中创建表migration_table和migration_table_1，并在migration_table表中插入数据。
非透明多写特性下的示例
```
// 认证用的用户名和密码直接写到代码中有很大的安全风险，建议在配置文件或者环境变量中存放（密码应密文存放，使用时解密），确保安全。
// 本示例以用户名和密码保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量（环境变量名称请根据自身情况进行设置）EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。
// $ip、$port、database需要用户自行修改。
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.io.IOException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.SQLException; 
import com.huawei.gaussdb.jdbc.copy.CopyManager; 
import com.huawei.gaussdb.jdbc.core.BaseConnection;
 
public class Copy {
    public static void main(String[] args) {
        String urls = new String("jdbc:gaussdb://$ip:$port/database"); //数据库URL
        String username = System.getenv("EXAMPLE_USERNAME_ENV");           //用户名
        String password = System.getenv("EXAMPLE_PASSWORD_ENV");             //密码
        String tablename = new String("migration_table"); //定义表信息
        String tablename1 = new String("migration_table_1"); //定义表信息
        String driver = "com.huawei.gaussdb.jdbc.Driver";
        Connection conn = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(urls, username, password); //以非加密方式连接数据库
        } catch (ClassNotFoundException e) {
            e.printStackTrace(System.out);
        } catch (SQLException e) {
            e.printStackTrace(System.out);
        }
        // 将SELECT * FROM migration_table查询结果导出到本地文件d:/data.txt中。
        try {
            copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)");
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //将d:/data.txt中的数据导入到migration_table_1中。
        try {
            copyFromFile(conn, "d:/data.txt", tablename1);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 将migration_table_1中的数据导出到本地文件d:/data1.txt中。
        try {
            copyToFile(conn, "d:/data1.txt", tablename1);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // 使用copyIn把数据从文件中导入数据库。
    public static void copyFromFile(Connection connection, String filePath, String tableName)
        throws SQLException, IOException {
        FileInputStream fileInputStream = null;
        try {
            CopyManager copyManager = new CopyManager((BaseConnection) connection);
            fileInputStream = new FileInputStream(filePath);
            copyManager.copyIn("COPY " + tableName + " FROM STDIN", fileInputStream);
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    // 使用copyOut把数据从数据库中导出到文件中。
    public static void copyToFile(Connection connection, String filePath, String tableOrQuery)
        throws SQLException, IOException {
        FileOutputStream fileOutputStream = null;
        try {
            CopyManager copyManager = new CopyManager((BaseConnection) connection);
            fileOutputStream = new FileOutputStream(filePath);
            copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT", fileOutputStream);
        } finally {
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
```
上述2个示例的运行结果为：本地d盘两个文件data.txt和data1.txt、数据库表migration_table_1，和数据库表migration_table数据相同。
