ฉันจะหลีกเลี่ยงเครื่องหมายเท่ากับ ( =
) ในไฟล์คุณสมบัติ Java ได้อย่างไร ฉันต้องการใส่สิ่งต่อไปนี้ในไฟล์ของฉัน:
table.whereclause=where id=100
ฉันจะหลีกเลี่ยงเครื่องหมายเท่ากับ ( =
) ในไฟล์คุณสมบัติ Java ได้อย่างไร ฉันต้องการใส่สิ่งต่อไปนี้ในไฟล์ของฉัน:
table.whereclause=where id=100
คำตอบ:
นอกจากนี้โปรดดูวิธีการโหลด (Reader reader)จากProperty
คลาสบน javadoc
ในload(Reader reader)
เอกสารวิธีการระบุว่า
ที่สำคัญมีทั้งหมดของตัวอักษรในบรรทัดที่เริ่มต้นด้วยไม่ใช่สีขาวตัวอักษรช่องว่างแรกและขึ้นไป แต่ไม่รวมถึงการที่ไม่ใช้ Escape แรก
'='
,':'
หรือตัวอักษรพื้นที่สีขาวอื่น ๆ นอกเหนือจากเทอร์มิบรรทัด อักขระการยุติคีย์ทั้งหมดเหล่านี้อาจรวมอยู่ในคีย์โดยการหลีกเลี่ยงด้วยอักขระแบ็กสแลชที่นำหน้า ตัวอย่างเช่น,\:\=
จะเป็นอักขระตัว
":=".
ยุติบรรทัดของคีย์สองอักขระที่สามารถรวมโดยใช้\r
และ\n
หลีกเลี่ยงลำดับ ช่องว่างสีขาวใด ๆ หลังจากข้ามคีย์ หากอักขระช่องว่างที่ไม่ใช่สีขาวตัวแรกหลังคีย์คือ'='
หรือ':'
จากนั้นจะถูกละเว้นและอักขระช่องว่างใด ๆ หลังจากนั้นจะถูกข้ามไปด้วย อักขระที่เหลือทั้งหมดในบรรทัดกลายเป็นส่วนหนึ่งของสตริงองค์ประกอบที่เกี่ยวข้อง""
ถ้าไม่มีตัวอักษรที่เหลือองค์ประกอบเป็นสตริงที่ว่างเปล่า เมื่อลำดับอักขระดิบที่ประกอบเป็นคีย์และองค์ประกอบถูกระบุแล้วการประมวลผล Escape จะดำเนินการตามที่อธิบายไว้ข้างต้น
หวังว่าจะช่วยได้
ในตัวอย่างเฉพาะของคุณคุณไม่จำเป็นต้องหนีจากค่าเท่ากับ - คุณจะต้องหลีกหนีหากเป็นส่วนหนึ่งของกุญแจเท่านั้น รูปแบบไฟล์คุณสมบัติจะถือว่าอักขระทั้งหมดหลังจาก unescaped แรกเท่ากับเป็นส่วนหนึ่งของค่า
อักขระหลีกเริ่มต้นใน Java คือ '\'
อย่างไรก็ตามไฟล์คุณสมบัติ Java มีรูปแบบ key = value ควรพิจารณาทุกอย่างหลังจากครั้งแรกเท่ากับค่า
วิธีที่ดีที่สุดในการหลีกเลี่ยงปัญหาประเภทนี้ในการสร้างคุณสมบัติโดยใช้โปรแกรมแล้วจัดเก็บ ตัวอย่างเช่นการใช้รหัสเช่นนี้:
java.util.Properties props = new java.util.Properties();
props.setProperty("table.whereclause", "where id=100");
props.store(System.out, null);
สิ่งนี้จะส่งออกไปยัง System.out เวอร์ชันที่ใช้ Escape อย่างถูกต้อง
ในกรณีของฉันผลลัพธ์คือ:
#Mon Aug 12 13:50:56 EEST 2013
table.whereclause=where id\=100
อย่างที่คุณเห็นนี่เป็นวิธีง่ายๆในการสร้างเนื้อหาของไฟล์. คุณสมบัติที่รับประกันว่าถูกต้อง และคุณสามารถใส่คุณสมบัติได้มากเท่าที่คุณต้องการ
ในกรณีของฉัน '\\' ชั้นนำสองตัวทำงานได้ดีสำหรับฉัน
ตัวอย่างเช่นหากคำของคุณมีอักขระ "#" (เช่น aa # 100 คุณสามารถหลีกเลี่ยงได้โดยใช้ "\\" สองตัวนำหน้า
key= aa\\#100
คุณสามารถดูได้ที่นี่คีย์ในคุณสมบัติ Java มีอักขระว่างได้หรือไม่
สำหรับการหลีกเลี่ยงเท่ากับ '=' \ u003d
table.whereclause = โดยที่ id = 100
คีย์: [table.whereclause] ค่า: [โดยที่ id = 100]
table.whereclause \ u003d โดยที่ id = 100
คีย์: [table.whereclause = where] ค่า: [id = 100]
table.whereclause \ u003d ที่ไหน \ u0020id \ u003d100
คีย์: [table.whereclause = โดยที่ id = 100] ค่า: []
ในไฟล์ Spring หรือ Spring boot application.properties นี่คือวิธีการหลีกเลี่ยงอักขระพิเศษ
table.whereclause = โดยที่ id '\ =' 100
วิธีนี้จะช่วยในการสร้างค่าทางโปรแกรมที่รับประกันว่าเข้ากันได้กับ.properties
ไฟล์100% :
public static String escapePropertyValue(final String value) {
if (value == null) {
return null;
}
try (final StringWriter writer = new StringWriter()) {
final Properties properties = new Properties();
properties.put("escaped", value);
properties.store(writer, null);
writer.flush();
final String stringifiedProperties = writer.toString();
final Pattern pattern = Pattern.compile("(.*?)escaped=(.*?)" + Pattern.quote(System.lineSeparator()) + "*");
final Matcher matcher = pattern.matcher(stringifiedProperties);
if (matcher.find() && matcher.groupCount() <= 2) {
return matcher.group(matcher.groupCount());
}
// This should never happen unless the internal implementation of Properties::store changed
throw new IllegalStateException("Could not escape property value");
} catch (final IOException ex) {
// This should never happen. IOException is only because the interface demands it
throw new IllegalStateException("Could not escape property value", ex);
}
}
เรียกแบบนี้ก็ได้ว่า
final String escapedPath = escapePropertyValue("C:\\Users\\X");
writeToFile(escapedPath); // will pass "C\\:\\\\Users\\\\X"
วิธีนี้มีราคาแพงเล็กน้อย แต่โดยทั่วไปการเขียนคุณสมบัติลงในไฟล์จะเป็นการดำเนินการแบบไม่ต่อเนื่อง
ฉันสามารถป้อนค่าภายในอักขระ ":
db_user="postgresql"
db_passwd="this,is,my,password"