Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java应用程序到大型机数据集的FTP-带开/闭括号的问题_Java_Character Encoding_Ftp_Mainframe_Apache Commons Net - Fatal编程技术网

从Java应用程序到大型机数据集的FTP-带开/闭括号的问题

从Java应用程序到大型机数据集的FTP-带开/闭括号的问题,java,character-encoding,ftp,mainframe,apache-commons-net,Java,Character Encoding,Ftp,Mainframe,Apache Commons Net,解决方案:除了按照Bruce Martin的回答将charset/codepage设置为cp037之外,我还必须更改FTP逻辑中的设置(使用apache commons net)。我必须将文件类型设置为EBCDIC。这里有一些示例代码来说明我在做什么 public FTPClient openFTPConnection() { String server = [server]; int port = [port]; int reply; FTPClient ftp

解决方案:除了按照Bruce Martin的回答将charset/codepage设置为cp037之外,我还必须更改FTP逻辑中的设置(使用apache commons net)。我必须将文件类型设置为EBCDIC。这里有一些示例代码来说明我在做什么

public FTPClient openFTPConnection() {
    String server = [server];
    int port = [port];
    int reply;
    FTPClient ftpClient = new FTPClient();
    ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
    try {
        ftpClient.connect(server, port);
        reply = ftpClient.getReplyCode();
        System.out.println(reply);
        if (!FTPReply.isPositiveCompletion(reply)) {
            System.out.println(reply);
            ftpClient.disconnect();
            throw new Exception("Exception in connecting to FTP Server");
        }
        ftpClient.login(user, pass);
        ftpClient.setFileType(FTP.EBCDIC_FILE_TYPE); 
        //Previously, this was set to FTP.ASCII_FILE_TYPE
        ftpClient.enterLocalPassiveMode();
    } catch (Exception e) {
        System.out.println("Error: " + e.getMessage());
        e.printStackTrace();
    }
    return ftpClient;
}
public List ftpStoreAuthData(FTPClient ftpClient) {
    try {
        String mainframeDataSet = [dataset];
        InputStream stream = ftpClient.retrieveFileStream(mainframeDataSet);
        logger.trace("Retrieving mainframe data set...");
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "cp037"));
                                                   //Previously, this was set to "utf-8"
        logger.trace("Data set Retrieved!");
        String datasetText;
        while((datasetText = reader.readLine()) != null) {
             //do things with dataset records
        }
        return new ArrayList<>();
    }
public FTPClient openFTPConnection(){
字符串服务器=[server];
int port=[port];
int回复;
FTPClient FTPClient=新的FTPClient();
ftpClient.addProtocolCommandListener(新的PrintCommandListener(新的PrintWriter(System.out)));
试一试{
ftpClient.connect(服务器、端口);
reply=ftpClient.getReplyCode();
System.out.println(回复);
如果(!FTPReply.isPositiveCompletion(回复)){
System.out.println(回复);
ftpClient.disconnect();
抛出新异常(“连接到FTP服务器时出现异常”);
}
ftpClient.login(用户,通过);
ftpClient.setFileType(FTP.EBCDIC\u文件类型);
//以前,这被设置为FTP.ASCII_FILE_类型
ftpClient.enterLocalPassiveMode();
}捕获(例外e){
System.out.println(“错误:+e.getMessage());
e、 printStackTrace();
}
返回ftpClient;
}
公共列表ftpStoreAuthData(FTP客户端FTP客户端){
试一试{
字符串mainframeDataSet=[dataset];
InputStream stream=ftpClient.retrieveFileStream(mainframeDataSet);
trace(“检索大型机数据集…”);
BufferedReader=新的BufferedReader(新的InputStreamReader(流,“cp037”));
//在此之前,它被设置为“utf-8”
trace(“检索到的数据集!”);
字符串数据集文本;
而((datasetText=reader.readLine())!=null){
//处理数据集记录
}
返回新的ArrayList();
}
我正在用Java开发一个REST应用程序。我的一个REST端点向大型机发出FTP请求,并检索其中包含“[”和“]”字符的数据集

我尝试过使用ApacheCommonsNet和Spring的sftpsessionfactory FTP库�s、 当我从检索的数据集中读取每条记录时,会有一个if条件检查某个特定记录是否包含“[”或“]”字符,显然它失败了

作为一种黑客,我更改了if条件,以便它检查�这是一个很好的解决方法。这种解决方法的问题是,当我最终将数据集FTPing回大型机时,它最终会成为一个问题。我会覆盖�,但当文件到达大型机时,左括号显示为“Ý”,右括号显示为“;”。我在大型机上使用“HEX ON”命令查看所需的开/关括号和发送它的开/关括号之间的区别

我发送的开放括号(Ý)有十六进制值AD。 数据集所需的开括号具有十六进制值BA

我发送的结束括号(())具有十六进制值BD。 数据集所需的结束括号具有十六进制值BB

如何写入括号以匹配数据集所需的十六进制值?如何使括号不显示为�什么时候检索数据集?我听说这个问题与不同的EBCDIC代码页转换有关,这很好,但我不确定如何解决这个问题


如果您需要查看我的FTP代码,请告诉我。如果需要,我可以发布它。

您可以使用适当的EBCDIC字符集IBM037/CP037是美国EBCDIC。还有很多其他字符集,例如cp273在德国/奥地利使用

你能行

    Reader r = new InputStreamReader(in, "cp037");
    String s = new String(bytes, "cp037");
       // or for 3 spaces
    String spaces = new String(new byte[] {40, 40, 40}, "cp037");

要读取EBCDIC流/将数组字节转换为文本

是的,代码页问题。什么以十六进制代码开始,并给出“[”最后是一个十六进制代码,它给出了其他一些东西。是的,ftp代码。谢谢!我会将此标记为正确答案,但在我的ftp代码中还有一个配置我也必须这样做。在将inputstream的字符集/代码页设置为cp037的基础上,我必须将ftp传输模式设置为EBCDIC_FILE_TYPE。我已经更新了我的问题,以显示代码fIBM-1140、IBM-1141与cp037(美国EBCDIC)、cp273(德国EBCDIC)相似,但带有欧元字符。如果数据包含欧元字符,这将非常有用。