主頁 > 後端開發 > Java程式設計題

Java程式設計題

2021-01-10 10:12:23 後端開發

構造有限個數的有效三角形

/*創建一個三角形類,包含屬性:private int a,b,c;分別代表三角形的三條邊,設計是需要滿足如下需求:  
a. 在創建物件輸入三條邊,三邊取值必須合法(三邊均為正值,且任意兩邊之和大于第三邊),否則將無法創建物件;
b.為使類更易于維護,必須單獨設計一個boolean limit(…)函式,實作對三條邊的限制檢查,符合創建條件則回傳真,否則回傳假,
c.該類有一個public boolean setEdges(int x, int y, int z)方法(注:此方法為非靜態方法),將a/b/c的值替換成x/y/z,回傳true,
但當x,y,z的值不滿足三角形限制條件時,將不予替換,并回傳false;
d. 三角形至多能創建3個,
設計該三角形類,并驗證上述需求, */
public class Triangle {
	private int a,b,c;
	static int total = 3,count = 0;
	private Triangle(int x,int y,int z){
		a = x;b = y;c = z;
		count++;
	}
	static boolean limit(int x,int y,int z) {
		if(x>0 && y>0 && z>0 && x+y>z && x+z>y && y+z>x) {
			return true;
		}
		return false;
	}
	public static Triangle setTri(int x,int y,int z) {
		if(limit(x,y,z) && count<total) {
			return new Triangle(x,y,z);
		}
		return null;
	}
	public boolean setEdges(int x,int y,int z) {
		if(limit(x,y,z)) {
			a = x;b = y;c = z;
			return true;
		}
		return false;
	}
	public String toString() {
		return "(" + a + "," +  b + "," + c + ")";
	}
}
class App1{
	public static void main(String[] args) {
		Triangle[] t = new Triangle[5];
		t[0] = Triangle.setTri(2, 2, 1);
		t[1] = Triangle.setTri(1, 2, 1);
		t[2] = Triangle.setTri(3, 4, 5);
		t[3] = Triangle.setTri(2, 4, 4);
		t[4] = Triangle.setTri(6, 8, 10);
		for(int i = 0; i<5; i++)
			System.out.println(t[i]);
	}
}

注:

  1. count++要放在建構式中,只要呼叫了建構式就會創建物件
  2. 類中的toString()方法必須用public修飾,不能改小權限,且該方法會被物件自動呼叫
  3. 靜態方法只能使用類中的靜態成員,所以limit()方法和total,count變數要為靜態的

形狀識別器

使用抽象類實作

/*實作智能識別器,可針對圓形、矩形、三角形、梯形不同形狀,提供如下服務:
a. 識別形狀的面積;
b. 輸出形狀屬性資訊:型別和各種引數,如:梯形,上底:20,下底:30,高:10)--- 考慮toString()*/
import static java.lang.Math.PI;
abstract class Shape {
	private String type;
	Shape(String t){
		type  = t;
	}
	String getType() {
		return type;
	}
	abstract double getArea();
}
class Circle extends Shape{
	private int  r;
	Circle(String s,int R){
		super(s);
		r = R;
	}
	double getArea() {
		return PI*r*r;
	}
	public String toString() {
		return "半徑:" + r;
	}
}
class Rectangle extends Shape{
	private int w,h;
	Rectangle(String s,int x,int y){
		super(s);
		w = x;h = y;
	}
	double getArea() {
		return w*h;
	}
	public String toString() {
		return "寬:" + w + ",高:" + h;
	}
}
class Trigon extends Shape{
	private int  s,h;
	Trigon(String t,int x,int y){
		super(t);
		s = x;h = y;
	}
	double getArea() {
		return s*h/2;
	}
	public String toString() {
		return "底:" + s + ",高:" + h;
	}
}
class Trapezoidal extends Shape{
	private int  a,b,h;
	Trapezoidal(String s,int x,int y,int z){
		super(s);
		a = x;b = y;h = z;
	}
	double getArea() {
		return (a+b)*h/2;
	}
	public String toString() {
		return "上底:" + a + ",下底:" + b + ",高:" + h;
	}
}
class Recognizer{
	public static void identify(Shape s) {
		System.out.println(s.getType() + "," + s.toString() + ",面積:" + s.getArea());
	}
}
class App2{
	public static void main(String[] args) {
		Shape[] s = {new Circle("圓形", 2),
				new Rectangle("矩形", 3, 4),
				new Trigon("三角形", 4, 2),
				new Trapezoidal("梯形", 2, 4, 3)
		};
		for(int i = 0;i<4;i++)
			Recognizer.identify(s[i]);
	}
}

