天天看點

Java學習路線-28:JavaIO程式設計案例第20 章 : JavaIO程式設計案例

第20 章 : JavaIO程式設計案例

91 數字大小比較

輸入3個整數,并求出3個整數最大值和最小值

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


class InputUtil {
    /**
     * 讀取指定個數的整數輸入
     *
     * @param num 指定要輸入的整數個數
     * @return 所有讀取的整數數組
     * @throws IOException
     */
    public static int[] getIntList(int num) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("請輸入" + num + "個整數:");

        int[] list = new int[num];
        int count = 0;

        while (count < num) {
            String msg = reader.readLine();

            if (msg.matches("\\d+")) {
                list[count++] = Integer.parseInt(msg);
            } else {
                System.out.println("請輸入整數");
            }
        }

        reader.close();
        return list;
    }
}


class NumberUtil {
    /**
     * 擷取int 型數組中最大值和最小值
     *
     * @param list 整數數組
     * @return int[] {max, min}
     */
    public static int[] getMaxMin(int[] list) {
        int max = list[0];
        int min = list[0];

        for (int x : list) {
            if (x > max) {
                max = x;
            }
            if (min > x) {
                min = x;
            }
        }
        return new int[]{max, min};
    }

}


class Demo {
    public static void main(String[] args) throws IOException {

        // 讀取3個資料
        int[] list = InputUtil.getIntList(3);
        int[] data = NumberUtil.getMaxMin(list);

        System.out.println("最大值:" + data[0]);
        System.out.println("最小值:" + data[1]);

    }
}      

92 檔案儲存

從鍵盤輸入檔案名和檔案内容,然後将檔案内容儲存到檔案中

1、定義接口

2、工具類

3、實作接口類

4、工廠類

5、測試函數

import java.io.*;


class InputUtil {
    private static final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static String getInput(String prompt) {

        System.out.println(prompt);
        String msg = null;

        while (true) {
            try {
                msg = reader.readLine();
                if (!"".equals(msg)) {
                    break;
                } else {
                    System.out.println("請輸入非空字元串:");
                }
            } catch (IOException e) {

            }
        }
        return msg;
    }
}

interface IFileService {
    public static final String FILE_DIR = "demo";

    public boolean save();
}


class FileServiceImpl implements IFileService {

    private String filename;
    private String content;

    public FileServiceImpl() {
        this.filename = InputUtil.getInput("請輸入檔案名");
        this.content = InputUtil.getInput("請輸入檔案内容");
    }

    @Override
    public boolean save() {
        String fullname = this.FILE_DIR + File.separator + this.filename;

        PrintWriter writer = null;
        try {
            writer = new PrintWriter(fullname);
            writer.print(this.content);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                writer.close();
            }

        }
        return false;
    }
}


class Factory{
    private Factory(){}

    public static FileServiceImpl getInstance(){
        return new FileServiceImpl();

    }
}

class Demo {
    // 項目啟動時建立檔案夾
    static {
        File file = new File(IFileService.FILE_DIR);
        if (!file.exists()) {
            file.mkdirs();
        }
    }

    public static void main(String[] args) throws IOException {
        FileServiceImpl fileService = Factory.getInstance();
        fileService.save();
    }
}      

93 字元串逆序顯示

鍵盤傳入多個字元串到程式中,并将它們按照逆序輸出到螢幕

設計考慮:

1、字元串内容随時修改,使用StringBuffer

2、由使用者自己決定是否繼續輸入

實作步驟

1、定義接口 操作标準

2、定義實作類

3、定義工廠類

4、編寫輔助類

5、編寫測試類

實作代碼

IStringService.java

public interface IStringService {
    public void append(String str);
    public String[] reverse();
}      

StringServiceImpl.java

public class StringServiceImpl implements IStringService{
    private StringBuffer data = new StringBuffer();

    public void append(String str){
        this.data.append(str).append("|");
    }

    public String[] reverse(){
        String[] list = this.data.toString().split("\\|");

        String[] tmp = new String[list.length];

        for(int i=0; i<list.length; i++){
            tmp[i] = list[list.length - i - 1];
        }

        return tmp;
    }
}      

InputUtil.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class InputUtil {
    private static final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static String getString(String prompt) {

        System.out.println(prompt);
        String msg = null;

        while (true) {
            try {
                msg = reader.readLine();
                if (!"".equals(msg)) {
                    break;
                } else {
                    System.out.println("請輸入非空字元串:");
                }
            } catch (IOException e) {

            }
        }
        return msg;
    }

    public static void main(String[] args) {
        System.out.println(InputUtil.getString("請輸入"));
    }
}      

Factory.java

class Factory{
    private Factory(){}

    public static StringServiceImpl getInstance(){
        return new StringServiceImpl();

    }
}      

Menu.java

import java.util.Arrays;

public class Menu {
    private StringServiceImpl stringServiceImpl;

