《Java语言程序设计(基础篇)》(第10版 梁勇 著)第十七章练习题答案.docx
Java语言程序设计(基础篇)(第10版梁勇著)第十七章 练习题答案17.1import java.io.*; import java.util.*;public class Exercisel7_01 public static void main(String args) throws lOException try (Formatter output = new Formatter(new FileOutputStream("Exercisel7_01.txt"true); )(for (int i = 0; i < 100; i+) output.format("%d", (int)(Math.random() * 100000); ) ) )17.2import java.io.*;public class Exercisel7_02 public static void main(String args) throws lOException try (DataOutputStream output = new DataOutputStream(new FileOutputStream("Exercisel7_02.dat" true); )for (int i = 0; i < 100; i+) output.writelnt(int)(Mathrandom() * 100000); )System.out.println("Done");)17.3import java.io.*;class FixedLengthStringlO /* Read fixed number of characters from a Datalnput stream */ public static String readFixedLengthString(int size, Datalnput in) throws lOException / Declare an array of characterschar chars = new charsize;/ Read fixed number of characters to the arrayfor (int i = 0; i < size; i+) charsi = in.readChar();return new String(chars);)/* Write fixed number of characters to a DataOutput stream */ public static void writeFixedLengthString(String s, int size, DataOutput out) throws lOException char chars = new charsize;/ Fill in string with characterss.getChars(0j s.length(), chars., 0);/ Fill in blank characters in the rest of the arrayfor (int i = Math.min(s.length(size); i < chars.length; i+) charsi=''/ Create and write a new string padded with blank characters out.writeChars(new String(chars);) )17.10import java.io.*;public class Exercisel7_10 public static void main(String args) throws Exception / Check usageif (args.length != 2) System.out.println("Usage: java Exercisel7_10 SourceFile numberOfPieces");System.exit(l);BufferedlnputStream input = new BufferedlnputSt ream (new FileInputStream( new File(args0);)(int numberOfPieces = Integer.parselnt(args1);System.out.printin("File size: " + input.available() + " bytes");long fileSize = input.available();int splitFileSize = (int)Math.ceil(1.0 * fileSize / numberOfPieces);for (int i = 1; i <= numberOfPieces; i+) try (BufferedOutputStream output = new BufferedOutputStream( new FileOutputStream(new File(args0 + i);)int value;int count = 0;/ What is wrong if these two conditions are placed in a different order?while (count+ < splitFileSize && (value = input.read() != -1) output.write(value);)17.11import java.io.*;import javafx.application.Application;import javafx.geometry.Pos;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.control.Label;import javafx.scene.control.TextField;import javafx. scene.layout.GridPane;import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage;public class Exercisel7_ll extends Application private TextField tflnputFile = new TextField();private TextField tfNumberOfFiles = new TextField();private Button btBrowse = new Button("Browse");private Button btStart = new Button("Start");©Overridepublic void start(Stage primarystage) GridPane gridPane = new GridPane();gridPane.add(new Label("Enter or choose a file:0, 0);gridPane.add(tfInputFile 1, 0);gridPane.add(new Label("Specify the number of smaller files:0, 1);gridPane.add( tfNumberOfFiles1, 1);HBox hBox = new HBox(5);hBox.getChildren().add(btStart);hBox.setAlignment(Pos.CENTER);VBox vBox = new VBox(5);vBox.getChildren().addAll(new Label("If you split a file named temp.txt into 3 smaller files, nthe three smaller files are temp.txt.1 temp.txt.2, and temp.txt,3.gridPane, hBox);/ Create a scene and place it in the stageScene scene = new Scene(vBox 400120);primarystage.setTitle("Exercisel7_ll"); / Set the stage title primarystage.setScene(scene); / Place the scene in the stage primarystage.show(); / Display the stagebtStart.setOnAction(e -> splitFile(tfInputFile.getText()Integer.parselnt(tfNumberOfFiles . getText(););public void splitFile(String filename int numberOfPieces) try (BufferedlnputStream input = new BufferedInputStream( new FilcInputStrcam(new Filc(filcnamc);System.out.println("File size: " + input.available() + " bytes"); long fileSize = input.available();int splitFileSize = (int) Math.ceil(l,0 * fileSize / numberOfPieces);for (int i = 1; i <= numberOfPieces; i+) try (BufferedOutputStream output = new BufferedOutputStream( new FileOutputStream(new File(filename + "." + i); )int value;int count = 0;/ What is wrong if these two conditions are placed in a different / order?while (count+ < splitFileSize && (value = input.read() != -1) output.write(value);) catch (lOException ex) ex.printStackTrace();)/* The main method is only needed for the IDE with limited* JavaFX support. Not needed for running from the command line.*/public static void main(String args) launch(args);) )17.12import java.io.BufferedlnputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.Fileinputstream;import java.io.FileOutputStream;public class Exercisel7_12 public static void main(String args) throws Exception / Check usageif (args.length < 2) System.out . println("Usage: java Exercisel7_12 SourceFilel SoureFilen TargetFile"); System.exit(l);try (/ The last file TargetFile is for outputBufferedOutputStream output = new BufferedOutputStream( new FileOutputStream(new File(argsargs.length - 1); )(for (int i = 0; i < args.length - 1; i+) BufferedlnputStream input = new BufferedlnputStream( new Fileinputstream(new File(argsi);)(int value;while (value = input.read() != -1) output.write(value);)17.13import java.io.*;import javafx.application.Application;import javafx.geometry.Pos;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.control.Label;import javafx.scene.control.TextField;import javafx.scene.layout.GridPane;import javafx.scene.layout.HBox;import javafx.scene.layout.VBox;import javafx.stage.Stage;public class Exercisel7_13 extends Application private TextField tflnputFile = new TextField(); private TextField tfNumberOfFiles = new TextField(); private Button btBrowsc = new Button("Browse"); private Button btStart = new Button("Start");©Overridepublic void start(Stage primarystage) GridPane gridPane = new GridPane();gridPane.add(new Label("Enter or choose a file: “), 0, 0);gridPane.add(tfInputFile 1, 0);gridPane.add(new Label("Specify the number of smaller files:0, 1);gridPane.add( tfNumberOfFiles1, 1);HBox hBox = new HBox(5);hBox.getChildren().add(btStart);hBox.setAlignment(Pos.CENTER);VBox vBox = new VBox(5);vBox.getChildren().addAll(new Label("If the base file is named temp.txt with three pieces, ntemp.txt.1, temp.txt.2 and temp.txt.3 are combined into temp.txt.")>gridPane, hBox);/ Create a scene and place it in the stageScene scene = new Scene(vBox, 400, 120);primarystage.setTitle("Exercisel7_13"); / Set the stage title primarystage.setScene(scene); / Place the scene in the stage primarystage.show(); / Display the stagebtStart.setOnAction(e -> j oinFile(tf Input F ile. getText()., Integer.parseInt(tfNumberOfFiles . getText(); ); )public void joinFile(String filename, int numberOfPieces) try (/ The last file TargetFile is for outputBufferedOutputStream output = new BufferedOutputStream( new FileOutputStream(new File(filename);)(for (int i = 1; i <= numberOfPieces; i+) try (BufferedlnputStream input = new BufferedlnputStream( new FileInputStream(new File(filename + i);)int value;while (value = input.read() != -1) output.write(value);)catch (lOException ex) ex.printStackTrace();)/* The main method is only needed for the IDE with limitedJavaFX support. Not needed for running from the command line. */public static void main(String args) launch(args);)17.14import java.util.Scanner;import java.io.*;public class Exercisel7_14 public static void main(String args) throws Exception Scanner input = new Scanner(System.in);("Enter a file to encrypt:");File inputFile = new File(input.nextLine(); System.out.print("Enter the output file:"); File outputFile = new File(input.nextLine();try (BufferedlnputStream in = new BufferedInputStream( new FilelnputStream(inputFile);BufferedOutputStream output = new BufferedOutputStream( new FileOutputStream(outputFile);)int value;while (value = in.read() != -1) output.write(value + 5);)17.15 import java.util.Scanner;import java.io.*;public class Exercisel7_15 public static void main(String args) throws Exception Scanner input = new Scanner(System.in);System.out.print("Enter an encrypted file:");File inputFile = new File(input.nextLine();System.outprint("Enter the output file:");File outputFile = new File(input.nextLine();BufferedlnputStream in = new BufferedInputStream( new FilelnputStream(inputFile);BufferedOutputStream output = new BufferedOutputStream( new FileOutputStream(outputFile);int value;while (value = in.read() != -1) output.write(value - 5);17.16import java.io.*;import java.util.Scanner;public class Exercisel7_16 public static void main(String args) throws Exception Scanner input = new Scanner(System.in);System.out.print("Enter a filename:");String filename = input.nextLine();int counts = new int128;try (BufferedlnputStream fileinput = new BufferedlnputStream( new FilelnputStream(new File(filename);)int r;while (r = fileinput.read() != -1 ) counts(byte)r+;)System.out.printf(H%15s%15snH"ASCII Code", "Counts");for (int i = 0; i < counts.length; i+)if (countsi != 0) System.out.printf ("%15d%15dn", i, countsi);)17.17import java.io.*;public class Exercisel7_17 public static void main(String args) throws Exception BitOutputStream output = new BitOutputStream(newFile(,Exercisel7_17.dat,');output.writeBit();output.close();System. out.println("Done");)public static class BitOutputStream private FileOutputStream output;private int value;private int count = 0;private int mask = 1; / The bits are all zeros except the last onepublic BitOutputStream(File file) throws lOException output = new FileOutputStream(file);)public void writeBit(char bit) throws lOException count+;value = value << 1;if (bit = 1') value = value | mask;if (count = 8) output.write(value);count = 0;)public void writeBit(String bitstring) throws lOException for (int i = 0; i < bitstring.length(); i+) writeBit(bitString.charAt(i);)/* Write the last byte and close the stream. If the last byte is not full, right-shfit with zeros */public void close() throws lOException if (count > 0) value = value << (8 - count); output.write(value);output.close();)17.18import java.io.*;import java.util.Scanner;public class Exercisel7_18 public static void main(String args) throws lOException Scanner input = new Scanner(System.in);System.out.print("Enter a file name:");String filename = input.nextLine();Fileinputstream in = new FileInputStream(filename);int value;while (value = in.read() != -1) System.out.print(getBits(value);in.close();)public static String getBits(int value) public class Exercisel7_03 /* Main method */public static void main(String args) / Read dataint count = 0;try ( / Declare and create data input and output streams DatalnputStream dis =new DatalnputStream(new FileInputStream("Exercisel7_03.dat");)(int total = 0;while (dis.available() > 0) int temp = dis.readlnt();total += temp;count+;System.out.print(temp + "");)System.out.printIn("nCount is " + count);System.out.printIn("nTotal is " + total);)catch (FileNotFoundException ex) System.out.printIn("File not found");)catch (lOException ex) System.out.println(ex getMessage();)17.4import java.io.*;public class Exercisel7_04 public static void main(String args) throws lOException try (BufferedReader input = new BufferedReader(new FileReader(args0);DataOutputStream output = new DataOutputStream(new FilcOutputStrcam(argsl);)(String line;while (line = input.readLine() != null) output.writeUTF(line);String result =int mask = 1;for (int i = 7; i >= 0; i-) int temp = value >> i; int bit = temp & mask;result = result + bit;)return result;)17.19import java.io.*;import java.util.Scanner;public class Exercisel7_19 public static void main(String args) throws lOException Scanner input = new Scanner(System.in);System.out.print("Enter a file name:");String filename = input.nextLine();Fileinputstream in = new FileInputStream(filename);int value;while (value = in.read() != -1) System.out . print(getHex(getBits(value);)/* Convert the 8-bit string to a 2-digit hex number */public static String getHex(String bitstring) / Get the first half hex numberint value = (bitstring.charAt(0) - '0,) * 8 +(bitstring.charAt(l) - 0,) * 4 +(bitstring.charAt(2) - '0') *2+ (bitstring.charAt(3) - '0') * 1;String result = "" + toHexChar(value);/ Get the second half hex number value = (bitstring.charAt(4) - '0') *8+ (bitString.charAt(5) - '0,) * 4 +(bitstring.charAt(6) - '0')*2+(bitString.charAt(7) - '0') * 1;return result + toHexChar(value);)/* Convert an integer to a single hex digit in a character */ public static char toHexChar(int hexValue) if (hexValue <= 9 && hexValue >= 0)return (char)(hexValue + '0');else / hexValue <= 15 && hexValue >= 10return (char)(hexValue - 10 + 1 A');)public static String getBits(int value) String result =心;int mask = 1;for (int i = 7; i >= 0; i-) int temp = value >> i;int bit = temp & mask;result = result + bit;)return result;)17.20import java.io.*;import javafx.application.Application;import javafx.geometry.Pos;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.control.Label;import ScrollPane;import javafx.scene.control.TextArea;import javafx.scene.control.TextField;import javafx.scene.layout . BorderPane;import javafx.stage.Stage;public class Exercisel7_20 extends Application private TextField tfFilename = new TextField();private Button btSave = new Button("Save the change");private TextArea taBits = new TextArea();public void start(Stage primarystage) BorderPane panel = new BorderPane();panel.setLeft(new Label("Enter a file: ");panel.setcenter(tfFilename);BorderPane pane = new BorderPane。;pane.setTop(panel);pane.setCenter(new ScrollPane(taBits);pane.setBottom(btSave);BorderPane.setAlignment(btSave, Pos.CENTER);/ Create a scene and place it in the stageScene scene = new Scene(pane> 400, 120);primarystage.setTitle("Exercisel7_20"); / Set the stage