注:

  1. 私有屬性可以通過類中的方法回傳得到
  2. abstract類中不一定要有抽象方法,但抽象方法所屬類一定是抽象類
  3. 抽象方法不能有方法體
  4. 該識別器基于超類編程,實作即插即用的功能,添加子類很方便

使用介面實作

/*【介面實作】實作智能識別器,可針對圓形、矩形、三角形、梯形不同形狀,提供如下服務:
a. 識別形狀的面積;
b. 輸出形狀屬性資訊:型別和各種引數,如:梯形,上底:20,下底:30,高:10)--- 考慮toString()*/
import static java.lang.Math.PI;
interface Shapein {
	public abstract String getType();
	public abstract double getArea();
}
class yx implements Shapein{
	private int  r;
	private String type;
	yx(String s,int R){
		r = R;
		type = s;
	}
	public String getType() {
		return type;
	}
	public double getArea() {
		return PI*r*r;
	}
	public String toString() {
		return "半徑:" + r;
	}
}
class jx implements Shapein{
	private int w,h;
	private String type;
	jx(String s,int x,int y){
		w = x;h = y;
		type = s;
	}
	public String getType() {
		return type;
	}
	public double getArea() {
		return w*h;
	}
	public String toString() {
		return "寬:" + w + ",高:" + h;
	}
}
class sj implements Shapein{
	private int w,h;
	private String type;
	sj(String s,int x,int y){
		w = x;h = y;
		type = s;
	}
	public String getType() {
		return type;
	}
	public double getArea() {
		return w*h/2;
	}
	public String toString() {
		return "底:" + w + ",高:" + h;
	}
}
class tx implements Shapein{
	private int a,b,h;
	private String type;
	tx(String s,int x,int y,int z){
		a = x;b = y;h = z;
		type = s;
	}
	public String getType() {
		return type;
	}
	public double getArea() {
		return (a+b)*h/2;
	}
	public String toString() {
		return "上底:" + a + ",下底:" + b + ",高:" + h;
	}
}
class Identifier{
	public static void identify(Shapein s) {
		System.out.println(s.getType() + "," + s.toString() + ",面積:" + s.getArea());
	}
}
class App3{
	public static void main(String[] args) {
		Shapein[] s = {new yx("圓形", 2),
				new jx("矩形", 3, 4),
				new sj("三角形", 4, 2),
				new tx("梯形", 2, 4, 3)
		};
		for(int i = 0;i<4;i++)
			Identifier.identify(s[i]);
	}
}

注:

  1. 介面中只能定義常量,且常量都有public static final修飾,介面中的方法都有public abstract修飾
  2. 在main函式中,用的是介面參考指向實作類的物件,Java在利用介面變數呼叫其實作類的物件的方法時,該方法必須已經在介面中被宣告,而且實作類的物件對該方法進行了重寫,

兵種游戲設計

