本文介绍了为什么" STRING" .getBytes()根据操作系统的不同工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我运行下面的code和我正在从some_string.getBytes取决于如果我在Windows或Unix不同的结果()。问题情况与(我试过一个很简单的ABC和同样的问题,任何字符串。

参见下面印在控制台的差异。

下code是用Java 7.如果你把它复制完全它将运行良好测试。

此外,请参见下面的两张图片以十六进制的差异。前两个图像显示在Windows中创建的文件。您可以分别看到ANSI和EBCDIC的十六进制值。第三个形象,黑色的,是从Unix。你可以看到十六进制(-c选项)和字符阅读中,我相信这是EBCDIC。

所以,我直接的问题是:为什么这样code的工作不同,因为我只是在这两个案例中使用Java 7?我应该检查某处任何especific财产?也许,Java的Windows中得到一定的默认格式,在Unix中它得到另一个。如果是这样,这属性必须我检查或settup?

Unix的控制台:

  $ ./java -cp /usr/test.jar test.mainframe.read.test.TestGetBytes
H = 76 L -
<未发现

Windows控制台:

  H = 60  - <
H1 = 69 - 电子
H2 = 79 - Ø
H3 = 77 - 中号
H4 = 62 - >
邮件结尾处找到

整个code:

 包test.mainframe.read.test;进口的java.util.ArrayList;公共类TestGetBytes {       公共静态无效的主要(字串[] args){
              尝试{
                     ArrayList的ipmMessage =新的ArrayList();
                     ipmMessage.add(行());                     // Windows路径
                     的WriteMessage(C:/temp/test_bytes.ipm,ipmMessage);
                     reformatFile(C:/temp/test_bytes.ipm);
                     // UNIX路径
                     //writeMessage(\"/usr/temp/test_bytes.ipm,ipmMessage);
                     //reformatFile(\"/usr/temp/test_bytes.ipm);
              }赶上(例外五){                     的System.out.println(e.getMessage());
              }
       }       公共静态的byte []行(){
              返回<&EOM GT;的getBytes()。
       }       公共静态无效的WriteMessage(字符串文件名,ArrayList的ipmMessage)
                     抛出java.io.FileNotFoundException,java.io.IOException异常{              java.io.DataOutputStream中的DOS =新java.io.DataOutputStream中(
                           新java.io.FileOutputStream中(文件名,真实));
              的for(int i = 0; I< ipmMessage.size();我++){
                     尝试{
                           INT [] intValues​​ =(INT [])ipmMessage.get(ⅰ);
                           对于(INT J = 0; J< intValues​​.length; J ++){
                                  dos.write(intValues​​ [J]);
                           }
                     }赶上(抛出ClassCastException E){
                           字节[] = byteValues​​(字节[])ipmMessage.get(I)
                           dos.write(byteValues​​);
                     }
              }
              dos.flush();
              dos.close();       }       //重新格式化为U1014
       公共静态无效reformatFile(字符串文件名)
                     抛出java.io.FileNotFoundException,java.io.IOException异常{
              java.io.FileInputStream中FIS =新java.io.FileInputStream中(文件名);
              java.io.DataInputStream中BR =新java.io.DataInputStream中(FIS);              INT H = br.read();
              的System.out.println(H =+ H + - +(char)的H);              如果((炭)H =='<'){//检查<&EOM GT;                     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);
                     如果((char)的H1 =='E'和;及(char)的H2 =='O'和;及(炭)H3 =='M'
                                  &功放;&安培; (焦)H4 =='>'){
                           的System.out.println(消息的结尾处找到);
                     }
                     其他{
                           的System.out.println(EOM没有找到,但<发现);
                     }
              }
              其他{
                     的System.out.println(<未找到);
              }
       }
}


解决方案

呼叫时,您没有指定一个字符集的getBytes(),所以它使用的默认字符集基础平台(或Java,如果启动的Java时指定本身)。这是在:

getBytes() has an overloaded version that lets you specify a charset in your code.

这篇关于为什么" STRING" .getBytes()根据操作系统的不同工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-19 00:39