2.5 控制檯輸入與輸出
2.5.1 控制檯輸入
在 Java 中,可以使用 Scanner 類來實現控制檯輸入。Scanner 類位於 java.util 包中,因此在使用 Scanner 類之前需要先匯入該包。
import java.util.Scanner;
使用 Scanner 類實現控制檯輸入的步驟如下:
- 建立 Scanner 物件,並將控制檯輸入流作為引數傳遞給 Scanner 構造方法。
Scanner scanner = new Scanner(System.in);
- 使用 Scanner 物件的相應方法讀取控制檯輸入的資料。
scanner.nextInt();
- 關閉 Scanner 物件。
scanner.close();
1.從控制檯輸入整數
下面例項是接收使用者輸入的資料且輸出平均值:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入第一個整數:");
int a = scanner.nextInt();
System.out.print("請輸入第二個整數:");
int b = scanner.nextInt();
System.out.print("請輸入第三個整數:");
int c = scanner.nextInt();
int sum = a + b + c;
double average = sum / 3.0;
System.out.println("三個整數的平均值為:" + average);
scanner.close();
}
}
在上述程式碼中,首先建立了一個 Scanner 物件 scanner,然後使用 scanner.nextInt()方法讀取使用者輸入的整數,並將其賦值給變數 a、b 和 c。接著,計算三個整數的和,並計算平均值,最後使用 System.out.println()方法輸出結果。最後,呼叫 scanner.close()方法關閉 Scanner 物件。
2.從控制檯輸入浮點數
下面例項是接收使用者輸入的資料且輸出平均值:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入第一個浮點數:");
double a = scanner.nextDouble();
System.out.print("請輸入第二個浮點數:");
double b = scanner.nextDouble();
System.out.print("請輸入第三個浮點數:");
double c = scanner.nextDouble();
double sum = a + b + c;
double average = sum / 3.0;
System.out.println("三個浮點數的平均值為:" + average);
scanner.close();
}
}
在上述程式碼中,首先建立了一個 Scanner 物件 scanner,然後使用 scanner.nextDouble()方法讀取使用者輸入的浮點數,並將其賦值給變數 a、b 和 c。接著,計算三個浮點數的和,並計算平均值,最後使用 System.out.println()方法輸出結果。最後,呼叫 scanner.close()方法關閉 Scanner 物件。
3.從控制檯輸入字串
下面例項是接收使用者輸入的資料且輸出字串:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入一個字串:");
String str = scanner.nextLine();
System.out.println("你輸入的字串是:" + str);
scanner.close();
}
}
上述程式碼中,首先建立了一個 Scanner 物件 scanner,然後使用 scanner.nextLine()方法讀取使用者輸入的字串,並將其賦值給變數 str。接著,使用 System.out.println()方法輸出結果。最後,呼叫 scanner.close()方法關閉 Scanner 物件。
4.其它型別資料的輸入
除了上述的輸入型別,還有其它型別的資料輸入,如:nextByte()
, nextShort()
, nextLong()
, nextFloat()
, nextDouble()
等。這些方法的使用方式與 nextDouble()
類似,都是透過建立 Scanner 物件,然後使用相應的方法讀取使用者輸入的資料,並將其賦值給相應的變數。
瞭解更多輸入方式
****5.從檔案中讀取資料
除了從控制檯讀取資料,還可以從檔案中讀取資料。下面例項是讀取檔案中的資料並輸出:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new FileReader("data.txt"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述程式碼中,首先建立了一個 BufferedReader 物件 reader,然後使用 reader.readLine()方法讀取檔案中的每一行資料,並將其輸出。最後,呼叫 reader.close()方法關閉 BufferedReader 物件。
6.從網路中讀取資料
除了從檔案和網路中讀取資料,還可以從網路中讀取資料。下面例項是讀取網路中的資料並輸出:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
public class Main {
public static void main(String[] args) {
try {
URL url = new URL("http://www.example.com");
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述程式碼中,首先建立了一個 URL 物件 url,然後使用 url.openStream()方法開啟網路連線,並建立了一個 BufferedReader 物件 reader。接著,使用 reader.readLine()方法讀取網路中的每一行資料,並將其輸出。最後,呼叫 reader.close()方法關閉 BufferedReader 物件。
7.從鍵盤讀取資料
除了從檔案和網路中讀取資料,還可以從鍵盤讀取資料。下面例項是讀取鍵盤輸入的資料並輸出:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("請輸入內容:");
String line = reader.readLine();
System.out.println("您輸入的內容是:" + line);
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
上述程式碼中,首先建立了一個 BufferedReader 物件 reader,然後使用 reader.readLine()方法讀取鍵盤輸入的內容,並將其輸出。最後,呼叫 reader.close()方法關閉 BufferedReader 物件。
#### 8.從控制檯讀取資料
除了從鍵盤讀取資料,還可以從控制檯讀取資料。下面例項是讀取控制檯輸入的資料並輸出:
```java
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("請輸入內容:");
String line = reader.readLine();
System.out.println("您輸入的內容是:" + line);
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述程式碼中,首先建立了一個 BufferedReader 物件 reader,然後使用 reader.readLine()方法讀取控制檯輸入的內容,並將其輸出。最後,呼叫 reader.close()方法關閉 BufferedReader 物件。
2.5.2 格式化輸出
前面我們使用System.out.println()
輸出換行,和System.out.print()
輸出不換行,但是這兩個方法都不能對輸出的內容進行格式化。如果需要對輸出內容進行格式化,可以使用System.out.printf()
方法。System.out.printf()
方法類似於 C 語言中的 printf()函式,可以按照指定的格式輸出資料。下面例項演示瞭如何使用 printf()方法進行格式化輸出:
1.使用 printf()方法
public class Main {
public static void main(String[] args) {
int num = 10;
double pi = 3.14159;
String name = "張三";
System.out.printf("整數:%d,浮點數:%f,字串:%s\n", num, pi, name);
}
}
上述程式碼中,使用 printf()方法按照指定的格式輸出整數、浮點數和字串。其中,
- %d 表示輸出整數,
- %f 表示輸出浮點數,
- %s 表示輸出字串。
2.使用 String.format()方法
在 Java 中,還可以使用 String.format()方法進行格式化輸出。String.format()方法可以將格式化的字串返回,而不是直接輸出。下面例項演示瞭如何使用 String.format()方法進行格式化輸出:
public class Main {
public static void main(String[] args) {
int num = 10;
double pi = 3.14159;
String name = "張三";
String result = String.format("整數:%d,浮點數:%f,字串:%s", num, pi, name);
System.out.println(result);
}
}
上述程式碼中,使用 String.format()方法按照指定的格式輸出整數、浮點數和字串,並將結果儲存在 result 變數中,最後輸出 result 變數的值。
其它輸出:
int num = 10;
final double pi = 3.14159;
String name = "張三";
System.out.printf("%9.2f\n",pi);//9.2 中9為長度,2為小數位數,`\n`表示換行
System.out.printf("%+9.2f\n",pi);//+ 表示輸出的數帶正負號
System.out.printf("%+9.2f\n",pi);//+ 表示輸出的數帶正負號
System.out.printf("%-9.2f\n",pi);//- 表示左對齊
System.out.printf("%+-9.2f\n",pi);//- 表示輸出的數帶正負號且左對齊
瞭解更多輸出輸入方式
### 2.5.3 輸出重定向在 Java 中,可以使用 System.setOut()方法將輸出重定向到指定的輸出流中。下面例項演示瞭如何將輸出重定向到檔案中:
import java.io.*;
public class Main {
public static void main(String[] args) {
try {
// 建立檔案輸出流
FileOutputStream fos = new FileOutputStream("output.txt");
// 建立PrintStream物件,將輸出重定向到檔案輸出流
PrintStream ps = new PrintStream(fos);
// 將標準輸出流重定向到PrintStream物件
System.setOut(ps);
// 輸出內容到檔案
System.out.println("Hello, World!");
// 關閉檔案輸出流
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述程式碼中,首先建立一個檔案輸出流,然後建立一個 PrintStream 物件,將輸出重定向到檔案輸出流。接著,使用 System.setOut()方法將標準輸出流重定向到 PrintStream 物件。最後,使用 System.out.println()方法輸出內容到檔案中。
2.5.4 輸入重定向
在 Java 中,可以使用 System.setIn()方法將輸入重定向到指定的輸入流中。下面例項演示瞭如何將輸入重定向到檔案中:
import java.io.*;
public class Main {
public static void main(String[] args) {
try {
// 建立檔案輸入流
FileInputStream fis = new FileInputStream("input.txt");
// 將標準輸入流重定向到檔案輸入流
System.setIn(fis);
// 建立Scanner物件,從標準輸入流中讀取資料
Scanner scanner = new Scanner(System.in);
// 讀取輸入內容
String input = scanner.nextLine();
// 輸出讀取的內容
System.out.println("輸入內容為:" + input);
// 關閉檔案輸入流
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述程式碼中,首先建立一個檔案輸入流,然後使用 System.setIn()方法將標準輸入流重定向到檔案輸入流。接著,建立一個 Scanner 物件,從標準輸入流中讀取資料。最後,輸出讀取的內容。
2.5.5 管道流
在 Java 中,可以使用 PipedInputStream 和 PipedOutputStream 類來實現管道流。管道流可以在兩個執行緒之間傳遞資料。下面例項演示瞭如何使用管道流:
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
// 建立管道輸入流和管道輸出流
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream(pis);
// 建立執行緒1,將資料寫入管道輸出流
Thread writerThread = new Thread(() -> {
try {
pos.write("Hello, World!".getBytes());
pos.close();
} catch (IOException e) {
e.printStackTrace();
}
});
// 建立執行緒2,從管道輸入流中讀取資料
Thread readerThread = new Thread(() -> {
try {
byte[] buffer = new byte[1024];
int length = pis.read(buffer);
String message = new String(buffer, 0, length);
System.out.println("讀取到的資料為:" + message);
pis.close();
} catch (IOException e) {
e.printStackTrace();
}
});
// 啟動執行緒
writerThread.start();
readerThread.start();
}
}
在上面的示例中,我們建立了兩個執行緒,一個執行緒將資料寫入管道輸出流,另一個執行緒從管道輸入流中讀取資料。當管道輸出流關閉時,管道輸入流也會自動關閉。
2.6 案例:查詢銀行賬戶餘額
2.6.1 需求分析
輸入被查詢的客戶的姓名,輸出該客戶的賬戶餘額。
查詢條件:輸入客戶姓名,按照格式要求輸出賬戶餘額。
2.6.2 設計思路
- 定義一個類BankOuery,包含一個main方法。
- 在main方法中,使用Scanner類獲取使用者輸入的客戶姓名。
- 根據客戶姓名,查詢賬戶餘額,並輸出結果。
2.6.3 程式碼實現
//PorjectNane: SE_java_EXP_E002
package cn.campsg.java.experiment;
import java.util.Scanner;
public class BankQuery {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入被查詢的客戶的姓名:");
String name = scanner.nextLine();
// 根據姓名查詢賬戶餘額
float money = 8888f;
System.out.printf("尊敬的客戶:%s\n您的餘額餘額為:%.1f\n", name, money);
}
}
在上面的示例中,我們使用Scanner類獲取使用者輸入的客戶姓名,然後呼叫System.out.printf()
格式化輸出帳戶姓名和餘額,在實際應用中,我們需要根據具體的業務邏輯來實現查詢賬戶餘額的功能。
案例擴充套件
import java.util.Scanner;
public class BankAccount {
private double balance;
public BankAccount(double initialBalance) {
this.balance = initialBalance;
}
public synchronized void deposit(double amount) {
balance += amount;
System.out.println("存款:" + amount);
System.out.println("當前餘額:" + balance);
}
public synchronized void withdraw(double amount) {
if (balance >= amount) {
balance -= amount;
System.out.println("取款:" + amount);
System.out.println("當前餘額:" + balance);
} else {
System.out.println("餘額不足,無法取款:" + amount);
}
}
public static void main(String[] args) {
BankAccount account = new BankAccount(1000);
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("請選擇操作:1.存款 2.取款 3.退出");
int choice = scanner.nextInt();
switch (choice) {
case 1:
System.out.println("請輸入存款金額:");
double depositAmount = scanner.nextDouble();
account.deposit(depositAmount);
break;
case 2:
System.out.println("請輸入取款金額:");
double withdrawAmount = scanner.nextDouble();
account.withdraw(withdrawAmount);
break;
case 3:
System.exit(0);
break;
default:
}
}
}
}
在這個例子中,我們建立了一個名為BankAccount
的類,它有一個balance
屬性和一個deposit
方法。deposit
方法用於存款,它接受一個引數amount
,表示存款金額。如果存款金額大於0,則將金額加到balance
屬性上,並列印存款成功的資訊;否則,列印存款失敗的資訊。
在main
方法中,我們建立了一個BankAccount
物件account
,並使用Scanner
類從控制檯讀取使用者輸入。根據使用者的選擇,我們呼叫account
物件的deposit
方法進行存款操作,或者呼叫account
物件的withdraw
方法進行取款操作。如果使用者選擇退出,則使用System.exit(0)
方法退出程式。
import java.util.Scanner;
public class BankAccount {
private double balance;
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
System.out.println("存款成功,當前餘額為:" + balance);
} else {
System.out.println("存款失敗,存款金額必須大於0");
}
}
public static void main(String[] args) {
BankAccount account = new BankAccount();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("請選擇操作:1.存款 2.取款 3.退出");
int choice = scanner.nextInt();
switch (choice) {
case 1:
System.out.println("請輸入存款金額:");
double depositAmount = scanner.nextDouble();
account.deposit(depositAmount);
break;
case 2:
System.out.println("請輸入取款金額:");
double withdrawAmount = scanner.nextDouble();
account.withdraw(withdrawAmount);
break;
case 3:
System.exit(0);
break;
default:
}
}
}
}
2. 編寫一個Java程式,實現一個簡單的計算器,可以進行加、減、乘、除運算。要求使用者輸入兩個數字和一個運算子,然後輸出運算結果。
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入第一個數字:");
double num1 = scanner.nextDouble();
System.out.println("請輸入第二個數字:");
double num2 = scanner.nextDouble();
System.out.println("請輸入運算子(+、-、*、/):");
String operator = scanner.next();
double result = 0;
switch (operator) {
case "+":
result = num1 + num2;
break;
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
case "/":
result = num1 / num2;
break;
default:
System.out.println("無效的運算子");
return;
}
System.out.println("運算結果為:" + result);
}
}
3. 編寫一個Java程式,實現一個簡單的學生管理系統,要求能夠新增、刪除、修改和查詢學生資訊。學生資訊包括姓名、年齡和成績。
import java.util.ArrayList;
import java.util.Scanner;
public class StudentManagementSystem {
public static void main(String[] args) {
}
}