/*兵種包括轟炸機、直升機、重型坦克、輕型坦克、音波坦克、步兵、飛行兵
b.轟炸機、直升機、飛行兵屬于空軍;步兵、輕型坦克、重型坦克屬于陸軍,音波坦克屬于水陸兩棲;
c.輕型坦克、步兵只能攻擊陸軍,音波坦克只能攻擊空軍,轟炸機可攻擊陸軍、海軍;重型坦克可攻擊陸軍、空軍,直升機、飛行兵可攻擊海軍、陸軍、空軍;
并驗證設計效果,(即向兵種變數填入海/陸/空軍兵種,檢測a.attack(b)的輸出)*/
interface 陸軍{}
interface 空軍{}
interface 海軍{}
interface 可攻擊陸軍{
	default void attack(陸軍 x) {System.out.println("可攻擊陸軍");}
}
interface 可攻擊空軍{
	default void attack(空軍 x) {System.out.println("可攻擊空軍");}
}
interface 可攻擊海軍{
	default void attack(海軍 x) {System.out.println("可攻擊海軍");}
}
interface 可攻擊陸軍海軍 extends 可攻擊陸軍,可攻擊海軍{}
interface 可攻擊陸軍空軍 extends 可攻擊陸軍,可攻擊空軍{}
interface 可攻擊陸軍空軍海軍 extends 可攻擊陸軍,可攻擊空軍,可攻擊海軍{}
abstract class 兵種{
	private String type;
	public String getType() {return type;}
	兵種(String x){
		type = x;
	}
	public abstract void attack(兵種 x);
	public String attackinfo(兵種 x) {
		return getType() + "遇見" + x.getType() +":";
	}
}
class 轟炸機 extends 兵種 implements 空軍,可攻擊陸軍海軍{
	轟炸機(){
		super("轟炸機");
	}
	public void attack(兵種 x) {
		if(x instanceof 陸軍) {
			System.out.print(attackinfo(x));
			attack((陸軍)x);
		}else if(x instanceof 海軍) {
			System.out.print(attackinfo(x));
			attack((海軍)x);
		}else {
			System.out.println(attackinfo(x) + "不能攻擊!");
		}
	}
}
class 直升機 extends 兵種 implements 空軍,可攻擊陸軍空軍海軍{
	直升機(){
		super("直升機");
	}
	public void attack(兵種 x) {
		if(x instanceof 陸軍) {
			System.out.print(attackinfo(x));
			attack((陸軍)x);
		}else if(x instanceof 海軍) {
			System.out.print(attackinfo(x));
			attack((海軍)x);
		}else {
			System.out.print(attackinfo(x));
			attack((空軍)x);
		}
	}
}
class 飛行兵 extends 兵種 implements 空軍,可攻擊陸軍空軍海軍{
	飛行兵(){
		super("飛行兵");
	}
	public void attack(兵種 x) {
		if(x instanceof 陸軍) {
			System.out.print(attackinfo(x));
			attack((陸軍)x);
		}else if(x instanceof 海軍) {
			System.out.print(attackinfo(x));
			attack((海軍)x);
		}else {
			System.out.print(attackinfo(x));
			attack((空軍)x);
		}
	}
}
class 重型坦克 extends 兵種 implements 陸軍,可攻擊陸軍空軍{
	重型坦克(){
		super("重型坦克");
	}
	public void attack(兵種 x) {
		if(x instanceof 陸軍) {
			System.out.print(attackinfo(x));
			attack((陸軍)x);
		}else if(x instanceof 空軍) {
			System.out.print(attackinfo(x));
			attack((空軍)x);
		}else {
			System.out.println(attackinfo(x) + "不能攻擊!");
		}
	}
}
class 音波坦克 extends 兵種 implements 陸軍,海軍,可攻擊空軍{
	音波坦克(){
		super("音波坦克");
	}
	public void attack(兵種 x) {
		if(x instanceof 空軍) {
			System.out.print(attackinfo(x));
			attack((空軍)x);
		}else {
			System.out.println(attackinfo(x) + "不能攻擊!");
		}
	}
}
class 輕型坦克 extends 兵種 implements 陸軍,可攻擊陸軍{
	輕型坦克(){
		super("輕型坦克");
	}
	public void attack(兵種 x) {
		if(x instanceof 陸軍) {
			System.out.print(attackinfo(x));
			attack((陸軍)x);
		}else {
			System.out.println(attackinfo(x) + "不能攻擊!");
		}
	}
}
class 步兵 extends 兵種 implements 陸軍,可攻擊陸軍{
	步兵(){
		super("步兵");
	}
	public void attack(兵種 x) {
		if(x instanceof 陸軍) {
			System.out.print(attackinfo(x));
			attack((陸軍)x);
		}else {
			System.out.println(attackinfo(x) + "不能攻擊!");
		}
	}
}
class App4{
	public static void main(String[] args) {
		兵種[] x = {
				new 轟炸機(),new 直升機(),new 重型坦克(),new 輕型坦克(),new 音波坦克(),new 飛行兵(),new 步兵()
		};
		for(int i = 0;i<x.length;i++) {
			x[i].attack(x[x.length-1-i]);
		}
	}
}

