2011-11-30 10 views
11

Mam jeden String zakodowany w UTF-8, który jest łańcuchem par klucz + wartość, który jest wymagany do załadowania do obiektu Properties. Zauważyłem, że dostaję zniekształcone postacie za pomocą mojej wstępnej implementacji i po odrobinie wyszukiwania go znalazłem ten Question, który wskazywał na mój problem - zasadniczo, że Właściwości jest domyślnie przy użyciu ISO-8859-1. Ta implementacja wyglądała następująco:Kodowany Java UTF-8 String na Właściwości

public Properties load(String propertiesString) { 
     Properties properties = new Properties(); 
     try { 
      properties.load(new ByteArrayInputStream(propertiesString.getBytes())); 
     } catch (IOException e) { 
      logger.error(ExceptionUtils.getFullStackTrace(e)); 
     } 
     return properties; 
    } 

Nie określono kodowania, stąd mój problem. Na moje pytanie nie mogę wymyślić, jak połączyć/utworzyć kombinację Reader/InputStream, aby przejść do Properties.load(), która używa podanego propertiesString i określa kodowanie. Myślę, że jest to głównie spowodowane brakiem doświadczenia w strumieniach I/O i pozornie ogromną biblioteką narzędzi IO w pakiecie java.io.

Wszelkie porady są mile widziane.

Odpowiedz

13

Podczas pracy z ciągami używaj Reader. InputStream s są naprawdę przeznaczone do danych binarnych.

public Properties load(String propertiesString) { 
    Properties properties = new Properties(); 
    properties.load(new StringReader(propertiesString)); 
    return properties; 
} 
+0

że konstruktor nie istnieje. – BalusC

+0

Dzięki, zrobiłem checkout [StringReader] (http://docs.oracle.com/javase/6/docs/api/java/io/StringReader.html), ale nie widziałem takiego konstruktora. – markdsievers

+0

Pozdrowienia Matt, właśnie wypróbowaliśmy to rozwiązanie. Nie użyłem początkowo StringReader, ponieważ miałem moje blindy szukające kontroli nad kodowaniem. Bardzo dziękuję za pomoc. Awansuj + zaakceptuj dla siebie mojego przyjaciela. – markdsievers

1

Spróbuj tego:

ByteArrayInputStream bais = new ByteArrayInputStream(propertiesString.getBytes("UTF-8")); 
properties.load(bais); 
+1

Musiałem użyć tego zamiast 'StringReader' w celu obsługi Androida SDK starszych niż Android-9. –

1
private Properties getProperties() throws IOException { 
     ClassLoader classLoader = getClass().getClassLoader(); 
     InputStream input = classLoader.getResourceAsStream("your file"); 
     InputStreamReader inputStreamReader = new InputStreamReader(input, "UTF-8"); 
     Properties properties = new Properties(); 
     properties.load(inputStreamReader); 
     return properties; 
    } 

następnie wykorzystanie

System.out.println(getProperties().getProperty("key"))