    public Menu() {
        this.stringServiceImpl = Factory.getInstance();
        this.choose();
    }

    public void choose() {
        help();

        String msg = InputUtil.getString("請選擇:");
        switch (msg) {
            case "1":
                this.stringServiceImpl.append(InputUtil.getString("請輸入字元串:"));
                choose();

            case "2":
                System.out.println(Arrays.toString(this.stringServiceImpl.reverse()));
                choose();

                case "0":
                System.exit(0);

            default:
                choose();
        }

    }

    public static void help() {
        System.out.println("[1]輸入内容:");
        System.out.println("[2]輸出反轉内容:");
        System.out.println("[0]退出");
    }
}      

Demo.java

class Demo{
    public static void main(String[] args) {
        new Menu();
    }
}      

94 資料排序處理

鍵盤輸入資料

姓名:成績|姓名:成績

eg:

Tom:89|Jack:91|Tony:86      

按照成績由高到低排序

思路:

Comparable + Arrays

代碼實作

IStudentService.java

public interface IStudentService {
    Student[] getData();
}
      

Student.java

public class Student implements Comparable<Student>{
    private String name;
    private double score;

    public Student(String name, double score) {
        this.name = name;
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student<" +  name + ", " + score + '>';
    }

    @Override
    public int compareTo(Student obj) {
        return Double.compare(obj.score, this.score);
    }
}
      

StudentServiceImpl.java

import java.util.Arrays;

public class StudentServiceImpl implements IStudentService {
    private String content;
    private Student[] students;

    public StudentServiceImpl(String content) {
        this.content = content;
        this.handle();
    }

    private void handle(){
        String[] list = this.content.split("\\|");
        this.students = new Student[list.length];

        for(int i=0; i<list.length; i++){
            String[] items = list[i].split(":");
            this.students[i] = new Student(items[0], Double.parseDouble(items[1]));
        }
    }

    @Override
    public Student[] getData() {
        Arrays.sort(this.students);
        return this.students;
    }
}
      
public class Factory {
    private Factory(){}

    public static StudentServiceImpl getInstance(){
        return new StudentServiceImpl(InputUtil.getString("請輸入資料:"));
    }
}
      
import java.util.Arrays;

public class Demo {
    public static void main(String[] args) {
        // Tom:89|Jack:91|Tony:86
        System.out.println(Arrays.toString(Factory.getInstance().getData()));
        // [Student<Jack, 91.0>, Student<Tom, 89.0>, Student<Tony, 86.0>]
    }
}      

95 資料排序處理深入

擴充上一節内容,将輸入資訊儲存到檔案中,還可以添加資訊,并且檢視全部資料

确認儲存位置

格式統一

FileUtil.java檔案讀取工具類

package util;

import java.io.*;
import java.util.Scanner;

public class FileUtil {
    public static String read(File file) throws FileNotFoundException {
        Scanner scanner = new Scanner(file);
        StringBuilder contents = new StringBuilder();

        while (scanner.hasNext()) {
            contents.append(scanner.next());
        }

        scanner.close();

        return contents.toString();
    }

    public static void append(File file, String content) throws IOException {
        PrintWriter writer = new PrintWriter(new FileWriter(file, true));
        writer.write(content);
        writer.close();
    }

    public static void save(File file, String content) throws IOException {
        PrintWriter writer = new PrintWriter(file);
        writer.write(content);
        writer.close();
    }

    public static void main(String[] args) throws IOException {
        File file = new File("demo.txt");

        FileUtil.save(file, "你好");
        FileUtil.append(file, "你也好");
        System.out.println(FileUtil.read(file));
    }
}
      

96 奇偶數統計

輸入字元串拆分後統計奇數,偶數個數

接口INumberService.java

public interface INumberService {
    public int[] handle();
}
      

實作類 NumberServiceImpl.java

import util.InputUtil;

public class NumberServiceImpl implements INumberService{
    private String str;

    public NumberServiceImpl(){
        this.str = InputUtil.getString("請輸入數字串:");
    }

    @Override
    public int[] handle() {

        String[] numbers = this.str.split("");

        // 偶數, 奇數
        int[] result = new int[]{0, 0};
        for(String num : numbers){
            if(Integer.parseInt(num) % 2 == 0){
                result[0] ++;
            } else{
                result[1] ++;
            }
        }
        return result;
    }
}
      

測試類 Demo.java

import java.util.Arrays;

public class Demo {
    public static void main(String[] args) {
        System.out.println(Arrays.toString(new NumberServiceImpl().handle()));

        // 1234567890
        // [5, 5]
    }
}
      

97 使用者登入

輸入使用者名和密碼 root 123456

如果沒有輸入則提示輸入

輸入錯誤3次退出

提示登入成功

真實業務隻實作核心功能,輔助邏輯處理交給代理控制

接口類

IUserService

isExit