注:

  1. 陸軍、海軍和空軍都是空介面,僅起到標簽作用
  2. 介面中的attack()方法不是抽象方法,有預設實作,子類可以不重寫
  3. 通過instanceof來判斷兵種的具體型別,并在attack()中進行強制型別轉換

PCI

/*展示介面實作“功能擴展”
【需求】主板預留PCI插槽,不可能知道該插槽將插裝什么硬體,
主板做的事情只能是:加電、啟動、run、停止,主板類預留5個PCI插槽,如何實作?
提示:5個插槽,就是5個變數,
 * */
interface PCI {
	void start();
	void run();
	void stop();
}
class NetCard implements PCI{
	public void start() {System.out.print("\n網卡啟動  ");}
	public void run() {System.out.print("網卡運行");}
	public void stop() {System.out.print("\n網卡停止");}
}
class SoundCard implements PCI{
	public void start() {System.out.print("\n聲卡啟動  ");}
	public void run() {System.out.print("聲卡運行");}
	public void stop() {System.out.print("\n聲卡停止");}
}
class DisplayCard implements PCI{
	public void start() {System.out.print("\n顯卡啟動  ");}
	public void run() {System.out.print("顯卡運行");}
	public void stop() {System.out.print("\n顯卡停止");}
}
class MainBoard{
	PCI[] pci = new PCI[5];
	public void add(PCI x) {
		for(int i = 0;i<pci.length;i++)
			if(pci[i] == null){
				pci[i] = x;
				return;
			}
		System.out.print("插槽已滿!");
	}
	public void start() {
		for(int i = 0;i<pci.length;i++)
			if(pci[i] != null) {
				pci[i].start();
				pci[i].run();
			}
	}
	public void stop() {
		for(int i = 0;i<pci.length;i++)
			if(pci[i] != null) pci[i].stop();
	}
} 
class Computer{
	MainBoard mb = new MainBoard();//電腦中有一塊主板,主板插裝何種板卡通過引數傳入
	Computer(PCI[] x){
		for(int i = 0;i<x.length;i++) {
			mb.add(x[i]);//依次將PCI板卡插入主板
		}
	}
	void start() {mb.start();}
	void stop() {mb.stop();}
}
class App5{
	public static void main(String[] args) {
		PCI[] pci = {new NetCard(),new SoundCard(),new DisplayCard()};
		Computer c = new Computer(pci);
		c.start();c.stop();
	}
}

互斥

/*執行緒類T定義方式為:class T implements Runnable{ int data; ...}
執行緒體實作依次輸出data的1~10倍資料,
在main中,構造和啟動執行緒的方式形如: T t=new T(2);  t.start(); 
構造data分別為2、3、5的執行緒,執行緒名分別為t2、t3、t5,要求:t2、t3、t5分3行輸出,且輸出結果不得交叉,
 * */
