คำถามติดแท็ก java

Java เป็นภาษาการเขียนโปรแกรมระดับสูงที่เป็นที่นิยม ใช้แท็กนี้เมื่อคุณมีปัญหาในการใช้หรือทำความเข้าใจภาษานั้น ๆ แท็กนี้ไม่ค่อยได้ใช้คนเดียวและมักใช้ร่วมกับ [สปริง], [สปริงบูต], [jakarta-ee], [android], [javafx], [gradle] และ [maven]

1
วิธี 'ติดตั้งปลั๊กอินนักเทียบท่า' สำหรับปลั๊กอินที่ใช้ json
ผมทำงานเกี่ยวกับแบรนด์ปลั๊กอินปริมาณใหม่และฉันต้องทุกฉบับทดสอบการทดสอบที่จะผ่าน และฉันมีการทดสอบทั้งหมดประสบความสำเร็จผ่าน (ในสภาพแวดล้อมที่มีปลั๊กอินติดตั้ง) docker plugin installยกเว้นคนแรกซึ่งเป็น สิ่งคือมีสามวิธีที่เป็นไปได้ที่หนึ่งสามารถติดตั้งปลั๊กอินที่กำหนดเอง: ไฟล์ .ock เป็นซ็อกเก็ตโดเมน UNIX ไฟล์. spec เป็นไฟล์ข้อความที่มี URL เช่น unix: ///other.sock หรือ tcp: // localhost: 8080 ไฟล์. json เป็นไฟล์ข้อความที่มีข้อกำหนดคุณสมบัติ json แบบเต็มสำหรับปลั๊กอิน และเราใช้ json ซึ่งเป็นเพียงเซิร์ฟเวอร์ REST ที่ใช้ API docker API (เขียนด้วย java, spring) กระบวนการติดตั้งมันตรงไปข้างหน้า: เพียงแค่คัดลอกไฟล์ json ใน/etc/docker/pluginsและ dockerd ค้นพบโดยอัตโนมัติ ปัญหาเกิดขึ้นเมื่อฉันพยายามรวมปลั๊กอินเข้ากับdocker plugin installคำสั่ง ตามที่ระบุไว้ที่นี่ : …
9 java  spring  docker 

1
การเริ่มต้นวัตถุใน Java“ Foo f = new Foo ()” เป็นหลักเหมือนกับการใช้ malloc สำหรับตัวชี้ใน C หรือไม่?
ฉันพยายามที่จะเข้าใจกระบวนการจริงของการสร้างวัตถุใน Java และฉันคิดว่าภาษาการเขียนโปรแกรมอื่น ๆ จะผิดไหมถ้าสมมติว่าการเริ่มต้นวัตถุใน Java นั้นเหมือนกับเมื่อคุณใช้ malloc สำหรับโครงสร้างใน C หรือไม่? ตัวอย่าง: Foo f = new Foo(10); typedef struct foo Foo; Foo *f = malloc(sizeof(Foo)); นี่คือสาเหตุที่วัตถุถูกกล่าวว่าอยู่บนกองมากกว่ากองซ้อนหรือไม่? เพราะพวกมันเป็นเพียงตัวชี้ไปยังข้อมูล?

