2010-11-17 45 views
63

Tôi đang sử dụng readLine của BufferedReader để nhận mật khẩu đầu vào/mới từ người dùng, nhưng muốn che mật khẩu vì vậy tôi đang cố gắng sử dụng lớp java.io.Console. Vấn đề là System.console() trả về null khi một ứng dụng được gỡ lỗi trong Eclipse. Tôi mới với Java và Eclipse không chắc chắn đây có phải là cách tốt nhất để đạt được không? Tôi nhấp chuột phải vào tập tin nguồn và chọn "Debug As"> "Java Application". Có bất kỳ công việc xung quanh?System.console() trả về null

+1

Cũng xem http://stackoverflow.com/questions/26470972/trying-to-read-from-console-java/26473083#26473083 Tôi đã xác định 'System.out' và' System.in' là đủ cho trường hợp sử dụng của tôi và abondaned bằng cách sử dụng 'System.console()'. – OneWorld

Trả lời

0

Đúng vậy.

Bạn sẽ phải chạy ứng dụng bên ngoài Eclipse. Xem các bảng cấu hình của trình khởi chạy trong Eclipse và xem liệu bạn có thể phát hiện ra tùy chọn mà nói để chạy lệnh trong một JVM riêng biệt.

1

Tôi tin rằng trong các cấu hình chạy cho Eclipse, bạn có thể định cấu hình có gán giao diện điều khiển hay không - đảm bảo điều này được chọn. (Đã một thời gian kể từ khi tôi sử dụng Eclipse nên tôi không thể đưa ra những chỉ dẫn cụ thể mà tôi sợ).

Nếu điều đó không có tác dụng, thì điều chắc chắn sẽ làm công việc này là bắt đầu ứng dụng của bạn ở chế độ gỡ lỗi, sau đó kết nối với tiến trình với Eclipse. Tìm kiếm "eclipse remote debugging" nếu bạn không chắc chắn cách thực hiện điều này. Ngoài ra, nói chung, một ý tưởng không tốt là yêu cầu một bàn điều khiển được gán vì điều này ảnh hưởng rất nhiều đến tính linh hoạt của ứng dụng của bạn - như bạn vừa phát hiện ra. Nhiều cách để gọi Java sẽ không gán một bàn điều khiển và ứng dụng của bạn không thể sử dụng được trong các trường hợp này (điều này là xấu). Có lẽ bạn có thể cho phép các đối số được chỉ định trên dòng lệnh. (Nếu bạn đang kiểm tra đầu vào giao diện điều khiển cụ thể thì đủ công bằng, nhưng nó sẽ có khả năng hữu ích để mọi người có thể gọi ứng dụng của bạn từ tập lệnh và/hoặc trên máy chủ không đầu, vì vậy loại thiết kế linh hoạt này hầu như luôn là ý tưởng hay . nó thường dẫn đến mã tốt hơn tổ chức tốt, quá)

+0

có nó chỉ dành cho mục đích gỡ lỗi của tôi, người dùng sẽ nhận được tập lệnh shell hoặc tập tin bat. Nó không phải là gud để sử dụng giao diện điều khiển? nếu có cách nào tốt hơn là – Gauls

+0

BTW tất cả các cuộc thảo luận tìm kiếm gỡ lỗi từ xa abt máy chủ web, nhưng tôi không tạo ra một ứng dụng web. đây là một java đơn giản. có thể là cách tốt hơn để che mật khẩu? – Gauls

+0

Bạn có thể gỡ lỗi từ xa bất kỳ quá trình Java nào, chỉ cần thêm ví dụ '-Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, address = 8000' cho các đối số của VM (ít nhất là trên Sun JVM). Sử dụng giao diện điều khiển có thể được OK, nhưng như đã chỉ ra có nghĩa là mã của bạn chỉ đơn giản là * sẽ không hoạt động * khi khởi chạy mà không có. Thay vào đó, hãy cân nhắc truyền các giá trị trực tiếp từ các đối số dòng lệnh, thuộc tính hệ thống, tệp thuộc tính, v.v. Ít nhất cung cấp một số thay thế - ví dụ: chỉ đi đến bàn điều khiển nếu một giá trị * không * được cung cấp dưới dạng đối số dòng lệnh. –

