主頁 > 後端開發 > 經常用的Format,想不到這么強大

經常用的Format,想不到這么強大

2020-09-15 16:28:22 後端開發

Java中允許我們對指定的物件進行某種格式化,從而得到我們想要的格式化樣式,

Format

首先介紹java.text包中的Format
Foramt是一個抽象基類,其具體子類必須實作

 

format(Object obj, StringBuffer toAppendTo, FieldPosition pos)

 

parseObject(String source, ParsePosition pos)

兩個抽象方法,
format方法用于將物件格式化為指定模式的字串
parseObject方法用于將字串重新決議為物件
Format的直接子類包括DateFormatNumberFormatMessageFormat,下面一一進行介紹

1.DateFormat

DateFormat根據當前語言環境格式化日期和時間,
DateFormat是一個抽象類,所以不能直接new創建實體物件,但該類為我們提供了工廠方法方便我們使用,

1.getDateInstance()方法,獲取格式化的日期,輸出樣式:2015-12-102.getDateTimeInstance()方法,獲取格式化的日期和時間,輸出樣式:2015-12-10 10:21:413.getTimeInstance()方法,獲取格式化的時間,輸出樣式:10:21:414.getInstance()方法,獲取格式化的日期和時間,輸出樣式:15-12-10 上午10:21


也許你會發現,在這些工廠發放中允許我們傳入一個int引數,該引數允許我們設定格式化風格,從而得到我們相對理想的結果,下表中對應了不同的style值和輸出樣式(這些常量值都在DateFormat類中)

樣式值日期時間
SHORT 15-12-10 上午10:08
MEDIUM 2015-12-10 10:09:23
LONG 2015年12月10日 上午10時09分40秒
FULL 2015年12月10日 星期四 上午10時17分30秒 CST
DEFAULT 2015-12-10 10:18:07

當然你也可以指定語言環境獲取該語言環境下的格式化日期和時間,

 

DateFormat format = DateFormat.getDateInstance(DateFormat.DEFAULT,Locale.CANADA);//獲取加拿大的格式化日期

也許你要發問了,上面的格式沒有我一個想要的啊,那好,這里還有一個好東西

SimpleDateFormat

SimpleDateFormatDateFormat的一個具體類,它允許我們指定格式模式從而獲取我們理想的格式化日期和時間,
通過SimpleDateFormat的構造方法你可以傳入一個格式模式字串或者通過applyPattern(String pattern)方法添加一個格式模式字串,
對于格式模式字串,API為我們提供了豐富的模式元素,下面列出幾個常用的模式元素

字母日期或時間元素示例
y 2015
M 年中的月份 12
w 年中的周數 50
W 月份中的周數 02
D 年中的天數 344
d 月份中的天數 10
F 月份中的星期 02
E 星期中的天數 星期四、Thu
a AM/PM標記 下午、PM
H 一天中的小時數(0~23) 21
k 一天中的小時數(1~24) 21
K am/pm中的小時數(0~11) 09
h am/pm中的小時數(1~12) 09
m 小時中的分鐘數 31
s 分鐘中的秒數 08
S 毫秒數 716

如果你設定Locale的話,會有不同的顯示格式,比如如果設定Locale.ENGLISH,E會顯示為英文格式,a顯示為AM或PM

Date date = new Date();SimpleDateFormat format = new SimpleDateFormat("今天是yyyy-MM-dd E hh:mm:ss,是yyyy年的第DD天,在該月是第dd天");System.out.println(format.format(date));
將會輸出:今天是2015-12-10 星期四 09:38:16,是2015年的第344天,在該月是第10天

2.NumberFormat

NumberFormat根據當前語言環境格式化數字
NumberFormat同樣是一個抽象基類,可以使用API中的工廠方法獲取實體物件
1.getCurrencyInstance()方法,根據當前語言環境獲取貨幣數值格式,傳遞Locale物件可以獲取指定語言環境下的貨幣數值格式,比如

 

NumberFormat format = NumberFormat.getCurrencyInstance(Locale.CANADA);System.out.println(format.format(439.6));

