Index: . =================================================================== --- . (revision 1502622) +++ . (working copy) Property changes on: . ___________________________________________________________________ Modified: svn:mergeinfo Merged /lucene/dev/trunk:r1502615 Index: lucene =================================================================== --- lucene (revision 1502622) +++ lucene (working copy) Property changes on: lucene ___________________________________________________________________ Modified: svn:mergeinfo Merged /lucene/dev/trunk/lucene:r1502615 Index: lucene/analysis =================================================================== --- lucene/analysis (revision 1502622) +++ lucene/analysis (working copy) Property changes on: lucene/analysis ___________________________________________________________________ Modified: svn:mergeinfo Merged /lucene/dev/trunk/lucene/analysis:r1502615 Index: lucene/analysis/smartcn/src/java/org/apache/lucene/analysis/cn/smart/AnalyzerProfile.java =================================================================== --- lucene/analysis/smartcn/src/java/org/apache/lucene/analysis/cn/smart/AnalyzerProfile.java (revision 1502622) +++ lucene/analysis/smartcn/src/java/org/apache/lucene/analysis/cn/smart/AnalyzerProfile.java (working copy) @@ -20,8 +20,11 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStreamReader; import java.util.Properties; +import org.apache.lucene.util.IOUtils; + /** * Manages analysis data configuration for SmartChineseAnalyzer *

@@ -77,13 +80,13 @@ Properties prop = new Properties(); try { FileInputStream input = new FileInputStream(propFile); - prop.load(input); + prop.load(new InputStreamReader(input, IOUtils.CHARSET_UTF_8)); String dir = prop.getProperty("analysis.data.dir", ""); input.close(); return dir; } catch (IOException e) { + return ""; } - return ""; } } Index: lucene/benchmark =================================================================== --- lucene/benchmark (revision 1502622) +++ lucene/benchmark (working copy) Property changes on: lucene/benchmark ___________________________________________________________________ Modified: svn:mergeinfo Merged /lucene/dev/trunk/lucene/benchmark:r1502615 Index: lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/utils/Config.java =================================================================== --- lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/utils/Config.java (revision 1502622) +++ lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/utils/Config.java (working copy) @@ -18,9 +18,9 @@ */ import java.io.BufferedReader; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.Reader; +import java.io.StringReader; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -80,8 +80,7 @@ } // read props from string this.props = new Properties(); - // props.load always assumes iso8859-1... - props.load(new ByteArrayInputStream(sb.toString().getBytes("ISO-8859-1"))); + props.load(new StringReader(sb.toString())); // make sure work dir is set properly if (props.get("work.dir") == null) { Index: lucene/CHANGES.txt =================================================================== --- lucene/CHANGES.txt (revision 1502622) +++ lucene/CHANGES.txt (working copy) @@ -290,6 +290,10 @@ to decide if a CFS must be written, instead IndexWriterConfig now has a property to enable / disable CFS for newly created segments. (Simon Willnauer) +* LUCENE-5107: Properties files by Lucene are now written in UTF-8 encoding, + Unicode is no longer escaped. Reading of legacy properties files with + \u escapes is still possible. (Uwe Schindler, Robert Muir) + ======================= Lucene 4.3.1 ======================= Bug Fixes Index: lucene/tools =================================================================== --- lucene/tools (revision 1502622) +++ lucene/tools (working copy) Property changes on: lucene/tools ___________________________________________________________________ Modified: svn:mergeinfo Merged /lucene/dev/trunk/lucene/tools:r1502615 Index: lucene/tools/forbiddenApis/base.txt =================================================================== --- lucene/tools/forbiddenApis/base.txt (revision 1502622) +++ lucene/tools/forbiddenApis/base.txt (working copy) @@ -22,9 +22,10 @@ java.util.concurrent.Executors#defaultThreadFactory() java.util.concurrent.Executors#privilegedThreadFactory() -@defaultMessage Properties files should be read/written with InputStream/OutputStream for maximum compatibility, as it uses the official "properties file format" with unicode escapes and properly defined encoding -java.util.Properties#load(java.io.Reader) -java.util.Properties#store(java.io.Writer,java.lang.String) +@defaultMessage Properties files should be read/written with Reader/Writer, using UTF-8 charset. This allows reading older files with unicode escapes, too. +java.util.Properties#load(java.io.InputStream) +java.util.Properties#save(java.io.OutputStream,java.lang.String) +java.util.Properties#store(java.io.OutputStream,java.lang.String) java.lang.Character#codePointBefore(char[],int) @ Implicit start offset is error-prone when the char[] is a buffer and the first chars are random chars java.lang.Character#codePointAt(char[],int) @ Implicit end offset is error-prone when the char[] is a buffer and the last chars are random chars Index: solr =================================================================== --- solr (revision 1502622) +++ solr (working copy) Property changes on: solr ___________________________________________________________________ Modified: svn:mergeinfo Merged /lucene/dev/trunk/solr:r1502615 Index: solr/CHANGES.txt =================================================================== --- solr/CHANGES.txt (revision 1502622) +++ solr/CHANGES.txt (working copy) @@ -317,6 +317,10 @@ * SOLR-4948, SOLR-5009: Tidied up CoreContainer construction logic. (Alan Woodward, Uwe Schindler, Steve Rowe) +* LUCENE-5107: Properties files by Solr are now written in UTF-8 encoding, + Unicode is no longer escaped. Reading of legacy properties files with + \u escapes is still possible. (Uwe Schindler, Robert Muir) + ================== 4.3.1 ================== Versions of Major Components Index: solr/CHANGES.txt =================================================================== --- solr/CHANGES.txt (revision 1502622) +++ solr/CHANGES.txt (working copy) Property changes on: solr/CHANGES.txt ___________________________________________________________________ Modified: svn:mergeinfo Merged /lucene/dev/trunk/solr/CHANGES.txt:r1502615 Index: solr/contrib =================================================================== --- solr/contrib (revision 1502622) +++ solr/contrib (working copy) Property changes on: solr/contrib ___________________________________________________________________ Modified: svn:mergeinfo Merged /lucene/dev/trunk/solr/contrib:r1502615 Index: solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/SimplePropertiesWriter.java =================================================================== --- solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/SimplePropertiesWriter.java (revision 1502622) +++ solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/SimplePropertiesWriter.java (working copy) @@ -22,9 +22,10 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.Writer; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; @@ -33,6 +34,7 @@ import java.util.Map; import java.util.Properties; +import org.apache.lucene.util.IOUtils; import org.apache.solr.core.SolrCore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -179,7 +181,7 @@ @Override public void persist(Map propObjs) { - OutputStream propOutput = null; + Writer propOutput = null; Properties existingProps = mapToProperties(readIndexerProperties()); Properties newProps = mapToProperties(propObjs); try { @@ -189,18 +191,14 @@ filePath += File.separator; } filePath += filename; - propOutput = new FileOutputStream(filePath); + propOutput = new OutputStreamWriter(new FileOutputStream(filePath), IOUtils.CHARSET_UTF_8); existingProps.store(propOutput, null); log.info("Wrote last indexed time to " + filename); } catch (Exception e) { throw new DataImportHandlerException(DataImportHandlerException.SEVERE, "Unable to persist Index Start Time", e); } finally { - try { - if (propOutput != null) propOutput.close(); - } catch (IOException e) { - propOutput = null; - } + IOUtils.closeWhileHandlingException(propOutput); } } @@ -215,16 +213,12 @@ } filePath += filename; propInput = new FileInputStream(filePath); - props.load(propInput); + props.load(new InputStreamReader(propInput, IOUtils.CHARSET_UTF_8)); log.info("Read " + filename); } catch (Exception e) { log.warn("Unable to read: " + filename); } finally { - try { - if (propInput != null) propInput.close(); - } catch (IOException e) { - propInput = null; - } + IOUtils.closeWhileHandlingException(propInput); } return propertiesToMap(props); } Index: solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ZKPropertiesWriter.java =================================================================== --- solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ZKPropertiesWriter.java (revision 1502622) +++ solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ZKPropertiesWriter.java (working copy) @@ -16,11 +16,12 @@ */ package org.apache.solr.handler.dataimport; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; +import java.io.StringReader; +import java.io.StringWriter; import java.util.Map; import java.util.Properties; +import org.apache.lucene.util.IOUtils; import org.apache.solr.common.cloud.SolrZkClient; import org.apache.zookeeper.KeeperException.NodeExistsException; import org.slf4j.Logger; @@ -63,10 +64,10 @@ public void persist(Map propObjs) { Properties existing = mapToProperties(readIndexerProperties()); existing.putAll(mapToProperties(propObjs)); - ByteArrayOutputStream output = new ByteArrayOutputStream(); + StringWriter output = new StringWriter(); try { - existing.store(output, ""); - byte[] bytes = output.toByteArray(); + existing.store(output, null); + byte[] bytes = output.toString().getBytes(IOUtils.CHARSET_UTF_8); if (!zkClient.exists(path, false)) { try { zkClient.makePath(path, false); @@ -89,8 +90,7 @@ try { byte[] data = zkClient.getData(path, null, null, false); if (data != null) { - ByteArrayInputStream input = new ByteArrayInputStream(data); - props.load(input); + props.load(new StringReader(new String(data, "UTF-8"))); } } catch (Throwable e) { log.warn( Index: solr/contrib/velocity/src/java/org/apache/solr/response/VelocityResponseWriter.java =================================================================== --- solr/contrib/velocity/src/java/org/apache/solr/response/VelocityResponseWriter.java (revision 1502622) +++ solr/contrib/velocity/src/java/org/apache/solr/response/VelocityResponseWriter.java (working copy) @@ -17,6 +17,7 @@ package org.apache.solr.response; +import org.apache.lucene.util.IOUtils; import org.apache.solr.client.solrj.SolrResponse; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.client.solrj.response.SolrResponseBase; @@ -150,7 +151,7 @@ try { is = resourceLoader.getResourceStream(propFile); Properties props = new Properties(); - props.load(is); + props.load(new InputStreamReader(is, IOUtils.CHARSET_UTF_8)); engine.init(props); } finally { Index: solr/core =================================================================== --- solr/core (revision 1502622) +++ solr/core (working copy) Property changes on: solr/core ___________________________________________________________________ Modified: svn:mergeinfo Merged /lucene/dev/trunk/solr/core:r1502615 Index: solr/core/src/java/org/apache/solr/cloud/SolrZkServer.java =================================================================== --- solr/core/src/java/org/apache/solr/cloud/SolrZkServer.java (revision 1502622) +++ solr/core/src/java/org/apache/solr/cloud/SolrZkServer.java (working copy) @@ -179,7 +179,7 @@ Properties cfg = new Properties(); FileInputStream in = new FileInputStream(configFile); try { - cfg.load(in); + cfg.load(new InputStreamReader(in, IOUtils.CHARSET_UTF_8)); } finally { in.close(); } Index: solr/core/src/java/org/apache/solr/core/ConfigSolrXml.java =================================================================== --- solr/core/src/java/org/apache/solr/core/ConfigSolrXml.java (revision 1502622) +++ solr/core/src/java/org/apache/solr/core/ConfigSolrXml.java (working copy) @@ -17,7 +17,7 @@ * limitations under the License. */ -import org.apache.commons.io.IOUtils; +import org.apache.lucene.util.IOUtils; import org.apache.solr.common.SolrException; import org.apache.solr.util.PropertiesUtil; import org.slf4j.Logger; @@ -27,6 +27,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -177,11 +178,11 @@ InputStream is = null; try { is = new FileInputStream(corePropsFile); - p.load(is); + p.load(new InputStreamReader(is, IOUtils.CHARSET_UTF_8)); } catch (IOException e) { log.warn("Error loading properties ", e); } finally { - IOUtils.closeQuietly(is); + IOUtils.closeWhileHandlingException(is); } } return p; Index: solr/core/src/java/org/apache/solr/core/SolrCore.java =================================================================== --- solr/core/src/java/org/apache/solr/core/SolrCore.java (revision 1502622) +++ solr/core/src/java/org/apache/solr/core/SolrCore.java (working copy) @@ -21,7 +21,9 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.OutputStream; +import java.io.OutputStreamWriter; import java.io.Writer; import java.lang.reflect.Constructor; import java.net.URL; @@ -53,7 +55,6 @@ import javax.xml.parsers.ParserConfigurationException; -import org.apache.commons.io.IOUtils; import org.apache.lucene.codecs.Codec; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexDeletionPolicy; @@ -63,6 +64,7 @@ import org.apache.lucene.store.IOContext; import org.apache.lucene.store.IndexInput; import org.apache.lucene.store.LockObtainFailedException; +import org.apache.lucene.util.IOUtils; import org.apache.solr.cloud.CloudDescriptor; import org.apache.solr.common.SolrException; import org.apache.solr.common.SolrException.ErrorCode; @@ -257,7 +259,7 @@ final InputStream is = new PropertiesInputStream(input); try { - p.load(is); + p.load(new InputStreamReader(is, "UTF-8")); String s = p.getProperty("index"); if (s != null && s.trim().length() > 0) { @@ -267,7 +269,7 @@ } catch (Exception e) { log.error("Unable to load " + SnapPuller.INDEX_PROPERTIES, e); } finally { - IOUtils.closeQuietly(is); + IOUtils.closeWhileHandlingException(is); } } } catch (IOException e) { @@ -904,16 +906,14 @@ props.put("shard", shardId); } } - OutputStream out = null; + Writer out = null; try { - out = new FileOutputStream(propFile); - props.store(out, ""); + out = new OutputStreamWriter(new FileOutputStream(propFile), IOUtils.CHARSET_UTF_8); + props.store(out, null); } catch (IOException e) { throw new SolrException(ErrorCode.SERVER_ERROR, null, e); } finally { - if (out != null) { - IOUtils.closeQuietly(out); - } + IOUtils.closeWhileHandlingException(out); } } } Index: solr/core/src/java/org/apache/solr/core/SolrCoreDiscoverer.java =================================================================== --- solr/core/src/java/org/apache/solr/core/SolrCoreDiscoverer.java (revision 1502622) +++ solr/core/src/java/org/apache/solr/core/SolrCoreDiscoverer.java (working copy) @@ -4,6 +4,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import java.util.Properties; @@ -72,7 +73,7 @@ Properties propsOrig = new Properties(); InputStream is = new FileInputStream(propFile); try { - propsOrig.load(is); + propsOrig.load(new InputStreamReader(is, "UTF-8")); } finally { IOUtils.closeQuietly(is); } Index: solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java =================================================================== --- solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java (revision 1502622) +++ solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java (working copy) @@ -20,6 +20,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Writer; import java.nio.ByteBuffer; @@ -48,6 +49,7 @@ import org.apache.lucene.store.Directory; import org.apache.lucene.store.IOContext; import org.apache.lucene.store.IndexInput; +import static org.apache.lucene.util.IOUtils.CHARSET_UTF_8; import org.apache.solr.common.SolrException; import org.apache.solr.common.SolrException.ErrorCode; import org.apache.solr.common.params.CommonParams; @@ -813,7 +815,7 @@ try { final InputStream is = new PropertiesInputStream(input); Properties props = new Properties(); - props.load(is); + props.load(new InputStreamReader(is, CHARSET_UTF_8)); return props; } finally { input.close(); Index: solr/core/src/java/org/apache/solr/handler/SnapPuller.java =================================================================== --- solr/core/src/java/org/apache/solr/handler/SnapPuller.java (revision 1502622) +++ solr/core/src/java/org/apache/solr/handler/SnapPuller.java (working copy) @@ -40,7 +40,9 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.Writer; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.text.SimpleDateFormat; @@ -73,6 +75,7 @@ import org.apache.lucene.store.Directory; import org.apache.lucene.store.IndexInput; import org.apache.lucene.store.IndexOutput; +import static org.apache.lucene.util.IOUtils.CHARSET_UTF_8; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpClientUtil; import org.apache.solr.client.solrj.impl.HttpSolrServer; @@ -578,7 +581,7 @@ } final IndexOutput out = dir.createOutput(REPLICATION_PROPERTIES, DirectoryFactory.IOCONTEXT_NO_CACHE); - OutputStream outFile = new PropertiesOutputStream(out); + Writer outFile = new OutputStreamWriter(new PropertiesOutputStream(out), CHARSET_UTF_8); try { props.store(outFile, "Replication details"); dir.sync(Collections.singleton(REPLICATION_PROPERTIES)); @@ -890,7 +893,7 @@ final InputStream is = new PropertiesInputStream(input); try { - p.load(is); + p.load(new InputStreamReader(is, CHARSET_UTF_8)); } catch (Exception e) { LOG.error("Unable to load " + SnapPuller.INDEX_PROPERTIES, e); } finally { @@ -904,9 +907,9 @@ } final IndexOutput out = dir.createOutput(SnapPuller.INDEX_PROPERTIES, DirectoryFactory.IOCONTEXT_NO_CACHE); p.put("index", tmpIdxDirName); - OutputStream os = null; + Writer os = null; try { - os = new PropertiesOutputStream(out); + os = new OutputStreamWriter(new PropertiesOutputStream(out), CHARSET_UTF_8); p.store(os, SnapPuller.INDEX_PROPERTIES); dir.sync(Collections.singleton(INDEX_PROPERTIES)); } catch (Exception e) { Index: solr/core/src/test/org/apache/solr/core/TestArbitraryIndexDir.java =================================================================== --- solr/core/src/test/org/apache/solr/core/TestArbitraryIndexDir.java (revision 1502622) +++ solr/core/src/test/org/apache/solr/core/TestArbitraryIndexDir.java (working copy) @@ -19,6 +19,8 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; import java.util.Properties; import javax.xml.parsers.ParserConfigurationException; @@ -30,6 +32,7 @@ import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.store.Directory; +import org.apache.lucene.util.IOUtils; import org.apache.lucene.util.Version; import org.apache.solr.common.SolrException; import org.apache.solr.common.params.CommonParams; @@ -97,15 +100,15 @@ File newDir = new File(h.getCore().getDataDir() + "index_temp"); newDir.mkdirs(); p.put("index", newDir.getName()); - FileOutputStream os = null; + Writer os = null; try { - os = new FileOutputStream(idxprops); + os = new OutputStreamWriter(new FileOutputStream(idxprops), IOUtils.CHARSET_UTF_8); p.store(os, "index properties"); } catch (Exception e) { throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unable to write " + SnapPuller.INDEX_PROPERTIES, e); } finally { - if (os != null) os.close(); + IOUtils.closeWhileHandlingException(os); } //add a doc in the new index dir Index: solr/core/src/test/org/apache/solr/core/TestCoreDiscovery.java =================================================================== --- solr/core/src/test/org/apache/solr/core/TestCoreDiscovery.java (revision 1502622) +++ solr/core/src/test/org/apache/solr/core/TestCoreDiscovery.java (working copy) @@ -27,6 +27,8 @@ import java.io.File; import java.io.FileOutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; import java.util.Properties; public class TestCoreDiscovery extends SolrTestCaseJ4 { @@ -78,7 +80,7 @@ private void addCoreWithProps(Properties stockProps, File propFile) throws Exception { if (!propFile.getParentFile().exists()) propFile.getParentFile().mkdirs(); - FileOutputStream out = new FileOutputStream(propFile); + Writer out = new OutputStreamWriter(new FileOutputStream(propFile), IOUtils.CHARSET_UTF_8); try { stockProps.store(out, null); } finally { Index: solr/core/src/test/org/apache/solr/handler/admin/CoreAdminCreateDiscoverTest.java =================================================================== --- solr/core/src/test/org/apache/solr/handler/admin/CoreAdminCreateDiscoverTest.java (revision 1502622) +++ solr/core/src/test/org/apache/solr/handler/admin/CoreAdminCreateDiscoverTest.java (working copy) @@ -18,6 +18,7 @@ package org.apache.solr.handler.admin; import org.apache.commons.io.FileUtils; +import org.apache.lucene.util.IOUtils; import org.apache.solr.SolrTestCaseJ4; import org.apache.solr.common.params.CoreAdminParams; import org.apache.solr.core.CoreDescriptor; @@ -29,6 +30,7 @@ import java.io.File; import java.io.FileInputStream; +import java.io.InputStreamReader; import java.io.IOException; import java.util.Arrays; import java.util.Collection; @@ -114,7 +116,7 @@ File propFile = new File(solrHomeDirectory, coreSysProps + "/" + SolrCoreDiscoverer.CORE_PROP_FILE); FileInputStream is = new FileInputStream(propFile); try { - props.load(is); + props.load(new InputStreamReader(is, IOUtils.CHARSET_UTF_8)); } finally { org.apache.commons.io.IOUtils.closeQuietly(is); } @@ -177,7 +179,7 @@ File propFile = new File(solrHomeDirectory, coreNormal + "/" + SolrCoreDiscoverer.CORE_PROP_FILE); FileInputStream is = new FileInputStream(propFile); try { - props.load(is); + props.load(new InputStreamReader(is, IOUtils.CHARSET_UTF_8)); } finally { org.apache.commons.io.IOUtils.closeQuietly(is); } @@ -211,7 +213,7 @@ Properties props = new Properties(); FileInputStream is = new FileInputStream(propFile); try { - props.load(is); + props.load(new InputStreamReader(is, IOUtils.CHARSET_UTF_8)); } finally { org.apache.commons.io.IOUtils.closeQuietly(is); } Index: solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java =================================================================== --- solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java (revision 1502622) +++ solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java (working copy) @@ -124,7 +124,7 @@ Properties p = new Properties(); p.setProperty("foo.foo1", "f1"); p.setProperty("foo.foo2", "f2"); - FileOutputStream fos = new FileOutputStream(confDir + File.separator + "solrcore.properties"); + Writer fos = new OutputStreamWriter(new FileOutputStream(confDir + File.separator + "solrcore.properties"), IOUtils.CHARSET_UTF_8); p.store(fos, null); IOUtils.close(fos); }