วิธีหลีกเลี่ยงไฟล์คุณสมบัติการลงชื่อเข้าใช้เท่ากับ


85

ฉันจะหลีกเลี่ยงเครื่องหมายเท่ากับ ( =) ในไฟล์คุณสมบัติ Java ได้อย่างไร ฉันต้องการใส่สิ่งต่อไปนี้ในไฟล์ของฉัน:

table.whereclause=where id=100

คำตอบ:


84

นอกจากนี้โปรดดูวิธีการโหลด (Reader reader)จากPropertyคลาสบน javadoc

ในload(Reader reader)เอกสารวิธีการระบุว่า

ที่สำคัญมีทั้งหมดของตัวอักษรในบรรทัดที่เริ่มต้นด้วยไม่ใช่สีขาวตัวอักษรช่องว่างแรกและขึ้นไป แต่ไม่รวมถึงการที่ไม่ใช้ Escape แรก '=', ':'หรือตัวอักษรพื้นที่สีขาวอื่น ๆ นอกเหนือจากเทอร์มิบรรทัด อักขระการยุติคีย์ทั้งหมดเหล่านี้อาจรวมอยู่ในคีย์โดยการหลีกเลี่ยงด้วยอักขระแบ็กสแลชที่นำหน้า ตัวอย่างเช่น,

\:\=

จะเป็นอักขระตัว":=". ยุติบรรทัดของคีย์สองอักขระที่สามารถรวมโดยใช้\rและ\nหลีกเลี่ยงลำดับ ช่องว่างสีขาวใด ๆ หลังจากข้ามคีย์ หากอักขระช่องว่างที่ไม่ใช่สีขาวตัวแรกหลังคีย์คือ'=' หรือ':'จากนั้นจะถูกละเว้นและอักขระช่องว่างใด ๆ หลังจากนั้นจะถูกข้ามไปด้วย อักขระที่เหลือทั้งหมดในบรรทัดกลายเป็นส่วนหนึ่งของสตริงองค์ประกอบที่เกี่ยวข้อง ""ถ้าไม่มีตัวอักษรที่เหลือองค์ประกอบเป็นสตริงที่ว่างเปล่า เมื่อลำดับอักขระดิบที่ประกอบเป็นคีย์และองค์ประกอบถูกระบุแล้วการประมวลผล Escape จะดำเนินการตามที่อธิบายไว้ข้างต้น

หวังว่าจะช่วยได้


92

ในตัวอย่างเฉพาะของคุณคุณไม่จำเป็นต้องหนีจากค่าเท่ากับ - คุณจะต้องหลีกหนีหากเป็นส่วนหนึ่งของกุญแจเท่านั้น รูปแบบไฟล์คุณสมบัติจะถือว่าอักขระทั้งหมดหลังจาก unescaped แรกเท่ากับเป็นส่วนหนึ่งของค่า


12
ไม่รู้ว่าทำไมถึงไม่มาร์กอัป! คำตอบที่ง่ายที่สุด! และส่วนใหญ่ผู้คนกำลังมองหาค่า Escape ในไฟล์คุณสมบัติ!
Tejas

1
การแก้ไขเล็กน้อย: จะถือว่าเป็นค่าอักขระทั้งหมดหลังจากที่ไม่ใช้ Escape ตัวแรกเท่ากับและเว้นวรรคต่อท้ายนั่นคือช่องว่างนำหน้าในค่าจะถูกนำออก ตัวอย่าง "myKey = my value" เหมือนกับ "myKey = my value"
Paulo Merson

25

อักขระหลีกเริ่มต้นใน Java คือ '\'
อย่างไรก็ตามไฟล์คุณสมบัติ Java มีรูปแบบ key = value ควรพิจารณาทุกอย่างหลังจากครั้งแรกเท่ากับค่า


8
ยกเว้นช่องว่างนำหน้า (ไม่จำเป็นต้องใช้โอและ '=' ระหว่างคีย์และค่าอาจเป็น: หรือช่องว่าง)
Brad Cupit

16

วิธีที่ดีที่สุดในการหลีกเลี่ยงปัญหาประเภทนี้ในการสร้างคุณสมบัติโดยใช้โปรแกรมแล้วจัดเก็บ ตัวอย่างเช่นการใช้รหัสเช่นนี้:

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

อย่างที่คุณเห็นนี่เป็นวิธีง่ายๆในการสร้างเนื้อหาของไฟล์. คุณสมบัติที่รับประกันว่าถูกต้อง และคุณสามารถใส่คุณสมบัติได้มากเท่าที่คุณต้องการ


6

ในกรณีของฉัน '\\' ชั้นนำสองตัวทำงานได้ดีสำหรับฉัน

ตัวอย่างเช่นหากคำของคุณมีอักขระ "#" (เช่น aa # 100 คุณสามารถหลีกเลี่ยงได้โดยใช้ "\\" สองตัวนำหน้า

   key= aa\\#100


อย่างที่สองคุณต้องมีแบ็กสแลชสองตัว (glassfish 4.1 รุ่น 13)
Susanta

2

คุณสามารถดูได้ที่นี่คีย์ในคุณสมบัติ 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] ค่า: []


2

ในไฟล์ Spring หรือ Spring boot application.properties นี่คือวิธีการหลีกเลี่ยงอักขระพิเศษ

table.whereclause = โดยที่ id '\ =' 100


0

วิธีนี้จะช่วยในการสร้างค่าทางโปรแกรมที่รับประกันว่าเข้ากันได้กับ.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"

วิธีนี้มีราคาแพงเล็กน้อย แต่โดยทั่วไปการเขียนคุณสมบัติลงในไฟล์จะเป็นการดำเนินการแบบไม่ต่อเนื่อง


-1

ฉันสามารถป้อนค่าภายในอักขระ ":

db_user="postgresql"
db_passwd="this,is,my,password"

ทำไมต้องลงคะแนน? เป็นคำตอบที่แท้จริง :)
russellhoff

Op กล่าวว่าคุณสมบัติของ Java เครื่องหมายคำพูดไม่ทำงานเช่นนั้นในไฟล์คุณสมบัติ java
teknopaul
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.