將會輸出:$439.60

2.getInstance()getNumberInstance()方法都會獲取到常規數值格式
3.getIntegerInstance()方法獲取常規整數值格式,如果需要格式化的數值為小數,則會將數值四舍五入為最接近的整數
4.getPercentInstance()方法獲取百分比的數值格式
NumberFormat有兩個具體實作子類DecimalFormatChoiceFormat

DecimalFormat

DecimalFormat同SimpleDateFormat類似,允許我們指定格式模式獲取我們想要的格式化數值
DecimalFormat類對于數值的小數部分,默認顯示3位小數,在去掉超出小數點后面3位的部分時,會將數值四舍五入為最接近的數值格式化輸出,淡然我們可以對這個默認進行設定
setMaximumFractionDigits(int newValue)方法,設定小數部分中允許的最大數字位數
setMinimumFractionDigits(int newValue)方法,設定小數部分中允許的最小數字位數,如果原數小數位數不夠的話,會補零,
對于數值的整數部分,默認3個數字為一組進行顯示,同樣對此我們也可以自定義,使用setGroupingSize(int i)方法,設定分組中一組的位數,
setGroupingUsed(boolean value)方法設定是否使用分組,true表示使用,false表示取消分組
setMaximumIntegerDigits(int newValue)方法設定整數部分允許的最大數字位數
setMinimumIntegerDigits(int newValue)方法設定整數部分允許的最小數字位數
在````的構造方法中,允許我們傳入格式模式字串輸出我們想要的格式化數值,格式模式元素包含如下

||
----|------------|------
0 | 表示一個數字,被格式化數值不夠的位數會補0

| 表示一個數字,被格式化數值不夠的位數會忽略

. | 小數點分隔符的占位符
, | 分組分隔符的占位符

  • | 預設負數前綴
    % | 將數值乘以100并顯示為百分數
    \u2030 | 將數值乘以1000并顯示為千分數

     

    再次

     

DecimalFormat format1 = new DecimalFormat("#\u2030");System.out.println(format1.format(0.3345));//輸出334‰DecimalFormat format2 = new DecimalFormat("##.##");System.out.println(format2.format(12.345));//輸出12.35DecimalFormat format3 = new DecimalFormat("0000.00");System.out.println(format3.format(12.345));//輸出0012.35DecimalFormat format4 = new DecimalFormat("#.##%");System.out.println(format4.format(12.345));//輸出1234.5%
ChoiceFormat

ChoiceFormat允許將格式化運用到某個范圍的數,通常與MessageFormat一同使用,ChoiceFormat在構造方法中接收一個format陣列和一個limits陣列,這兩個陣列的長度必須相等,例如:

 

limits = {1,2,3,4,5,6,7}formats = {"Sun","Mon","Tue","Wed","Thur","Fri","Sat"}

limits陣列實際上是個區間,可開可閉,并且必須按升序排列,如果不按升序排列,格式化結果將會不正確,還可以使用\u221E(表示無窮大),
ChoiceFormat的匹配公式

limit[j] <= X <limit[j+1]

其中X表示使用format方法傳入的值,j表示limit陣列中的索引,當且僅當上述公式成立時,X匹配j,如果不能匹配,則會根據X是太小還是太大,匹配limits陣列的第一個索引或最后一個索引,然后使用匹配的limits陣列中的索引,去formats陣列中尋找相同索引的值,例子:

 

double[] limits = { 3, 4, 5, 6, 7, 8, 9 };String[] formats = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };ChoiceFormat format = new ChoiceFormat(limits, formats);System.out.println(format.format(2.5));//將會輸出"星期一"/**3.6介于3和4之間,所以會匹配3,又由于3在limits陣列中的索引是0,所以會在formats陣列徐照索引0的值,即輸出"星期一"*/System.out.println(format.format(3.6));