class D{
	int x;
}
class T implements Runnable {
	D d;
	int data;
	Thread t;
	T(int x,D y){
		data = x;
		d = y;
		t = new Thread(this);
	}
	public void run() {
		synchronized(d) {
			for(int i = 1;i<=10;i++) {
				System.out.print(data*i + " ");
			}
			System.out.println();
		}
	}
	void join() {
		try {t.join();}catch(Exception e) {;}
	}
	void start() {
		t.start();
	}
}
class App6{
	public static void main(String[] args) {
		System.out.println("main執行緒開始");
		D d = new D();
		T t2 = new T(2,d);
		T t3 = new T(3,d);
		T t5 = new T(5,d);
		t2.start();t3.start();t5.start();
		t2.join();t3.join();t5.join();
		System.out.println("main執行緒結束");
	}
}

注:

  1. 類D僅用來充當物件鎖和共享資源,所以不同執行緒傳入的D要相同
  2. 該程式中join()用于讓main執行緒在t2、t3和t5執行緒結束后結束
  3. t2、t3和t5并不是執行緒物件,但其內部包含執行緒物件

同步

/*執行緒類T定義方式為:class T implements Runnable{ int data; ...}
執行緒體實作依次輸出data的1~10倍資料,
在main中,構造和啟動執行緒的方式形如: T t=new T(2);  t.start(); 
構造data分別為2、3、5的執行緒,執行緒名分別為t2、t3、t5,要求:t2、t3、t5輸出結果按2 3 5 4 6 10...特定順序輸出,
 * */
class Flag{
	private int flag = 0;
	void ChangeFlag(int x,int y) {
		while(flag!=x) try {wait();}catch(Exception e) {;}
		flag = y;notifyAll();
	}
}
class Th implements Runnable{
	private Flag flag;
	int data,x,y;
	Thread t;
	Th(int h,int m,int n,Flag f){
		t = new Thread(this);
		data = h;flag = f;x = m;y = n;
	}
	public void run() {
		synchronized(flag) {
			for(int i = 1;i<=10;i++) {
				try {Thread.sleep(1000);}catch(Exception e) {}
				flag.ChangeFlag(x, y);
				System.out.print(data*i + " ");
			}
		}
	}
	void start() {t.start();}
}
class App7{
	public static void main(String[] args) {
		Flag f = new Flag();
		Th t2 = new Th(2,0,1,f);
		Th t3 = new Th(3,1,2,f);
		Th t5 = new Th(5,2,0,f);
		t2.start();t3.start();t5.start();
	}
}

注:

  1. Flag類用于狀態標志不同執行緒的執行順序,如果輪到t2執行,則將狀態改為下一個執行執行緒的狀態,并喚醒所有執行緒,否則等待
  2. 判斷標志時不能用if,因為可能會存在偽喚醒,放在回圈體中可避免這種情形
  3. 執行緒定義中的建構式需要傳入四個值:要進行操作的資料、當前狀態、下一個狀態、共享資源

委托事件處理模型