6

theo docs:.

Nếu máy ảo được bắt đầu tự động, ví dụ bằng một lịch trình công việc nền, sau đó nó sẽ thường không có một giao diện điều khiển.

+1

Câu trả lời này dẫn tôi đến để thấy rằng nếu bạn đang chạy Gradle với deamon được kích hoạt, bạn sẽ không thể có được một giao diện điều khiển trong nhiệm vụ Gradle của bạn. Chạy nhiệm vụ Gradle của tôi với '--no-daemon' cho phép truy cập bảng điều khiển. – whitespy9

+0

Điều này xảy ra với tôi khi sử dụng nhỏ giọt (https://github.com/ninjudd/drip) cho một công cụ dòng lệnh. Rất tiếc! –

11

System.console() trả về null nếu không có bảng điều khiển.

Bạn có thể làm việc theo cách này bằng cách adding a layer of indirection to your code hoặc bằng cách chạy mã trong bảng điều khiển bên ngoài và attaching a remote debugger.

+0

Nó cũng trả về null cho tôi trong PowerShell khi chạy một cái gì đó như 'java -cp ... Class | tee out'. –

-1

thêm -console trong đối số chương trình của bạn để bắt đầu OSGi console

+1

bạn có thể làm rõ thêm về điều này nếu có thể không? – Gauls

27

Đoạn mã này nên làm như lừa:

private String readLine(String format, Object... args) throws IOException { 
    if (System.console() != null) { 
     return System.console().readLine(format, args); 
    } 
    System.out.print(String.format(format, args)); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(
      System.in)); 
    return reader.readLine(); 
} 

private char[] readPassword(String format, Object... args) 
     throws IOException { 
    if (System.console() != null) 
     return System.console().readPassword(format, args); 
    return this.readLine(format, args).toCharArray(); 
} 

Trong khi kiểm tra trong Eclipse , thông tin nhập mật khẩu của bạn sẽ được hiển thị rõ ràng. Ít nhất, bạn sẽ có thể kiểm tra. Chỉ cần không nhập mật khẩu thực của bạn trong khi thử nghiệm. Giữ nó để sử dụng sản xuất;).

+0

Phương pháp 'readLine' được cuộn tay của bạn có đóng' BufferedReader' trong khối cuối cùng (hoặc try-with-resources) không? –

+0

Không vì điều đó sẽ đóng kết hợp luồng 'System.in' và không thể đọc thêm sau đó. – formixian

+0

Vâng, thật kỳ lạ khi luồng này có thể bị đóng; Tôi mong đợi nó sẽ là một no-op. –

6

Tôi cũng gặp sự cố này khi cố viết một ứng dụng dòng lệnh đơn giản.

Một cách khác để tạo ra đối tượng BufferedReader riêng của bạn từ System.in là sử dụng java.util.Scanner như thế này:

import java.util.Scanner; 

Scanner in; 
in = new Scanner(System.in); 

String s = in.nextLine(); 

Tất nhiên điều này sẽ không được một thả thay thế cho Console, nhưng sẽ cung cấp cho bạn quyền truy cập vào nhiều chức năng đầu vào khác nhau.

Đây là more documentation on Scanner from Oracle.

5

Theo API:

"Tôi f máy ảo được bắt đầu từ một dòng lệnh tương tác mà không cần chuyển hướng đầu vào và đầu ra suối tiêu chuẩn sau đó giao diện điều khiển của nó sẽ tồn tại và thường sẽ được kết nối với bàn phím và hiển thị từ đó máy ảo đã được khởi động. Nếu máy ảo được khởi động tự động, ví dụ bằng trình lên lịch công việc nền, thì nó thường sẽ không có bàn điều khiển. "