下面看一下ChoiceFormat類中的幾個常用方法
1.nextDouble(double d)靜態方法查找大于d的最小double值,用在limits陣列中,從而使limits陣列形成一個右開區間陣列,例如
limits = {0,1,ChoiceFormat.nextDouble(1)}
2.nextDouble(double d, boolean positive)靜態方法,如果positive引數為true,表示查找大于d的最小double值;如果positive引數為false,表示查找小于d的最大double值,這樣就可以使limits形成一個左開區間陣列,
3.previousDouble(double d)靜態方法,查找小于d的最大double值
ChoiceFormat類的構造方法也允許我們傳入一個模式字串,format方法會根據這個模式字串執行格式化操作,一個模式元素的格式如下:

doubleNum [占位符] formatStr

占位符可以使用#、<  、\u2264(<=)

 

ChoiceFormat cf = new ChoiceFormat("1#is 1 | 1<is more than 1");System.out.println(cf.format(1));//輸出"is 1"System.out.println(cf.format(2));//輸出"is more than 1"System.out.println(cf.format(0));//輸出"is 1"

由上面的例子可以看出,模式字串中的每個模式元素之間使用"|"分割,"|"前后可以添加空格以美化代碼,而且必須按照升序進行書寫,否則會出現java.lang.IllegalArgumentException的運行時例外,
觀看ChoiceFormat類的原始碼我們得知,實際上在內部,模式字串還是被轉換為limits和formats兩個陣列,在原始碼中

 

public ChoiceFormat(String newPattern)  {     applyPattern(newPattern);}/** applyPattern(newPattern)方法的部分原始碼*/public void applyPattern(String newPattern) {...choiceLimits = new double[count];System.arraycopy(newChoiceLimits, 0, choiceLimits, 0, count);choiceFormats = new String[count];System.arraycopy(newChoiceFormats, 0, choiceFormats, 0, count);...}

可以看出ChoiceFormat(String newPattern)呼叫了applyPattern(String newPattern)方法,在applyPattern方法中對newPattern字串進行決議,然后將決議后的資料放置到ChoiceFormat類的兩個私有屬性double[] choiceLimitsString[] choiceFormats中,然后使用格式化方法即可,

3.MessageFormat

MessageFormat提供了以語言環境無關的生成連接訊息的方式,
常用MessageFormat的靜態方法format,該方法接收一個字串的模式和一組物件(物件陣列),按照模式形式將格式化的物件插入到模式中,然后回傳字串結果,
MessageFormat的格式模式元素(FormatElement)形式如下:
{ArgumentIndex}
{ArgumentIndex,FormatType}
{ArgumentIndex,FormatType,FormatStyle}
其中ArgumentIndex物件陣列中的索引,從0開始,
FormatType包括number、date、 time、choice,
FormatStyle包括short、medium、long、full、integer、currency、percent、SubformatPattern(子模式),
在MessageFormat類的內部,FormatType和FormatStyle實際上是創建格式元素的Format示例
number對應了NumberFormat,其子格式對應了DecimalFormat
date和time對應了DateFormat,其資格是對應了SimpleDateFormat
choice對應了ChoiceFormat
敢說沒有意思,來多舉幾個栗子:
你可以直接使用MessageFormat類中的靜態方法format,像這樣:

 

/**這是原始碼注釋中的一個例子* 在這個例子中靜態方法format第一個引數是字串型別的,* 即模式字串,第二個引數是個可變引數,實際上就是一個Object型別的陣列,* 在模式字串中使用"{}"標識一個FormatElement,"{}"中的ArgumentIndex對應Object陣列中回應索引處的值,*/int planet = 7;String event = "a disturbance in the Force";String result = MessageFormat.format("At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.",                  planet, new Date(), event);System.out.println(result);


//輸出:At 20:39:15 on 2015-12-11, there was a disturbance in the Force on planet 7.

你也可以使用MessageFormat的構造方法傳入pattern string(模式字串),然后呼叫普通的format方法,在這里就不舉栗子了,
我們不僅被允許使用MessageFormat類中提供默認的FormatElement去format這些物件,還可以設定自己的Format物件format這些Object,

 