login

實作類

UserServiceImpl

代理類

UserServiceProxy

工廠類

Factory

測試類

Demo

IUserService.java

public interface IUserService {
    public boolean isExit();
    public boolean login(String name, String password);
}
      

UserServiceImpl.java

public class UserServiceImpl implements IUserService{
    private int tryCount = 0;

    @Override
    public boolean isExit() {
        // 超過三次錯誤
        return this.tryCount >= 3;
    }

    /**
     * 實作核心邏輯
     */
    @Override
    public boolean login(String name, String password) {
        this.tryCount ++;

        if("root".equals(name) && "123456".equals(password)){
            return true;
        } else{
            return false;
        }
    }
}
      

UserServiceProxy.java

import util.InputUtil;

public class UserServiceProxy implements IUserService {
    private IUserService userService;

    public UserServiceProxy(IUserService userService) {
        this.userService = userService;
    }

    @Override
    public boolean isExit() {
        return this.userService.isExit();
    }

    /**
     * 實作輔助邏輯
     */
    @Override
    public boolean login(String name, String password) {
        while (!this.isExit()) {
            String inputName = InputUtil.getString("請輸入使用者名:");
            String inputPassword = InputUtil.getString("請輸入密碼:");

            if (this.userService.login(inputName, inputPassword)) {
                System.out.println("登入成功");
                System.exit(0);
            } else {
                System.out.println("使用者名或密碼錯誤,請重試");
            }
        }

        System.out.println("重試次數過多,請稍後重試");
        return true;

    }
}
      
import util.InputUtil;

public class Factory {
    private Factory(){}

    public static IUserService getInstance(){
        return new UserServiceProxy(new UserServiceImpl());
    }
}
      
public class Demo {
    public static void main(String[] args) {
        Factory.getInstance().login(null, null);

    }
}
      

98 投票選舉

1、輸入候選人名單

2、統計每個候選人票數

3、顯示最終投票結果

思路分析

1、定義資料結構:
Student
    name
    sid
    vote

2、操作接口類
IVoteService
    void inc(int sid)
    Student[] result() 排序資料
    Student[] getData() 未排序資料

3、實作類
VoteServiceImpl

4、工廠類
Factory

5、測試類
Demo      

資料結構 Student.java

public class Student implements Comparable<Student> {
    private String name;
    private int sid;
    private int vote;

    public Student(String name, int sid, int vote) {
        this.name = name;
        this.sid = sid;
        this.vote = vote;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public int getVote() {
        return vote;
    }

    public void setVote(int vote) {
        this.vote = vote;
    }

    @Override
    public int compareTo(Student obj) {
        return obj.vote - this.vote;
    }

    @Override
    public String toString() {
        return String.format("[%s] %s - %s", sid, name, vote);
    }
}
      

接口 IVoteService.java

public interface IVoteService {
    public void inc(int sid);

    public Student result();

    public Student[] getData();
}
      

實作類 VoteServiceImpl.java

import util.InputUtil;

import java.util.Arrays;

public class VoteServiceImpl implements IVoteService {
    private Student[] students;

    public VoteServiceImpl() {
        this.students = new Student[]{
                new Student("張三", 1, 0),
                new Student("李四", 2, 0),
                new Student("王五", 3, 0),
        };
    }

    @Override
    public void inc(int sid) {
        for(Student s : this.students){
            if(s.getSid() == sid){
                s.setVote(s.getVote() + 1);
            }
        }
    }

    @Override
    public Student result() {
        Arrays.sort(this.students);
        return this.students[0];
    }

    @Override
    public Student[] getData() {
        return this.students;
    }
}
      

工産類 Factory.java

public class Factory {
    private Factory(){}

    public static IVoteService getInstance(){
        return new VoteServiceImpl();
    }
}
      

菜單類 Menu.java

import util.InputUtil;

import java.util.Arrays;

public class Menu {
    private IVoteService voteService;

    public Menu() {
        this.voteService = Factory.getInstance();
        this.choose();
    }

    public void choose(){
        this.help();
        String num = InputUtil.getString("請選擇:");

        switch (num){
            case "1":
                String sid = InputUtil.getString("請輸入候選人id");
                this.voteService.inc(Integer.parseInt(sid));
                this.choose();
                break;
            case "2":
                System.out.println(Arrays.toString(this.voteService.getData()));
                this.choose();
                break;
            case "3":
                System.out.println(this.voteService.result());
                this.choose();
                break;
            case "0":
                System.out.println("拜拜...");
                System.exit(0);
            default:
                help();
                this.choose();
        }
    }

    public void help(){
        System.out.println("【1】候選人增加票數");
        System.out.println("【2】顯示投票統計");
        System.out.println("【3】顯示統計結果");
        System.out.println("【0】退出系統");
    }
}
      
public class Demo {
    public static void main(String[] args) {
        new Menu();
    }
}