/*做一個簡單的計算器,[1][+][2]=[3],[]為文本框,點擊=按鈕計算出結果,最后一個文本框不可點擊(enable(false)),并借助標簽顯示出錯資訊
 * a.當運算元文本框/運算子文本框中的字串,在剔除首尾空格后,若字串長度為0,則拋出自定義例外NoneException,提示“運算元為空”/“運算子為空”
 * b.當運算子框中的字串s剔除首尾空格(s.trim())后,若包含多個字符/不是+-* /等字符時拋出自定義例外OpCharException,提示“運算子過多”/“無法識別的運算子”
 * c.對Double.parseDouble(s),如果無法將s轉換成正確的double值,若s是“1.2.3”、“a.b”、“a3b”或是轉換后的數值越界時,將拋出非檢查型例外NumberFormatException,
 * 提示“資料格式有錯”;產生除零錯時將拋出非檢查型例外ArithmeticException,提示“除零錯”
*/
import java.awt.*;import java.awt.event.*;import javax.swing.*;
class NoneException extends Exception{
	public NoneException(String msg){super(msg);}
}
class OpCharException extends Exception{
	public OpCharException(String msg){super(msg);}
}
public class GUI extends JFrame implements ActionListener {
	private JTextField op1,op2,opchar,result;//對應運算元1、2、運算子、運算結果
	private JButton bt_eq;//=按鈕
	private JLabel t_la;//顯示錯誤資訊
	public GUI(){
		super("計算器");
		setSize(500,100);
		setLocation(500,500);
		setLayout(new FlowLayout());		
		op1 = new JTextField(5); add(op1);
		opchar = new JTextField(2); add(opchar);
		op2 = new JTextField(5); add(op2);
		bt_eq = new JButton("="); add(bt_eq);
		result = new JTextField(5);
		result.setEnabled(false);
		add(result);
		t_la = new JLabel(" ");
		add(t_la);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //設定點擊關閉按鈕
		bt_eq.addActionListener(this);
	}
	private double getDouble(JTextField jf,int num) throws NoneException{
		//檢測jf是否為合法的運算元
		String s = jf.getText().trim();double val;
		if(s.length() == 0) throw new NoneException("第"+ num + "個運算元為空");
		try {
			val = Double.parseDouble(s);
		}catch(NumberFormatException e) {
			throw new NumberFormatException("第"+ num + "個運算元格式有錯");
		}
		return val;
	}
	private char getOpChar(JTextField jf) throws NoneException,OpCharException{
		//檢測jf是否為合法的運算子
		String s = jf.getText().trim();
		if(s.length()==0) throw new NoneException("運算子為空");
		if(s.length()>1) throw new OpCharException("運算子過多");
		if("+-*/".indexOf(s)<0) throw new OpCharException("無法識別的運算子");
		return s.charAt(0);//回傳字串第0位置的字符
	}
	private double compute(double a,double b,char op) {
		//進行運算
		if(b==0 && op == '/') throw new ArithmeticException("除零錯");
		if(op == '+') return a+b;
		if(op == '-') return a-b;
		if(op == '*') return a*b;
		if(op == '/') return a/b;
		return -1;//實際上為通過編譯而設定
	}
	public void actionPerformed(ActionEvent e) {
		double x,y;
		char z;
//		if(e.getCommand() == bt_eq) {
		if(e.getActionCommand().equals("=")) {//確定事件源的兩種寫法
			try {
				x = getDouble(op1,1);y = getDouble(op2,2);z = getOpChar(opchar);
				result.setText(compute(x,y,z)+"");
			}
			catch(Exception c) {
				result.setText(" ");
				t_la.setText(c.getMessage());
			}
		}
	}
}
class App8{
	public static void main(String[] args) {new GUI();}
}

注:

  1. 自定義例外類必須是Throwable類的子類,一般以Exception作為超類,且可以通過super()將出錯資訊傳給超類,Exception類也可以通過getMessage()方法顯示出錯資訊
  2. 委托事件處理模型:
    • 處理者(GUI物件)要實作ActionListener介面
    • 類中要重寫介面中的actionPerformed()方法,方法中的引數為ActionEvent,在該方法中執行處理程序
    • 將事件源(bt_eq按鈕)與處理者相關聯(通過addActionListener()方法)
  3. 將處理程序分成多個部分,使處理程序更加清晰
  4. “±* /”.indexOf(s)回傳的是指定子字串s在字串"±*/"中第一次出現處的索引

復制檔案

逐個字符讀/寫檔案

public class FileCopy {
	public static void main(String[] args) {
		File inF = new File("a.txt");//關聯當前檔案夾中的檔案a.txt,作為讀出源頭
		File outF = new File("b.txt");//關聯當前檔案夾中的檔案b.txt,作為寫入目標
		try {
			int ch;
			FileReader in = new FileReader(inF);//建立閱讀器物件in
			FileWriter out = new FileWriter(outF);
			System.out.println("檔案開始復制");
			while((ch = in.read())!=-1)
				out.write(ch);//從流in中讀取字符ch并寫入流out
			in.close();out.close();//關閉流,釋放相關資源
			System.out.println("檔案復制結束");
		}catch(FileNotFoundException e) {
			System.out.println("檔案未找到!\n" + e);
		}catch(IOException e) {
			System.out.println("File read error!\n" + e);
		}
	}
}