/**在這個例子中,MessageFormat和ChoiceFormat被結合使用* MessageFormat類中有3個方法值的我們關注
* 1.setFormatByArgumentIndex(int argumentIndex, Format newFormat)//
* 2.setFormats(Format[] newFormats)
* 3.setFormat(int formatElementIndex, Format newFormat)
* 在這個例子當中,在MessageFormat的模式字串的FormatElement(即{}中的內容)中
* 索引為0的地方將使用ChoiceFormat的格式去格式化,
* 如果在set的Format中仍具有FormatElement,則會遞回呼叫MessageFormat的format方法,
*/
MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0}.");
double[] filelimits = { 0, 1, 2 };
String[] filepart = { "no files", "one file", "{0,number} files" };
ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
form.setFormatByArgumentIndex(0, fileform);
int fileCount = 1273;
String diskName = "MyDisk";
Object[] testArgs = { new Long(fileCount), diskName };
System.out.println(form.format(testArgs));
//輸出:The disk "MyDisk" contains 1,273 files.

 

/**在這個例子中,MessageFormat和ChoiceFormat被結合使用* MessageFormat類中有3個方法值的我們關注* 1.setFormatByArgumentIndex(int argumentIndex, Format newFormat)//* 2.setFormats(Format[] newFormats)* 3.setFormat(int formatElementIndex, Format newFormat)* 在這個例子當中,在MessageFormat的模式字串的FormatElement(即{}中的內容)中* 索引為0的地方將使用ChoiceFormat的格式去格式化,* 如果在set的Format中仍具有FormatElement,則會遞回呼叫MessageFormat的format方法,*/MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0}.");double[] filelimits = { 0, 1, 2 };String[] filepart = { "no files", "one file", "{0,number} files" };ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);form.setFormatByArgumentIndex(0, fileform);int fileCount = 1273;String diskName = "MyDisk";Object[] testArgs = { new Long(fileCount), diskName };System.out.println(form.format(testArgs));//輸出:The disk "MyDisk" contains 1,273 files.

4.String類中的format方法

format方法使用占位符進行格式化
常規型別、字符型別和數值型別的占位符格式:
%[index$][標識][最小寬度][.精度]轉換符
日期和時間型別的占位符格式:
%[index$][標識][最小寬度]轉換符
與引數不對應的占位符格式:
%[標識][最小寬度]轉換符
其中index表示引數串列中的位置上的值
可用標識:

標識含義
- 在最小寬度內左對齊,不可與0標識一起使用
0 若內容長度不足最小寬度,則在左邊用0來填充
# 對8進制和16進制,8進制前添加一個0,16進制前添加0x
+ 結果總包含一個+或-號
空格 正數前加空格,負數前加-號
, 只用與十進制,每3位數字間用,分隔
( 若結果為負數,則用括號括住,且不顯示符號

可用轉換符:

轉換符含義
b 布爾型別,只要實參為非false的布爾型別,均格式化為字串true,否則為字串false
n 平臺獨立的換行符, 也可通過System.getProperty("line.separator")獲取
f 浮點數型(十進制),顯示9位有效數字,且會進行四舍五入,如99.99
a 浮點數型(十六進制)
e 指數型別,如9.38e+5
g 浮點數型(比%f,%a長度短些,顯示6位有效數字,且會進行四舍五入)
s 字串型別
c 字符型別

 

String result1 = String.format("小明今年%d歲,他住在%s,他的月工資有%.2f", 25,"北京市",6633.435);System.out.println(result1);//輸出:小明今年25歲,他住在北京市,他的月工資有6633.44
/*****************************************************/
double num = 123.4567899;
String result2 = String.format("%e", num);
System.out.println(result2);//輸出:1.234568e+02

 

總結

1.Format中的子類都是不同步,所以需要注意執行緒安全問題
2.可能在某些地方我解釋的還是不太清楚,學習最重要的是多去嘗試,多撰寫代碼測驗,如果僅僅靠看就能學會的話,那你就看吧、

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

標籤:Java

上一篇:你知道騰訊的技術職級嗎?看完你就知道你離大佬的差距有多遠了!

下一篇:阿里架構師的學習筆記:多執行緒+JVM+Mysql+Redis+設計模式

標籤雲
其他(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