Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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 “为什么?”;字符串";。getBytes()的工作方式因操作系统而异_Java_Linux_Unix_Binary_Ebcdic - Fatal编程技术网

Java “为什么?”;字符串";。getBytes()的工作方式因操作系统而异

Java “为什么?”;字符串";。getBytes()的工作方式因操作系统而异,java,linux,unix,binary,ebcdic,Java,Linux,Unix,Binary,Ebcdic,我正在运行下面的代码,我从“some_string”.getBytes()中得到了不同的结果,这取决于我是在Windows还是Unix中。这个问题发生在任何字符串上(我尝试了一个非常简单的ABC和相同的问题) 请参阅控制台中打印的以下差异 下面的代码使用Java7进行了很好的测试。如果您完全复制它,它将运行 此外,请参见下面两个图像中十六进制的差异。前两个图像显示在Windows中创建的文件。您可以分别使用ANSI和EBCDIC查看十六进制值。第三个图像(黑色图像)来自Unix。您可以查看十六进

我正在运行下面的代码,我从“some_string”.getBytes()中得到了不同的结果,这取决于我是在Windows还是Unix中。这个问题发生在任何字符串上(我尝试了一个非常简单的ABC和相同的问题)

请参阅控制台中打印的以下差异

下面的代码使用Java7进行了很好的测试。如果您完全复制它,它将运行

此外,请参见下面两个图像中十六进制的差异。前两个图像显示在Windows中创建的文件。您可以分别使用ANSI和EBCDIC查看十六进制值。第三个图像(黑色图像)来自Unix。您可以查看十六进制(-c选项)还有我认为是EBCDIC的可读字符

所以,我的直截了当的问题是:既然我在这两种情况下都使用Java 7,为什么这些代码的工作方式会有所不同?我应该在某个地方检查任何特定的属性吗?也许,Windows中的Java会获得某种默认格式,而Unix中的Java会获得另一种。如果是,我必须检查或设置哪个属性

Unix控制台:

$ ./java -cp /usr/test.jar test.mainframe.read.test.TestGetBytes
H = 76 - L
< wasn't found
$。/java-cp/usr/test.jar test.mainframe.read.test.TestGetBytes
H=76-L
<没有找到
Windows控制台:

H = 60 - <
H1 = 69 - E
H2 = 79 - O
H3 = 77 - M
H4 = 62 - >
End of Message found
H=60-<
H1=69-E
H2=79-O
H3=77-M
H4=62->
找到邮件结尾
整个代码:

package test.mainframe.read.test;

import java.util.ArrayList;

public class TestGetBytes {

       public static void main(String[] args) {
              try {
                     ArrayList ipmMessage = new ArrayList();
                     ipmMessage.add(newLine());

                     //Windows Path
                     writeMessage("C:/temp/test_bytes.ipm", ipmMessage);
                     reformatFile("C:/temp/test_bytes.ipm");
                     //Unix Path
                     //writeMessage("/usr/temp/test_bytes.ipm", ipmMessage);
                     //reformatFile("/usr/temp/test_bytes.ipm");
              } catch (Exception e) {

                     System.out.println(e.getMessage());
              }
       }

       public static byte[] newLine() {
              return "<EOM>".getBytes();
       }

       public static void writeMessage(String fileName, ArrayList ipmMessage)
                     throws java.io.FileNotFoundException, java.io.IOException {

              java.io.DataOutputStream dos = new java.io.DataOutputStream(
                           new java.io.FileOutputStream(fileName, true));
              for (int i = 0; i < ipmMessage.size(); i++) {
                     try {
                           int[] intValues = (int[]) ipmMessage.get(i);
                           for (int j = 0; j < intValues.length; j++) {
                                  dos.write(intValues[j]);
                           }
                     } catch (ClassCastException e) {
                           byte[] byteValues = (byte[]) ipmMessage.get(i);
                           dos.write(byteValues);
                     }
              }
              dos.flush();
              dos.close();

       }

       // reformat to U1014
       public static void reformatFile(String filename)
                     throws java.io.FileNotFoundException, java.io.IOException {
              java.io.FileInputStream fis = new java.io.FileInputStream(filename);
              java.io.DataInputStream br = new java.io.DataInputStream(fis);

              int h = br.read();
              System.out.println("H = " + h + " - " + (char)h);

              if ((char) h == '<') {// Check for <EOM>

                     int h1 = br.read();
                     System.out.println("H1 = " + h1 + " - " + (char)h1);
                     int h2 = br.read();
                     System.out.println("H2 = " + h2 + " - " + (char)h2);
                     int h3 = br.read();
                     System.out.println("H3 = " + h3 + " - " + (char)h3);
                     int h4 = br.read();
                     System.out.println("H4 = " + h4 + " - " + (char)h4);
                     if ((char) h1 == 'E' && (char) h2 == 'O' && (char) h3 == 'M'
                                  && (char) h4 == '>') {
                           System.out.println("End of Message found");
                     }
                     else{
                           System.out.println("EOM not found but < was found");
                     }
              }
              else{
                     System.out.println("< wasn't found");
              }
       }
}
package test.mainframe.read.test;
导入java.util.ArrayList;
公共类TestGetBytes{
公共静态void main(字符串[]args){
试一试{
ArrayList ipmMessage=新的ArrayList();
添加(换行符());
//窗口路径
写消息(“C:/temp/test_bytes.ipm”,ipm消息);
重新格式化文件(“C:/temp/test_bytes.ipm”);
//Unix路径
//写消息(“/usr/temp/test_bytes.ipm”,ipm消息);
//重新格式化文件(“/usr/temp/test_bytes.ipm”);
}捕获(例外e){
System.out.println(e.getMessage());
}
}
公共静态字节[]换行(){
返回“.getBytes();
}
公共静态void writeMessage(字符串文件名、ArrayList消息)
抛出java.io.FileNotFoundException,java.io.IOException{
java.io.DataOutputStream dos=新的java.io.DataOutputStream(
新的java.io.FileOutputStream(文件名,true));
对于(int i=0;i
调用
getBytes()
时,您没有指定字符集,因此它使用基础平台的默认字符集(如果在Java启动时指定,则使用Java本身的默认字符集)。如下所述:

公共字节[]getBytes()

使用平台的默认字符集将此字符串编码为字节序列,并将结果存储到新的字节数组中

getBytes()
有一个重载版本,允许您在代码中指定字符集

公共字节[]getBytes(字符集字符集)

使用给定的字符集将该字符串编码为字节序列,并将结果存储到新的字节数组中


在Windows上,默认字符集很可能是cp1252(或特定于国家/地区的字符集)。许多Linux使用UTF08。在大型机上,我想可能只有西方国家才使用cp1252。世界各地使用了许多Ansi字符集,并且有许多Windows代码页。不要假设cp1252,请根据您的实际需要明确说明。谢谢。这是我第一次使用大型机,老实说,我从未使用过d在Windows世界中设置字符集。我在提出建议后解决了这个问题,这确实是我问题的答案。顺便说一句,如果你能在这个论坛上向我推荐一些文章或问题,阅读字符集的真正含义,我将感激不尽。在我工作的大型机中,字符集是IBM1047(我在打印java.nio.charset.charset.defaultcharset时得到了这个问题)。通过在getBytes()中传递org.apache.commons.io.Charsets.UTF_8解决了这个问题。我发现奇怪的是,我在java.nio中找不到相同的常量。@JimC:java有一个类,你可以使用
StandardCharsets.UTF_8
。偶数声明:“不推荐使用java 7的标准字符集”@JimC:关于字符集的文章,请参阅。