3
วิธีคัดลอกไฟล์ข้อมูลขนาดใหญ่ทีละบรรทัด?
ฉันมีCSVไฟล์35GB ฉันต้องการอ่านแต่ละบรรทัดและเขียนบรรทัดออกเป็น CSV ใหม่หากตรงกับเงื่อนไข try (BufferedWriter writer = Files.newBufferedWriter(Paths.get("source.csv"))) { try (BufferedReader br = Files.newBufferedReader(Paths.get("target.csv"))) { br.lines().parallel() .filter(line -> StringUtils.isNotBlank(line)) //bit more complex in real world .forEach(line -> { writer.write(line + "\n"); }); } } สิ่งนี้ใช้เวลาประมาณ 7 นาที เป็นไปได้หรือไม่ที่จะเพิ่มความเร็วของกระบวนการนั้นให้มากขึ้น?

3
GRPC: สร้างไคลเอนต์ความเร็วสูงใน Java / Scala
ฉันมีบริการที่โอนข้อความในอัตราที่ค่อนข้างสูง ขณะนี้มีให้บริการโดย akka-tcp และสร้างข้อความ 3.5M ต่อนาที ฉันตัดสินใจที่จะลอง grpc โชคไม่ดีที่มันส่งผลให้ปริมาณงานน้อยลง: ~ 500k ข้อความต่อนาทียิ่งน้อยลง คุณช่วยแนะนำวิธีเพิ่มประสิทธิภาพได้ไหม การตั้งค่าของฉัน ฮาร์ดแวร์ : 32 แกน 24Gb กอง รุ่น grpc: 1.25.0 รูปแบบข้อความและจุดสิ้นสุด ข้อความนั้นเป็นฐานสองหยด สตรีม 100K - 1M และข้อความอื่น ๆ อีกมากมายในคำขอเดียวกัน (แบบอะซิงโครนัส) เซิร์ฟเวอร์ไม่ตอบสนองกับสิ่งใดลูกค้าใช้ผู้สังเกตการณ์แบบไม่มี op service MyService { rpc send (stream MyMessage) returns (stream DummyResponse); } message MyMessage { int64 …
9 java  scala  grpc 

2
ประสิทธิภาพของ FactoryFinder / การแคชไม่ดี
ฉันมีแอปพลิเคชัน Java ee ค่อนข้างใหญ่ที่มี classpath ขนาดใหญ่ที่ทำการประมวลผล xml จำนวนมาก ขณะนี้ฉันกำลังพยายามเพิ่มความเร็วฟังก์ชั่นบางอย่างของฉันและค้นหาเส้นทางของรหัสที่ช้าโดยใช้เครื่องมือเก็บตัวอย่าง สิ่งหนึ่งที่ฉันสังเกตเห็นคือโดยเฉพาะอย่างยิ่งส่วนต่าง ๆ ของรหัสของเราที่เรามีการเรียกเช่นTransformerFactory.newInstance(...)ช้ามาก ฉันติดตามสิ่งนี้เป็นFactoryFinderวิธีfindServiceProviderการสร้างServiceLoaderอินสแตนซ์ใหม่เสมอ ในServiceLoader javadocฉันพบบันทึกย่อต่อไปนี้เกี่ยวกับการแคช: ผู้ให้บริการตั้งอยู่และยกตัวอย่างขี้เกียจนั่นคือตามความต้องการ ตัวโหลดเซอร์วิสรักษาแคชของตัวให้บริการที่ถูกโหลดไปแล้ว การร้องขอเมธอด iterator แต่ละครั้งจะส่งคืนตัววนซ้ำที่ให้องค์ประกอบทั้งหมดของแคชตามลำดับการเริ่มต้นจากนั้นหาตำแหน่งอย่างเกียจคร้านแล้วค้นหาตำแหน่งของผู้ให้บริการที่เหลืออยู่อย่างเกียจคร้าน แคชสามารถล้างได้ด้วยวิธีการโหลดซ้ำ จนถึงตอนนี้ดีมาก นี่เป็นส่วนหนึ่งของFactoryFinder#findServiceProviderวิธีการOpenJDKs : private static <T> T findServiceProvider(final Class<T> type) throws TransformerFactoryConfigurationError { try { return AccessController.doPrivileged(new PrivilegedAction<T>() { public T run() { final ServiceLoader<T> serviceLoader = ServiceLoader.load(type); final …

3
ตัวแปรที่ผ่านมาจะส่งไฟล์ groovy
ฉันกำลังจัดการงานจำนวนมากในเจนกินส์โดยปลั๊กอิน DSL ปลั๊กอินนั้นใช้คำจำกัดความ. govov ดังนั้นฉันคิดว่าถึงแม้บางคนไม่ได้ใช้ Jenkins แต่การใช้ Groovy อาจช่วยได้ โดยทั่วไปฉันต้องการสร้างไฟล์เพิ่มเติมซึ่งอาจเป็นไฟล์ Groovy, JSON หรือ YAML ไม่ว่าจะเป็นอะไรก็ตาม สิ่งสำคัญคือความเป็นไปได้ในการเชื่อมต่อไฟล์นั้นด้วยไฟล์. groovy ของฉัน ในไฟล์นั้นฉันกำลังกำหนดตัวแปร (แทนที่จะเป็นแค่สตริง) เช่น IP address หรือสิ่งอื่น ๆ เช่น ip_gitlab: 1.2.3.4 default_user: admin ในไฟล์ Groovy ของฉันฉันต้องการใช้ตัวแปรเหล่านี้ วิธีการนั้นเป็นไปได้หรือเปล่า?
9 java  jenkins  groovy  dsl 

2
ใน Java เราควรใช้เมธอดอินสแตนซ์ส่วนตัวในอินเตอร์เฟสเมื่อใด
ในฐานะของ Java 9 วิธีการในอินเตอร์เฟสสามารถเป็นส่วนตัวได้ วิธีการส่วนตัวสามารถคงที่หรือวิธีการอินสแตนซ์ เนื่องจากไพรเวตเมธอดสามารถใช้ได้เฉพาะในเมธอดของอินเตอร์เฟสเองเท่านั้นการใช้งานจึง จำกัด เฉพาะวิธีการช่วยเหลือสำหรับเมธอดอื่นของอินเตอร์เฟส Cay S. Horstmann, Core Java Volume I - ความรู้พื้นฐาน ฉันเข้าใจว่าเราสามารถใส่ฟังก์ชั่นทั่วไปในวิธีการส่วนตัวและไม่ให้สาธารณชนเข้าถึงได้ แต่เรามีวิธีส่วนตัวสองแบบที่นี่: private private static การใช้private staticวิธีการนั้นเป็นสิ่งที่เข้าใจได้ แต่เราควรใช้privateวิธีการเมื่อใด เราไม่ได้จัดการกับอินสแตนซ์ที่นี่เนื่องจากเป็นอินเทอร์เฟซดังนั้นทำไมจึงprivateอนุญาตให้สร้างวิธีได้ เราไม่ต้องการprivate staticวิธีการอย่างเดียวเหรอ?
9 java  oop 

3
ส่งคืนรายการเริ่มต้นหากรายการว่างเปล่าโดยใช้ java 8 Streams?
มีวิธีใดบ้างเพื่อให้สามารถดำเนินการด้านล่างเป็นชุดการดำเนินการสตรีมหนึ่งชุดแทนการตรวจสอบอย่างชัดเจนว่าถ้า RecommendedProducts ว่างเปล่าจากนั้นส่งคืนรายการเริ่มต้นมิฉะนั้นจะส่งคืนรายการที่กรองหรือไม่ public List<Product> getRecommendedProducts() { List<Product> recommendedProducts = this.newProducts .stream() .filter(isAvailable) .collect(Collectors.toList()); if (recommendedProducts.isEmpty()) { return DEFAULT_PRODUCTS; } return recommededProducts; }

1
การใช้ตัวดัดแปลงการเข้าถึงสมาชิกที่ จำกัด น้อยกว่าตัวดัดแปลงการเข้าถึงคลาสคืออะไร?
ว่าฉันมีชั้นเรียนที่มีสมาชิกบางคนและสมาชิกมีตัวดัดแปลงการเข้าถึงที่ จำกัด น้อยกว่าชั้นเรียน ตัวอย่างที่เป็นรูปธรรมอาจเป็น: package apples; class A { // package private public int foo() { // public (=> less restrictive than *package private*) return 42; } } เพื่อความเข้าใจของฉันระดับปรับปรุงการเข้าถึงที่เป็นที่เข้มงวดมากขึ้นกว่าสมาชิกปรับปรุงการเข้าถึงจะแทนที่ข้อ จำกัด น้อยกว่าสมาชิกปรับเปลี่ยนการเข้าถึง ดังนั้นข้อ จำกัด น้อยกว่าสมาชิกปรับปรุงการเข้าถึงควรจะมีผลที่ทุกคน ความเข้าใจของฉันถูกต้องหรือไม่ ถ้าไม่จะเกิดอะไรขึ้น อะไรคือเหตุผลที่ถูกต้องที่จะมีตัวดัดแปลงการเข้าถึงสมาชิกที่ จำกัด น้อยกว่า ในที่สุดมีวิธีปฏิบัติที่ดีที่สุดในการติดตามคืออะไร ฉันยังทำการทดลองบางอย่างเพราะฉันคิดว่ามันอาจมีผลตามมาเมื่อฉันเริ่มส่งการอ้างอิงฟังก์ชั่นไปรอบ ๆ อย่างไรก็ตามถึงกระนั้นตัวดัดแปลงการเข้าถึงก็ดูเหมือนจะไม่สำคัญ สถานการณ์ที่ฉันสร้างขึ้นมีดังนี้: apples.Bมีวิธีการที่ประชาชนที่ส่งกลับอ้างอิงถึงbla()apples.A.foo จากนั้นpizzas.Cเรียกapples.B.blaเพื่อขอรับการอ้างอิงA.fooและเรียกใช้ ดังนั้นA.foo()ไม่สามารถมองเห็นได้โดยตรงCแต่สามารถเข้าถึงได้ทางอ้อมเท่านั้นB.bla() ฉันทดสอบแล้วและมันก็ไม่ได้สร้างความแตกต่างไม่ว่าฉันจะปรับปรุงการเข้าถึงของfoo() แพคเกจส่วนตัวหรือไม่ package …

2
ส่งกระแสข้อมูล Akka ไปยังบริการอัปสตรีมเพื่อเติมข้อมูล
ฉันจำเป็นต้องเรียกใช้บริการอัปสตรีม (Azure Blob Service) เพื่อส่งข้อมูลไปยัง OutputStream ซึ่งฉันต้องเปิดและส่งกลับไปยังไคลเอนต์ถึง akka หากไม่มี akka (และเพียงรหัส servlet) ฉันจะได้รับ ServletOutputStream และส่งต่อไปยังวิธีการของบริการ Azure ที่ใกล้ที่สุดที่ฉันสามารถพยายามสะดุดและชัดเจนว่านี่เป็นสิ่งที่ผิดคืออะไรเช่นนี้ Source<ByteString, OutputStream> source = StreamConverters.asOutputStream().mapMaterializedValue(os -> { blobClient.download(os); return os; }); ResponseEntity resposeEntity = HttpEntities.create(ContentTypes.APPLICATION_OCTET_STREAM, preAuthData.getFileSize(), source); sender().tell(new RequestResult(resposeEntity, StatusCodes.OK), self()); แนวคิดคือฉันกำลังเรียกใช้บริการ upstream เพื่อรับข้อมูลขาออกโดยการเรียก blobClient.download (os) ดูเหมือนว่าฟังก์ชั่นแลมบ์ดาได้รับการโทรและส่งคืน แต่หลังจากนั้นมันก็ล้มเหลวเนื่องจากไม่มีข้อมูลหรืออะไรบางอย่าง ราวกับว่าฉันไม่ควรที่จะมีฟังก์ชั่นแลมบ์ดาทำงาน แต่อาจส่งคืนวัตถุบางอย่างที่ทำงานได้หรือไม่ ไม่แน่ใจ. คนเราจะทำสิ่งนี้ได้อย่างไร

4
วิธีที่มีประสิทธิภาพในการวนซ้ำและคัดลอกค่าของ HashMap
ฉันต้องการแปลง: Map<String, Map<String, List<Map<String, String>>>> inputMap ถึง: Map<String, Map<String, CustomObject>> customMap inputMapมีให้ในการกำหนดค่าและพร้อม แต่ฉันต้องการcustomMapจัดรูปแบบ CustomObject จะได้มาจากการList<Map<String, String>>ใช้โค้ดไม่กี่บรรทัดในฟังก์ชั่น ฉันได้ลองวิธีการทำแผนที่อินพุตซ้ำและคัดลอกค่าคีย์ใน customMap แล้ว มีวิธีที่มีประสิทธิภาพในการทำเช่นนั้นโดยใช้ Java 8 หรือทางลัดอื่น ๆ ? Map<String, Map<String, List<Map<String, String>>>> configuredMap = new HashMap<>(); Map<String, Map<String, CustomObj>> finalMap = new HashMap<>(); for (Map.Entry<String, Map<String, List<Map<String, String>>>> attributeEntry : configuredMap.entrySet()) { Map<String, …

2
ฉันจะคัดลอกคอลเลกชันอย่างปลอดภัยได้อย่างไร
ในอดีตฉันได้กล่าวว่าการคัดลอกคอลเลกชันอย่างปลอดภัยทำบางสิ่งเช่น: public static void doThing(List<String> strs) { List<String> newStrs = new ArrayList<>(strs); หรือ public static void doThing(NavigableSet<String> strs) { NavigableSet<String> newStrs = new TreeSet<>(strs); แต่ตัวสร้าง "สำเนา" เหล่านี้มีวิธีการสร้างและสตรีมแบบสแตติกที่คล้ายกันปลอดภัยจริงๆและมีการระบุกฎไว้ที่ไหนบ้าง โดยความปลอดภัยฉันหมายถึงการรับประกันความสมบูรณ์แบบพื้นฐานทางความหมายของภาษาจาวาและคอลเลกชันที่บังคับใช้กับผู้โทรที่เป็นอันตรายโดยสมมติว่าได้รับการสนับสนุนจากเหตุผลที่สมเหตุสมผลSecurityManagerและไม่มีข้อบกพร่องใด ๆ ฉันมีความสุขด้วยวิธีการขว้างปาConcurrentModificationException, NullPointerException, IllegalArgumentException, ClassCastExceptionฯลฯ หรือบางทีอาจจะแขวน ฉันได้เลือกStringเป็นตัวอย่างของการโต้แย้งประเภทไม่เปลี่ยนรูป สำหรับคำถามนี้ฉันไม่สนใจสำเนาชุดลึกสำหรับคอลเล็กชั่นที่ไม่แน่นอนซึ่งมี gotchas ของตัวเอง (เพื่อความชัดเจนฉันได้ดูซอร์สโค้ด OpenJDK และมีคำตอบบางอย่างสำหรับArrayListและTreeSet.)

2
OutOfMemoryException แม้จะใช้ WeakHashMap
หากไม่โทรSystem.gc()ระบบจะส่ง OutOfMemoryException ฉันไม่รู้ว่าทำไมฉันต้องโทรหาSystem.gc()อย่างชัดเจน JVM ควรเรียกgc()ตัวเองใช่ไหม กรุณาแนะนำ ต่อไปนี้เป็นรหัสทดสอบของฉัน: public static void main(String[] args) throws InterruptedException { WeakHashMap<String, int[]> hm = new WeakHashMap<>(); int i = 0; while(true) { Thread.sleep(1000); i++; String key = new String(new Integer(i).toString()); System.out.println(String.format("add new element %d", i)); hm.put(key, new int[1024 * 10000]); key = null; //System.gc(); } …

2
วิธีการหลีกเลี่ยงการทำซ้ำของรหัสที่เกี่ยวกับประเภทดั้งเดิม?
พื้นหลัง กระแสข้อมูลบิตได้รับการสนับสนุนโดยอาร์เรย์ของไบต์ มีวิธีการจำนวนหนึ่งที่อ่านจากอาร์เรย์ไบต์นั้นไปยังอาร์เรย์ดั้งเดิมแบบบังคับ ปัญหา มีรหัสซ้ำอยู่ Java ไม่มีข้อมูลทั่วไปเกี่ยวกับประเภทดั้งเดิมดังนั้นบางทีการทำซ้ำอาจไม่สามารถหลีกเลี่ยงได้ รหัส รหัสซ้ำจะปรากฏในวิธีการต่อไปนี้: @Override public long readBytes(final byte[] out, final int offset, final int count, final int bits) { final int total = offset + count; assert out != null; assert total <= out.length; final long startPosition = position(); for (int i = offset; …

3
ผู้เรียกฟังข้อความ JMS ล้มเหลวสาเหตุ: ตัวระบุมีอักขระตัวระบุ JMS ที่ไม่ถูกต้อง '-': 'x-request-id'
ฉันทำงานกับ JMS และคิว (Azure queues) เป็นครั้งแรก ฉันต้องสร้างคิวที่เซิร์ฟเวอร์ Rubi จะเขียนข้อมูลบางส่วนและ Java จะอ่านจากคิวและจะดำเนินการต่อไป กระบวนการนี้ทำงานได้ดีบนเครื่องของฉัน ฉันได้สร้าง REST endpoint ซึ่งกำลังเขียนข้อมูลในคิวและเมื่อข้อมูลถูกเขียนในคิวผู้ฟังจะเข้ามาและอ่านข้อมูลและดำเนินการ เมื่อเราปรับใช้กับ Azure ข้อผิดพลาดที่ฉันเห็นในบันทึกซึ่งไม่อนุญาตให้เริ่มคิวคือ Setup of JMS message listener invoker failed for destination 'queue' - trying to recover. Cause: Identifier contains invalid JMS identifier character '-': 'x-request-id' Zipkin มีอยู่ในเซิร์ฟเวอร์ Azure เป็นระบบติดตามแบบกระจายและฉันเดาว่านี่x-request-idเกี่ยวข้องกับ Zipkin ซึ่งกำลังสร้างปัญหา ฉันค้นหาปัญหาแล้ว แต่ไม่เข้าใจว่าทำไม …

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