Java语言-小学数学练习
文章目錄
- 勵志
- 小學數學練習
- 1.1【問題描述】
- 1.2【基本要求】
- 1.3【模塊劃分】
- 1.4【算法思想】
- 1.5【題解】
- 知識總結
- 一、文件
- 1.File類的構造函數
- 2.File類的獲取
- 3.文件和文件夾的創建刪除等
- 4.listFiles()方法介紹
- 二、流
- 流的分類表
- 1.字節流
- 1.1、字節輸出流OutputStream
- 1.11、FileOutputStream類
- 1.2、字節輸入流InputStream
- 1.21、讀寫數據read(byte[])方法
- 2、字符流
- 2.1.字符編碼表
- 2.2.FileReader讀取包含中文的文件
- 2.3.flush()和close()的區別
- 3.轉換流
- 4.緩沖流
- 4.1.字節緩沖流
- 4.11 字節緩沖輸出流BufferedOutputStream
- 4.12.字節緩沖輸入流 BufferedInputStream
- 4.2.字符緩沖流
- 4.2.1字符緩沖輸出流 BufferedWriter
- 4.2.2字符緩沖輸入流 BufferedReader
- 流的總結:
- 四個明確:
- 三個過程
- 三、小案例
- 1、文件的基本操作
- 2、復制文件帶有進度條
- 3、字節流讀文件
- 4、字符流對文件
- 5、向文件里寫內容
- 6、StringReader就是往String上懟
- 四:小實驗-下載網易云音樂
勵志
眾里尋他千百度,驀然回首,那人卻在燈火闌珊處
小學數學練習
1.1【問題描述】
編寫一個幫助小學生練習數學的程序,幫助小學生練習 100 以內的四種數學運算:加、減、乘、除。
1.2【基本要求】
a) 程序應先詢問用戶的 ID 號(ID 號包括兩個大寫字母和 4 位數字),例如:
請輸入用戶 ID 號:AB1234
程序應對輸入的 ID 號驗證,符合 ID 號要求的格式, 然后程序提示三種選擇:
(1)開始測試
(2)檢查分數
(3)退出
b) 測試:該程序將給出 10 道數學題,例如:
12 * 3 =36
48 + 32 =80
…
56 / 28 =2
注意:
i)學生將依次回答每一個問題(在等于號后面給出答案) ,然后給出下一道題。
ii)試題應包含四種數學運算:加、減、乘、除, 它們是隨機產生的。 相鄰的問題應該是不同的操作,
每個操作必須至少出現一次。 報告中應給出實現方法或算法。
iii)為每道題隨機生成數字, 但必須確保參與運算的數字和結果都小于 100 且大于零的整數, 除法時
還要注意兩個整數要能整除。 報告中應給出實現方法或算法。
iv)十道題做完后,記錄學生完成這十道題所用的時間。
v)給每個學生一個分數。將該學生的 ID、成績和使用時間保存到一個名為 record.txt 的文件中。
vi)在屏幕上輸出以下信息:(3 列信息, 第 1 列是 b) 中的測試題, 藍色部分)
問題 | 正確答案 | 你的答案
c) 成績檢查:從文件“record.txt” 中列出該學生的所有歷史成績(其他學生的不顯示)。例如:
你以前的記錄是:
AB1234 80 150 秒
AB1234 50 182 秒
AB1234 90 98 秒
1.3【模塊劃分】
// 主類 public class One{} // 用戶類 class User{} // 功能類 class Fun{}// 封裝主類 public class One {public static void main(String[] args) {// 初始化界面Fun fun = new Fun();// 加載一位新的用戶User user = new User(fun.start());// 用戶進入界面fun.index(user);} }
/*** 封裝用戶類*/ class User{/*** 用戶ID*/private String id;/*** 用戶成績*/private int scores = 0;/*** 用戶所用時間*/private int time = 0;/*** 用戶做題數據*/private String data = "";/*** 初始化用戶*/public User(String id){this.id = id;}// 一堆堆get,set方法.......// 添加數據的方法public void addData(String data){this.data = this.data.concat(data);} }
class Fun{/*** 用戶輸入ID號模塊*/public String start(){}/*** 首頁*/public void index(User user){}/*** 保存成績*/public void recordUser(User user) {}/*** 檢查用戶*/public void checkUser(User user){}/*** 隨機出題*/public void test(User user){}/*** 加法*/public void add(User user){}/*** 減法*/public void delete(User user){}/*** 乘法*/public void multi(User user){}/*** 除法*/public void div(User user){}/*** 校驗用戶名*/public boolean verify(String id){}
/*** 用戶輸入ID號模塊*/public String start(){System.out.print("請輸入用戶 ID 號");Scanner sc = new Scanner(System.in);String id = sc.next();while (!verify(id)){System.out.println("ID 號包括兩個大寫字母和 4 位數字,請重新輸入用戶ID");id = sc.next();}return id;}/*** 校驗用戶名*/public boolean verify(String id){// 正則表達式String format = "[A-Z]{2}[0-9]{4}";return id.matches(format);}
/*** 加法*/public void add(User user){Scanner sc = new Scanner(System.in);int[] tar = randTil(0);String ques = tar[0] + "+" + tar[1] + "=";System.out.print(ques);int result = sc.nextInt();if(result == tar[2]){user.setScores(user.getScores() + 10);}user.addData(ques + "|" + tar[2] + " | " + result + "--");}/*** 減法*/public void delete(User user){Scanner sc = new Scanner(System.in);int[] tar = randTil(0);String ques = tar[2] + "-" + tar[1] + "=";System.out.print(ques);int result = sc.nextInt();if(result == tar[0]){user.setScores(user.getScores() + 10);}user.addData(ques + "|" + tar[0] + " | " + result + "--");}/*** 乘法*/public void multi(User user){Scanner sc = new Scanner(System.in);int[] tar = randTil(1);String ques = tar[0] + "*" + tar[1] + "=";System.out.print(ques);int result = sc.nextInt();if(result == tar[2]){user.setScores(user.getScores() + 10);}user.addData(ques + "|" + tar[2] + " | " + result + "--");}/*** 除法*/public void div(User user){Scanner sc = new Scanner(System.in);int[] tar = randTil(1);String ques = tar[2] + "\\" + tar[1] + "=";System.out.print(ques);int result = sc.nextInt();if(result == tar[0]){user.setScores(user.getScores() + 10);}user.addData(ques + "|" + + tar[0] + " | " + result + "--");}/*** 數字生成工具*/public int[] randTil(int cal){int[] tar = new int[3];int num1 = (int)(Math.random()*99) + 1;int num2 = (int)(Math.random()*99) + 1;if(cal == 0){tar[2] = Math.max(num1, num2);if(num1 > num2){tar[0] = tar[2] - num2;tar[1] = num2;}else {tar[0] = num1;tar[1] = tar[2] - num1;}}if(cal == 1){tar[0] = (int)(Math.random()*(100/num1-1)) + 1;tar[1] = num1;tar[2] = tar[0] * tar[1];}return tar;}
/*** 隨機出題*/public void test(User user){// 初始化用戶答題數據user.setData("");// 創建儲存題目分布數組int[] num = new int[10];// 上一次出現過的數字int lastNum = -1;// 先保證四種運算出現一次for (int i = 0; i < 4; i++) {lastNum = randNoRe(lastNum,0, 10);num[lastNum] = i + 1;}lastNum = -1;for(int i = 0; i < 10; i++){if(num[i] == 0){// 只填未填好的數字num[i] = randNoRe(lastNum, 1, 4);if(i < num.length - 1){if(num[i] == num[i + 1]){i--;num[i] = 0;continue;}}}lastNum = num[i];}for(int n : num){switch (n){case 1 : add(user); break;case 2 : delete(user); break;case 3 : multi(user); break;case 4 : div(user); break;default:break;}}String[] datas = user.getData().split("--");System.out.println("問題 | 正確答案 | 你的答案");for (String data : datas) {System.out.println(data);}System.out.println("本次得分:" + user.getScores());}/*** 隨機生成與上一次不同的數字組成的數組* lastNum:上一個數字,a,b生成范圍*/public int randNoRe(int lastNum, int a, int b){int n = (int)(Math.random()*b + a);while(lastNum == n) {n = (int) (Math.random()*b + a);}return n;}
/*** 文件路徑*/private static final String FILE_PATH = "E:\\record.txt";/*** 保存成績*/public void recordUser(User user) {FileWriter fileWriter = null;try {File file = new File(FILE_PATH);// 判斷文件是否存在if (!file.isFile()) {file.createNewFile();}// 追加文件fileWriter = new FileWriter(file, true);// 追加內容fileWriter.append(user.getId()).append(" ").append(String.valueOf(user.getScores())).append(" ").append(String.valueOf(user.getTime())).append(" 秒-");}catch (Exception e){e.printStackTrace();}finally {if(fileWriter != null){try {// 刷新流對象中的緩沖中的數據fileWriter.flush();fileWriter.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 檢查用戶*/public void checkUser(User user){String[] s1 = null;FileReader fileReader = null;try{// 處理流讀取fileReader = new FileReader(new File(FILE_PATH));BufferedReader bf = new BufferedReader(fileReader);String s;while ((s = bf.readLine()) != null){s1 = s.split("-");}// 判斷是否是新用戶boolean flag = true;for(String str : s1){if(str.substring(0,6).equals(user.getId())){// 控制打印次數if(flag){System.out.println("你以前的記錄是:");flag = false;}System.out.println(str);}}// 是新用戶if(flag){System.out.println("新用戶,歡迎你使用!");}}catch (Exception e){e.printStackTrace();}finally {if(fileReader != null){try {fileReader.close();} catch (IOException e) {e.printStackTrace();}}}}
/*** 首頁*/public void index(User user){// 列出用戶歷史成績checkUser(user);boolean flag = true;while (flag) {System.out.println("(1)開始測試\n" +"(2)檢查分數\n" +"(3)退出");// 用戶進行功能選擇Scanner sc = new Scanner(System.in);int choice = sc.nextInt();switch (choice) {case 1:// 初始化用戶成績user.setScores(0);// 開始計時long start = System.currentTimeMillis();// 開始測試test(user);// 結束計時long end = System.currentTimeMillis();// 設置用戶游戲時間user.setTime((int) ((end - start) / 1000));// 保存成績recordUser(user);break;case 2:// 檢查分數checkUser(user);break;case 3:flag = false;System.out.println("退出成功");break;default:break;}}}
1.4【算法思想】
關于如何生成10個數字(每個數字與前一個不同,每個數字至少出現過一次)
1.5【題解】
import java.io.*; import java.util.Scanner;/*** @author xh*/ public class One {public static void main(String[] args) {// 初始化界面Fun fun = new Fun();// 加載一位新的用戶User user = new User(fun.start());// 用戶進入界面fun.index(user);} }/*** 用戶類*/ class User{/*** 用戶ID*/private String id;/*** 用戶成績*/private int scores = 0;/*** 用戶所用時間*/private int time = 0;/*** 用戶做題數據*/private String data = "";/*** 初始化用戶*/public User(String id){this.id = id;}public String getId() {return id;}public int getScores() {return scores;}public void setScores(int scores) {this.scores = scores;}public int getTime() {return time;}public void setTime(int time) {this.time = time;}public String getData() {return data;}public void setData(String data) {this.data = data;}public void addData(String data){this.data = this.data.concat(data);} }class Fun{/*** 文件路徑*/private static final String FILE_PATH = "E:\\record.txt";/*** 用戶輸入ID號模塊*/public String start(){System.out.print("請輸入用戶 ID 號");Scanner sc = new Scanner(System.in);String id = sc.next();while (!verify(id)){System.out.println("ID 號包括兩個大寫字母和 4 位數字,請重新輸入用戶ID");id = sc.next();}return id;}/*** 首頁*/public void index(User user){// 列出用戶歷史成績checkUser(user);boolean flag = true;while (flag) {System.out.println("(1)開始測試\n" +"(2)檢查分數\n" +"(3)退出");// 用戶進行功能選擇Scanner sc = new Scanner(System.in);int choice = sc.nextInt();switch (choice) {case 1:// 初始化用戶成績user.setScores(0);// 開始計時long start = System.currentTimeMillis();// 開始測試test(user);// 結束計時long end = System.currentTimeMillis();// 設置用戶游戲時間user.setTime((int) ((end - start) / 1000));// 保存成績recordUser(user);break;case 2:// 檢查分數checkUser(user);break;case 3:flag = false;System.out.println("退出成功");break;default:break;}}}/*** 保存成績*/public void recordUser(User user) {FileWriter fileWriter = null;try {File file = new File(FILE_PATH);// 判斷文件是否存在if (!file.isFile()) {file.createNewFile();}// 追加文件fileWriter = new FileWriter(file, true);// 追加內容fileWriter.append(user.getId()).append(" ").append(String.valueOf(user.getScores())).append(" ").append(String.valueOf(user.getTime())).append(" 秒-");}catch (Exception e){e.printStackTrace();}finally {if(fileWriter != null){try {// 刷新流對象中的緩沖中的數據fileWriter.flush();fileWriter.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 檢查用戶*/public void checkUser(User user){String[] s1 = null;FileReader fileReader = null;try{// 處理流讀取fileReader = new FileReader(new File(FILE_PATH));BufferedReader bf = new BufferedReader(fileReader);String s;while ((s = bf.readLine()) != null){s1 = s.split("-");}// 判斷是否是新用戶boolean flag = true;for(String str : s1){if(str.substring(0,6).equals(user.getId())){// 控制打印次數if(flag){System.out.println("你以前的記錄是:");flag = false;}System.out.println(str);}}// 是新用戶if(flag){System.out.println("新用戶,歡迎你使用!");}}catch (Exception e){e.printStackTrace();}finally {if(fileReader != null){try {fileReader.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 隨機出題*/public void test(User user){// 初始化用戶答題數據user.setData("");// 創建儲存題目分布數組int[] num = new int[10];// 上一次出現過的數字int lastNum = -1;// 先保證四種運算出現一次for (int i = 0; i < 4; i++) {lastNum = randNoRe(lastNum,0, 10);num[lastNum] = i + 1;}lastNum = -1;for(int i = 0; i < 10; i++){if(num[i] == 0){// 只填未填好的數字num[i] = randNoRe(lastNum, 1, 4);if(i < num.length - 1){if(num[i] == num[i + 1]){i--;num[i] = 0;continue;}}}lastNum = num[i];}for(int n : num){switch (n){case 1 : add(user); break;case 2 : delete(user); break;case 3 : multi(user); break;case 4 : div(user); break;default:break;}}String[] datas = user.getData().split("--");System.out.println("問題 | 正確答案 | 你的答案");for (String data : datas) {System.out.println(data);}System.out.println("本次得分:" + user.getScores());}/*** 隨機生成與上一次不同的數字組成的數組* lastNum:上一個數字,a,b生成范圍*/public int randNoRe(int lastNum, int a, int b){int n = (int)(Math.random()*b + a);while(lastNum == n) {n = (int) (Math.random()*b + a);}return n;}/*** 數字生成工具*/public int[] randTil(int cal){int[] tar = new int[3];int num1 = (int)(Math.random()*99) + 1;int num2 = (int)(Math.random()*99) + 1;if(cal == 0){tar[2] = Math.max(num1, num2);if(num1 > num2){tar[0] = tar[2] - num2;tar[1] = num2;}else {tar[0] = num1;tar[1] = tar[2] - num1;}}if(cal == 1){tar[0] = (int)(Math.random()*(100/num1-1)) + 1;tar[1] = num1;tar[2] = tar[0] * tar[1];}return tar;}/*** 加法*/public void add(User user){Scanner sc = new Scanner(System.in);int[] tar = randTil(0);String ques = tar[0] + "+" + tar[1] + "=";System.out.print(ques);int result = sc.nextInt();if(result == tar[2]){user.setScores(user.getScores() + 10);}user.addData(ques + "|" + tar[2] + " | " + result + "--");}/*** 減法*/public void delete(User user){Scanner sc = new Scanner(System.in);int[] tar = randTil(0);String ques = tar[2] + "-" + tar[1] + "=";System.out.print(ques);int result = sc.nextInt();if(result == tar[0]){user.setScores(user.getScores() + 10);}user.addData(ques + "|" + tar[0] + " | " + result + "--");}/*** 乘法*/public void multi(User user){Scanner sc = new Scanner(System.in);int[] tar = randTil(1);String ques = tar[0] + "*" + tar[1] + "=";System.out.print(ques);int result = sc.nextInt();if(result == tar[2]){user.setScores(user.getScores() + 10);}user.addData(ques + "|" + tar[2] + " | " + result + "--");}/*** 除法*/public void div(User user){Scanner sc = new Scanner(System.in);int[] tar = randTil(1);String ques = tar[2] + "\\" + tar[1] + "=";System.out.print(ques);int result = sc.nextInt();if(result == tar[0]){user.setScores(user.getScores() + 10);}user.addData(ques + "|" + + tar[0] + " | " + result + "--");}/*** 校驗用戶名*/public boolean verify(String id){String format = "[A-Z]{2}[0-9]{4}";return id.matches(format);} }知識總結
一、文件
問題引入:如何判斷輸入、輸出?
參照物:Java程序
輸出:程序→文件
把內存中的數據儲存到持久化設備,這個動作稱為輸出 Output,寫
輸入:文件→程序
把持久設備上的數據讀取到內存中,這個動作稱為輸入 Input,讀
Java中把文件或者目錄(文件夾)都封裝成File對象,如果我們要去操作硬盤上的文件,或者文件夾只要找到File這個類,調用它的功能操作文件或者文件夾
1.File類的構造函數
String pathName = "e:\\hello.java";File f1 = new File(pathName);File f2 = new File("e:\\","hello.java");File dir = new File("e:\\");File f3 = new File(dir,"hello.java");2.File類的獲取
3.文件和文件夾的創建刪除等
4.listFiles()方法介紹
File[] files = dir.listFiles();for(File file : files){System.out.println(file);}注意:
1、指定的目錄必須是存在
2、指定的必須是目錄。否則容易引發返回數組為null,出現NullPointerException
二、流
關鍵字
input 輸入 output 輸出 stream 流 writer 字符輸入流 reader 字符輸入流 File 文件
只要會了字節流就都會了
字節流能處理一切
有詩曰:輸入還是輸出?字符還是字節?
流的分類表
| 分類 | 字節輸入流 |字節輸出流|字符輸入流|字符輸出流|
|–|–|–|–|–|–|–|
|抽象基類| InputStream |OutputStream|Reader| Writer|
|訪問文件| FileInputStream| FileOutputStream |FileReader| FileWriter|
|訪問數組|ByteArrayInputStream |ByteArrayOutputStream| CharArrayReader|CharArrayWriter|
|訪問字符串| ||StringReader| StringWriter|
|緩沖流 |BufferedInputStream |BufferedOutputStream |BufferedReader |BufferedWriter|
|轉換流 |||InputStreamReader |OutputStreamWriter|
|對象流| ObjectInputStream|ObjectOutputStream|
轉換流能都將字符流轉成字節流
1.字節流
1.1、字節輸出流OutputStream
輸出流中定義都是寫write方法
1.11、FileOutputStream類
給文件續寫、換行
File file = new File("c:\\file.txt");// 第二個參數 傳入trueFileOutputStream fos = new FileOutputStream(file, true); String str = "\r\n" +"換行內容";fos.write(str.getBytes());1.2、字節輸入流InputStream
1.21、讀寫數據read(byte[])方法
FileOutputStream fos = new FileOutputStream(destFile);// 緩沖區,臨時數組容器byte[] buf = new byte[1024];//長度定義成1024的整數倍 int len = 0;while((len=fis.read(buf))!=-1){System.out.println(new String(buf,0,len));// 將數組中的指定長度的數據寫入到輸出流中。fos.write(buf, 0, len); }// 關閉資源。fos.close();2、字符流
2.1.字符編碼表
編碼表:其實就是生活中字符和計算機二進制的對應關系表。
1、ASCII: 一個字節中的7位就可以表示。對應的字節都是正數。0-xxxxxxx
2、iso-8859-1:拉丁碼表 latin,用了一個字節用的8位。1-xxxxxxx 負數。
3、GB2312:簡體中文碼表。包含6000-7000中文和符號。用兩個字節表示。兩個字節第一個字節是負數,第二個字節可能是正數
-
GBK:目前最常用的中文碼表,2萬的中文和符號。用兩個字節表示,其中的一部分文字,第一個字節開頭是1,第二字節開頭是0
-
GB18030:最新的中文碼表,目前還沒有正式使用。
4、unicode:國際標準碼表:無論是什么文字,都用兩個字節存儲。
-
Java中的char類型用的就是這個碼表。char c = ‘a’;占兩個字節。
-
Java中的字符串是按照系統默認碼表來解析的。簡體中文版 字符串默認的碼表是GBK。
5、UTF-8:基于unicode,一個字節就可以存儲數據,不要用兩個字節存儲,而且這個碼表更加的標準化,在每一個字節頭加入了編碼信息(后期到api中查找)。
能識別中文的碼表:GBK、UTF-8;正因為識別中文碼表不唯一,涉及到了編碼解碼問題。
對于我們開發而言;常見的編碼 GBK UTF-8 ISO-8859-1
編碼與解碼:
文字—>(數字) :編碼。 “abc”.getBytes() byte[]
(數字)—>文字 : 解碼。 byte[] b={97,98,99} new String(b)
2.2.FileReader讀取包含中文的文件
FileReader fr = new FileReader("D:\\test\\cn.txt");int ch = 0;while((ch = fr.read())!=-1){//輸出的字符對應的編碼值System.out.println(ch);//輸出字符本身System.out.println((char)ch);}FileOutputStream fos = new FileOutputStream("D:\\test\\cn.txt");fos.write("文字".getBytes());fos.close();2.3.flush()和close()的區別
flush():將流中的緩沖區緩沖的數據刷新到目的地中,刷新后,流還可以繼續使用。
close():關閉資源,但在關閉前會將緩沖區中的數據先刷新到目的地,否則丟失數據,然后在關閉流。流不可以使用。如果寫入數據多,一定要一邊寫一邊刷新,最后一次可以不刷新,由close完成刷新并關閉。
3.轉換流
字符流與字節流之間的橋梁
OutputStreamWriter流對象,如何把字符轉成字節輸出的呢?
其實在OutputStreamWriter流中維護自己的緩沖區,當我們調用OutputStreamWriter對象的write方法時,會拿著字符到指定的碼表中進行查詢,把查到的字符編碼值轉成字節數存放到OutputStreamWriter緩沖區中。然后再調用刷新功能,或者關閉流,或者緩沖區存滿后會把緩沖區中的字節數據使用字節流寫到指定的文件中。
//創建讀取文件的字節流對象InputStream in = new FileInputStream("c:\\ccf.txt");//創建轉換流對象 //InputStreamReader isr = new InputStreamReader(in);這樣創建對象,會用本地默認碼表讀取,將會發生錯誤解碼的錯誤InputStreamReader isr = new InputStreamReader(in,"utf-8");//使用轉換流去讀字節流中的字節int ch = 0;while((ch = isr.read())!=-1){System.out.println((char)ch);}//關閉流isr.close();
注意:在讀取指定的編碼的文件時,一定要指定編碼格式,否則就會發生解碼錯誤,而發生亂碼現象。
總結:
字節—>字符 : 看不懂的—>看的懂的。 需要讀。輸入流。 InputStreamReader(我們需要字符)
字符—>字節 : 看的懂的—>看不懂的。 需要寫。輸出流。 OutputStreamWriter(文件需要字節)
4.緩沖流
Java中提供了一套緩沖流,它的存在,可提高IO流的讀寫速度
4.1.字節緩沖流
字節緩沖流根據流的方向,共有2個
- 寫入數據到流中,字節緩沖輸出流 BufferedOutputStream
- 讀取流中的數據,字節緩沖輸入流 BufferedInputStream
內部都包含了一個緩沖區,通過緩沖區讀寫,就可以提高了IO流的讀寫速度
4.11 字節緩沖輸出流BufferedOutputStream
/** 寫數據到文件的方法* 1,創建流* 2,寫數據* 3,關閉流*/private static void write() throws IOException {//創建基本的字節輸出流FileOutputStream fileOut = new FileOutputStream("abc.txt");//使用高效的流,把基本的流進行封裝,實現速度的提升BufferedOutputStream out = new BufferedOutputStream(fileOut);//2,寫數據out.write("hello".getBytes());//3,關閉流out.close();}4.12.字節緩沖輸入流 BufferedInputStream
/** 從文件中讀取數據* 1,創建緩沖流對象* 2,讀數據,打印* 3,關閉*/private static void read() throws IOException {//1,創建緩沖流對象FileInputStream fileIn = new FileInputStream("abc.txt");//把基本的流包裝成高效的流BufferedInputStream in = new BufferedInputStream(fileIn);//2,讀數據int ch = -1;while ( (ch = in.read()) != -1 ) {//打印System.out.print((char)ch);}//3,關閉in.close();}4.2.字符緩沖流
4.2.1字符緩沖輸出流 BufferedWriter
void newLine() 根據當前的系統,寫入一個換行符
/** BufferedWriter 字符緩沖輸出流* 方法* public void newLine()寫入一個行分隔符* * 需求: 通過緩沖輸出流寫入數據到文件* 分析:* 1,創建流對象* 2,寫數據* 3,關閉流* */ public class BufferedWriterDemo {public static void main(String[] args) throws IOException {//創建流//基本字符輸出流FileWriter fileOut = new FileWriter("file.txt");//把基本的流進行包裝BufferedWriter out = new BufferedWriter(fileOut);//2,寫數據for (int i=0; i<5; i++) {out.write("hello");out.newLine();}//3,關閉流out.close();} }4.2.2字符緩沖輸入流 BufferedReader
public String readLine()
讀取一個文本行,包含該行內容的字符串,不包含任何行終止符,如果已到達流末尾,則返回 null
流的總結:
四個明確:
-
明確一:要操作的數據是數據源還是數據目的。
源:InputStream Reader目的:OutputStream Writer
先根據需求明確要讀,還是要寫。
-
明確二:要操作的數據是字節還是文本呢?
源:字節:InputStream文本:Reader目的:字節:OutputStream文本:Writer
明確具體的體系。
-
明確三:明確數據所在的具體設備。
源設備:硬盤:文件 File開頭。內存:數組,字符串。鍵盤:System.in;網絡:Socket目的設備:硬盤:文件 File開頭。內存:數組,字符串。屏幕:System.out網絡:Socket
要使用哪個流對象
-
明確四:是否需要額外功能呢?
額外功能:轉換嗎?轉換流。InputStreamReader OutputStreamWriter高效嗎?緩沖區對象。BufferedXXX
三個過程
-
向文件中寫入數據的過程
1,創建輸出流對象2,寫數據到文件3,關閉輸出流 -
從文件中讀數據的過程
1,創建輸入流對象2,從文件中讀數據3,關閉輸入流 -
文件復制的過程
1,創建輸入流(數據源)2,創建輸出流(目的地)3,從輸入流中讀數據4,通過輸出流,把數據寫入目的地5,關閉流
三、小案例
1、文件的基本操作
@Test public void testFile() throws Exception{ //創建文件 File file = new File("E:\\test\\b.txt"); file.createNewFile(); //查看文件夾下的文件 File file2 = new File("E:\\test\\b.txt"); String[] list = file2.list(); for (int i = 0; i < list.length; i++) { System.out.println(list[i]); } }2、復制文件帶有進度條
@Test public void testFileInputStream() throws Exception { File file = new File("E:\\test\\a\\233.mp4"); //拿到文件的大小 long dataLength = file.length(); //構建一個輸入流,他的數據要流入內存,咱們的程序 InputStream inputStream = new FileInputStream(file); //構建一個輸出流,他的數據要從內存(咱們的程序)流到另一個文件夾 OutputStream outputStream = new FileOutputStream("E:\\test\\b\\233.mp4"); //新建一個水泵,能存一點水,每次對對1k byte[] buffer = new byte[1024 *1024*50]; Long currentLength = 0L; //如果read返回-1說明讀完了 int len; int showNumber = 0; while ( (len = inputStream.read(buffer)) != -1 ){ outputStream.write(buffer,0,len); currentLength += len; //當下加載了百分之多少 int currentPer = (int)(((double)currentLength/dataLength)*100); //目的是不重復顯示 if(showNumber != currentPer){ showNumber = currentPer; System.out.println("已經拷貝了百分之" + showNumber); } } outputStream.flush(); outputStream.close(); inputStream.close(); }3、字節流讀文件
@Test public void testInputStream() throws Exception{ //懟了一個輸入流到文件上 InputStream wordInput = new FileInputStream("E:\\test\\a\\word.txt"); //建立緩沖區 byte[] bytes = new byte[1024]; int len; while ( (len = wordInput.read(bytes)) != -1 ){ System.out.println(new String(bytes,0,len, Charset.forName("ISO8859-1"))); } wordInput.close(); }4、字符流對文件
@Test public void testReader() throws Exception{ //懟了一個輸入流到文件上 Reader reader = new FileReader("E:\\test\\a\\word.txt"); BufferedReader br = new BufferedReader(reader); String str; while ((str = br.readLine()) != null){ System.out.println(str); } reader.close(); br.close(); }5、向文件里寫內容
@Test public void testWriter() throws Exception{ //懟了一個輸入流到文件上 Writer writer = new FileWriter("E:\\test\\a\\writer.txt"); BufferedWriter bw = new BufferedWriter(writer); Scanner scanner = new Scanner(System.in); while (true){ System.out.print("請輸入:"); String words = scanner.next(); bw.write(words); bw.flush(); } }6、StringReader就是往String上懟
@Test public void testStringReader() throws Exception{ //懟了一個string OutputStream os = new FileOutputStream("E:\\test\\a\\user.txt"); ObjectOutput oo = new ObjectOutputStream(os); oo.writeObject(new User("小航",3,4)); oo.flush(); oo.close(); os.close(); }四:小實驗-下載網易云音樂
step1:
https://music.163.com/
進入官網,隨便搜首歌曲
step2:進入頁面,打開開發者工具(瀏覽器F12),選擇network
step3:選擇media過濾,選擇一個有效鏈接
https://m701.music.126.net/20210714161041/4fa28b697be05c47052a5b51039e5668/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/5755656629/2ce0/caf3/9e65/4e8df6c581219b094bdce6db938379be.m4a
step4:打開ideal,創建一個class文件Url
總結
以上是生活随笔為你收集整理的Java语言-小学数学练习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 指派问题与匈牙利法讲解
- 下一篇: 公众号开发配置,服务号对接第三方服务器配