注:

  1. a.txt要和src放在同一目錄下,否則會找不到檔案,當然也可以用絕對路徑

按字符流整體讀/寫檔案

public class FileCopy {
	public static void main(String[] args) {
		File inF = new File("a.txt");
		File outF = new File("c.txt");
		char[] ca = new char[(int)inF.length()];
		try {
			FileReader in = new FileReader(inF);
			FileWriter out = new FileWriter(outF);
			System.out.println("檔案開始復制");
			in.read(ca);out.write(ca);
			in.close();out.close();
			System.out.println("檔案復制結束");
		}catch(FileNotFoundException e) {
			System.out.println("檔案未找到!\n" + e);
		}catch(IOException e) {
			System.out.println("File read error!\n" + e);
		}
	}
}

基于緩沖區讀/寫檔案

public class FileCopy {
	public static void main(String[] args) {
		String s;
		File inF = new File("a.txt");
		File outF = new File("d.txt");
		try {
			FileReader in = new FileReader(inF);
			FileWriter out = new FileWriter(outF);
			BufferedReader br = new BufferedReader(in);
			BufferedWriter bw = new BufferedWriter(out);
			System.out.println("檔案開始復制");
			while((s = br.readLine()) !=null) {//讀取一行,并賦值給字串s
				bw.write(s,0,s.length());//將s中從0至s.length()的所有字串寫入bw
				bw.newLine();//添加行分隔符
			}
			br.close();bw.close();
			System.out.println("檔案復制結束");
		}catch(FileNotFoundException e) {
			System.out.println("檔案未找到!\n" + e);
		}catch(IOException e) {
			System.out.println("File read error!\n" + e);
		}
	}
}

防止出現亂碼

class Utf_8_to_GBK {
	public static void main(String args[] ){
 		BufferedReader br=null; 
 		BufferedWriter bw=null; 
 		String s;
		try{  //按UTF-8格式讀,按GBK格式寫
			br=new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"), "UTF-8")); 
			bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("e.txt"), "GBK")); 
			System.out.println("檔案開始復制");
			while((s=br.readLine())!=null){
				bw.write(s,0,s.length());
				bw.newLine(); 
			}
			br.close(); bw.close();
			System.out.println("檔案復制結束");
 		}
 		catch(UnsupportedEncodingException e){ System.out.println("不支持的編碼格式!\n"+e); }
 		catch(FileNotFoundException e){ System.out.println("檔案沒找到!\n"+e); }
 		catch(IOException e){ System.out.println("File read error!\n"+e); }
	}
}

序列化與反序列化

import java.io.*;
class C{
	public int x;
}
class B{
	public int x;
	public C c;
	public B(int n,C c1) {x = n;c = c1;}
}
class A implements Serializable{
	int x; 
	transient B b;//b參考物件將不被序列化
}
class ReadObject{
	public static void main(String[] args) {
		C c = new C();A a =new A();a.x = 10;a.b = new B(5,c);
		System.out.println("序列化前 a.b.x=" + a.b.x);
		A new_a = null;
		try {
			FileOutputStream fo = new FileOutputStream("serialObj.bat");
			ObjectOutputStream obj_o = new ObjectOutputStream(fo);
			obj_o.writeObject(a);obj_o.close();
			FileInputStream fi = new FileInputStream("serialObj.bat");
			ObjectInputStream obj_i = new ObjectInputStream(fi);
			new_a = (A)obj_i.readObject();obj_i.close();
		}catch(Exception e) {e.printStackTrace();}
		System.out.print("恢復物件 new_a.b.x=" + new_a.b.x);
	}
}

注:

  1. 本例將產生空指標例外,因為未對B物件序列化,在恢復時就沒有創建相應的物件,當參考該屬性域時會出錯
  2. transient是成員修飾符,不能修飾類

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/246821.html

標籤:java

上一篇:可變引數串列“...“

下一篇:Jenkins(一)Windows環境下實作Jenkins部署

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more