Warum ist dieser Code OS abhängig?

Thallius

Top Contributor
Hi,

ich habe einen ganz kleinen Code um eine XML Datei mit einem Hash zu versehen um sie vor Änderungen zu schützen.

Java:
            System.out.println("Validating file "+file.getName()+"...");
            try
            {
                FileInputStream iStream = new FileInputStream(file);
                if(iStream!=null)
                {
                    byte[] data = new byte[(int)file.length()];
                    iStream.read(data);
                    iStream.close();
                       
                    if(data!=null && data.length!=0)
                    {
                        String fileContent = new String(data, "UTF-8");

                        int hashStart=fileContent.indexOf("<Hash>");
                        if(hashStart!=-1)
                        {
                            int hashEnd=fileContent.indexOf("</Hash>");
                            if(hashEnd!=-1)
                                fileContent=fileContent.substring(0, hashStart)+fileContent.substring(hashEnd+7);
                        }
                        String xml=fileContent;
                        xml=xml.substring(0, 8)+salt+xml.substring(9);
                        xml = xml.replaceAll("\\r|\\n", "");
                        String xmlHash=org.apache.commons.codec.digest.DigestUtils.sha512Hex(xml);
                       
                        int endTag=fileContent.indexOf("</CheckParameter");
                        if(endTag==-1)
                            endTag=fileContent.indexOf("</PrintTemplate");
                        if(endTag==-1)
                            endTag=fileContent.indexOf("</GlobalSettings");
                        if(endTag!=-1)
                        {
                            String content=fileContent.substring(0,endTag)+"<Hash>"+xmlHash+"</Hash>"+fileContent.substring(endTag);
                            try
                            {
                                FileOutputStream oStream = new FileOutputStream(file);
                                if(oStream!=null)
                                {
                                    oStream.write(content.getBytes(), 0, content.getBytes().length);;
                                    oStream.close();
                                    System.out.println("done.");
                                }
                            }
                            catch (IOException iox)
                            {
                                System.out.println("failed!");
                                iox.printStackTrace();
                            }
                        }
                        else
                            System.out.println("failed!");
                    }
                    else
                        System.out.println("failed!");
                }
            }
            catch (IOException e)
            {
                System.out.println(e.getMessage());
                System.out.println("failed!");
            }

Leider macht diese App dann unter Linux alles so wie cih es möchte, unter Windows zernagelt es mir aber die Sonderzeichen. Warum? FileInPut und Outputstresm sind doch Charset unabhängig oder nicht? Und UTF-8 sollte auf allen Systemen auch gleich sein.

Gruß

Claus
 
Zuletzt bearbeitet von einem Moderator:
Ich vermute mal, dass die Zeichen in der eingelesenen Datei `file` eben unter Windows nicht UTF-8 kodiert sind. Der String-Konstruktoraufruf mit "UTF-8" sagt ja nur: "Tu mal so, bzw. gehe davon aus, dass die byte[] Werte UTF-8 kodiert sind". Das muss aber nicht so sein.
 
Die Datei wurde aber unter Linux erstellt und Windows kann doch nicht einfach die bereits exitierende Datei beim Einlesen ändern oder?
 
Naja, meine Frage war eher: Wenn diese Datei unter Linux erstellt wurde und dein Programm unter Windows mit dieser Datei nicht funktioniert, wie hast du die Datei denn von Linux nach Windows transportiert?
 

Zurück
Oben