第一篇:IO總結(jié)
輸入和輸出
IO分類輸入 和 輸出 流節(jié)點(diǎn)流 和 處理流字節(jié)流(byte)和 字符流(char)
輸入流
字節(jié)流
抽象基類 InputStream
讀取文件的 FileInputStream
緩沖流 BufferedInputStream
讀取各種java基本數(shù)據(jù)類型的 DataInputStream
讀取對象 ObjectInputStream
字符流
抽象基類 Reader
讀取文本文件的 FileReader
實(shí)現(xiàn)緩沖的 BufferedRead 讀取一個(gè)行 readLine();newline()輸出流
字節(jié)流
抽象基類 OutputStream
寫文件的 FileOutputStream
緩沖輸出流 BufferedOutputStream
寫各種java基本數(shù)據(jù)類型的 DataOutputStream
寫對象的 ObjectOutputStreamwriteObject(Object obj);字符流
對象的序列化
一個(gè)對象所屬的類如果實(shí)現(xiàn)java.io.Serializable
則這個(gè)類是序列化類,此類創(chuàng)建的對象就是序列化對象 序列化對象可以通過文件流在文件中進(jìn)行讀和寫。
第二篇:關(guān)于磁盤IO的總結(jié)
磁盤IO的總結(jié):
1.IO讀寫:磁盤是用來存取數(shù)據(jù)的。磁盤的存數(shù)據(jù)對應(yīng)IO的寫操作,磁盤的取數(shù)據(jù)對應(yīng)IO的讀操作。
2.隨機(jī)訪問(Random Access)與連續(xù)訪問(Sequential Access):
隨機(jī)訪問指的是本次IO所給出的扇區(qū)地址和上次IO給出扇區(qū)地址相差比較大,這樣的話磁頭在兩次IO操作之間需要做比較大的移動(dòng)動(dòng)作才能重新開始讀/寫數(shù)據(jù)。
同理,連續(xù)訪問就是兩次給出的扇區(qū)地址相近,磁頭就能很快的進(jìn)行操作,這樣的多個(gè)IO操作就是連續(xù)訪問。
3.順序IO模式(Queue Mode)/并發(fā)IO模式(BurstMode):
原理:磁盤控制器可能會一次對磁盤組發(fā)出一連串的IO命令,如果磁盤組一次只能執(zhí)行一個(gè)IO命令時(shí)稱為順序IO;當(dāng)磁盤組能同時(shí)執(zhí)行多個(gè)IO命令時(shí),稱為并發(fā)IO。
并發(fā)IO只能發(fā)生在由多個(gè)磁盤組成的磁盤組上,單塊磁盤只能一次處理一個(gè)IO命令。
4.IOPS,IO系統(tǒng)每秒所執(zhí)行IO操作的次數(shù)
5.一次完整的磁盤IO操作:
當(dāng)控制器對磁盤發(fā)出一個(gè)IO操作命令的時(shí)候,磁盤的驅(qū)動(dòng)臂(ActuatorArm)帶讀寫磁頭(Head)離開著陸區(qū)(LandingZone,位于內(nèi)圈沒有數(shù)據(jù)的區(qū)域),移動(dòng)到要操作的初始數(shù)據(jù)塊所在的磁道(Track)的正上方,這個(gè)過程被稱為尋址(Seeking),對應(yīng)消耗的時(shí)間被稱為尋址時(shí)間(SeekTime);但是找到對應(yīng)磁道還不能馬上讀取數(shù)據(jù),這時(shí)候磁頭要等到磁盤盤片(Platter)旋轉(zhuǎn)到初始數(shù)據(jù)塊所在的扇區(qū)(Sector)落在讀寫磁頭正上方的之后才能開始讀取數(shù)據(jù),在這個(gè)等待盤片旋轉(zhuǎn)到可操作扇區(qū)的過程中消耗的時(shí)間稱為旋轉(zhuǎn)延時(shí)(RotationalDelay);接下來就隨著盤片的旋轉(zhuǎn),磁頭不斷的讀/寫相應(yīng)的數(shù)據(jù)塊,直到完成這次IO所需要操作的全部數(shù)據(jù),這個(gè)過程稱為數(shù)據(jù)傳送(DataTransfer),對應(yīng)的時(shí)間稱為傳送時(shí)間(TransferTime)。完成這三個(gè)步驟之后一次IO操作也就完成了。
6.傳輸速度(Transfer Rate)/吞吐率(Throughput):是磁盤在實(shí)際使用的時(shí)候從磁盤系統(tǒng)總線上流過的數(shù)據(jù)量。
7.IO響應(yīng)時(shí)間也被稱為IO延時(shí)(IOLatency),IO響應(yīng)時(shí)間就是從操作系統(tǒng)內(nèi)核發(fā)出的一個(gè)讀或者寫的IO命令到操作系統(tǒng)內(nèi)核接收到IO回應(yīng)的時(shí)間,注意不要和單個(gè)IO時(shí)間混淆了,單個(gè)IO時(shí)間僅僅指的是IO操作在磁盤內(nèi)部處理的時(shí)間,而IO響應(yīng)時(shí)間還要包括IO操作在IO等待隊(duì)列中所花費(fèi)的等待時(shí)間。
8.dd命令 dd:硬拷貝命令(直接在硬盤上進(jìn)行數(shù)據(jù)拷貝,沒有經(jīng)過內(nèi)存,二進(jìn)制之間的協(xié)調(diào)復(fù)制)
bs=BYTES:一次讀取和寫入的字節(jié)數(shù)(單元大小)
count=BLOCKS:單元數(shù)量
if=FILE:源文件
of=FILE:目標(biāo)文件
測試磁盤的寫入:
[root@localhost ~]# /usr/bin/time dd if=/dev/zero of=/tmp/hx bs=4k count=10240 10240+0 records in 10240+0 records out 41943040 bytes(42 MB)copied, 0.0577 s, 727 MB/s 0.00user 0.05system 0:00.05elapsed 96%CPU(0avgtext+0avgdata 832maxresident)k 0inputs+81920outputs(0major+241minor)pagefaults 0swaps
測試磁盤的讀?。?/p>
[root@localhost ~]# /usr/bin/time dd if=/tmp/hx of=/dev/null bs=4k 10240+0 records in 10240+0 records out 41943040 bytes(42 MB)copied, 0.014955 s, 2.8 GB/s 0.00user 0.01system 0:00.01elapsed 86%CPU(0avgtext+0avgdata 828maxresident)k 0inputs+0outputs(0major+240minor)pagefaults 0swaps
讀寫同時(shí)測試
[root@localhost ~]# /usr/bin/time dd if=/tmp/foo of=/tmp/foo2 bs=4k 10240+0 records in 10240+0 records out 41943040 bytes(42 MB)copied, 0.0742246 s, 565 MB/s 0.00user 0.08system 0:00.08elapsed 97%CPU(0avgtext+0avgdata 828maxresident)k 0inputs+81952outputs(0major+240minor)pagefaults 0swaps 9.[root@localhost ~]# iostat-x Linux 2.6.32-573.el6.x86_64(localhost.localdomain)03/16/2016 _x86_64_(12 CPU)
avg-cpu: %user
%nice %system %iowait %steal
%idle
0.09
0.00
0.06
0.02
0.00
99.82
Device:
rrqm/s
wrqm/s
r/s
w/s
rsec/s
wsec/s avgrq-sz avgqu-sz
await svctm %util sda
8.30
68.47
7.61
2.27
363.21
565.82
94.05
0.05
5.32
0.40
0.39 各個(gè)性能指標(biāo)的簡單說明。rrqm/s 每秒進(jìn)行merge的讀操作數(shù)目。wrqm/s 每秒進(jìn)行merge的寫操作數(shù)目。r/s 每秒完成的讀I/O設(shè)備次數(shù)。w/s 每秒完成的寫I/O設(shè)備次數(shù)。rsec/s 每秒讀扇區(qū)數(shù)。wsec/s 每秒寫扇區(qū)數(shù)。rkB/s 每秒讀K字節(jié)數(shù)。wkB/s 每秒寫K字節(jié)數(shù)。avgrq-sz平均每次設(shè)備I/O操作的數(shù)據(jù)大小(扇區(qū))。avgqu-sz平均I/O隊(duì)列長度。await平均每次設(shè)備I/O操作的等待時(shí)間(毫秒)。svctm平均每次設(shè)備I/O操作的服務(wù)時(shí)間(毫秒)。%util 一秒中有百分之多少的時(shí)間用于I/O操作,或者說一秒中有多少時(shí)間I/O隊(duì)列是非空的。
平均單次IO大小(IO Chunk Size)<=>avgrq-sz
平均IO響應(yīng)時(shí)間(IO Response Time)<=>await
IOPS(IO per Second)<=> r/s + w/s
吞吐率(Throughtput)<=> rkB/s + wkB/s
10.fio是一個(gè)非常靈活的io測試工具,他可以通過多線程或進(jìn)程模擬各種io操作。
fio分順序讀,隨機(jī)讀,順序?qū)?,隨機(jī)寫,混合隨機(jī)讀寫模式。參數(shù):
filename: 指定文件(設(shè)備)的名稱??梢酝ㄟ^冒號分割同時(shí)指定多個(gè)文件,如filename=/dev/sda:/dev/sdb。
directory: 設(shè)置filename的路徑前綴。在后面的基準(zhǔn)測試中,采用這種方式來指定設(shè)備。
name: 指定job的名字,在命令行中表示新啟動(dòng)一個(gè)job。
direct: bool類型,如果設(shè)置成true(1),表示不使用io buffer。
ioengine: I/O引擎,現(xiàn)在fio支持19種ioengine。默認(rèn)值是sync同步阻塞I/O,libaio是Linux的native異步I/O。
iodepth: 如果ioengine采用異步方式,該參數(shù)表示一批提交保持的io單元數(shù)。
rw: I/O模式,隨機(jī)讀寫,順序讀寫等等。
bs: I/O block大小,默認(rèn)是4k。
size: 指定job處理的文件的大小。
numjobs: 指定job的克隆數(shù)(線程)。
time_based: 如果在runtime指定的時(shí)間還沒到時(shí)文件就被讀寫完成,將繼續(xù)重復(fù)知道runtime時(shí)間結(jié)束。
runtime: 指定在多少秒后停止進(jìn)程。如果未指定該參數(shù),fio將執(zhí)行至指定的文件讀寫完全完成。
group_reporting: 當(dāng)同時(shí)指定了numjobs了時(shí),輸出結(jié)果按組顯示。
例: #順序讀
fio-filename=/dev/sda-direct=1-iodepth 1-thread-rw=read-ioengine=psync-bs=16k-size=200G-numjobs=30-runtime=1000-group_reporting-name=mytest
#順序?qū)?/p>
fio-filename=/dev/sda-direct=1-iodepth 1-thread-rw=write-ioengine=psync-bs=16k-size=200G-numjobs=30-runtime=1000-group_reporting-name=mytest
#隨機(jī)讀
fio-filename=/dev/sda-direct=1-iodepth 1-thread-rw=randread-ioengine=psync-bs=16k-size=200G-numjobs=30-runtime=1000-group_reporting-name=mytest #隨機(jī)寫
fio-filename=/dev/sda-direct=1-iodepth 1-thread-rw=randwrite-ioengine=psync-bs=16k-size=200G-numjobs=30-runtime=1000-group_reporting-name=mytest
#混合隨機(jī)讀寫
fio-filename=/dev/sda-direct=1-iodepth 1-thread-rw=randrw-rwmixread=70-ioengine=psync-bs=16k-size=200G-numjobs=30-runtime=100-group_reporting-name=mytest-ioscheduler=noop
補(bǔ)充:
上次測試的三塊固態(tài)硬盤IO:
0.55到2K的小文件
[root@localhost 1]# fio-filename=/data/B/1/2-direct=1-iodepth 1-thread-rw=randrw-rwmixread=80-ioengine=psync-bsrange=512-2048-size=4G-numjobs=5-group_reporting-name=test-runtime=1200 test:(g=0): rw=randrw, bs=512-2K/512-2K, ioengine=psync, iodepth=1...test:(g=0): rw=randrw, bs=512-2K/512-2K, ioengine=psync, iodepth=1 fio 2.0.7 Starting 5 threads test: Laying out IO file(s)(1 file(s)/ 4096MB)Jobs: 5(f=5): [mmmmm] [100.0% done] [8319K/2060K /s] [9870 /2498 iops] [eta 00m:00s] test:(groupid=0, jobs=5): err= 0: pid=29601
read : io=11152MB, bw=9515.1KB/s, iops=9183 , runt=1200079msec
clat(usec): min=0 , max=1000.3K, avg=468.07, stdev=1981.20
lat(usec): min=0 , max=1000.3K, avg=468.42, stdev=1981.20
clat percentiles(usec):
| 1.00th=[ 189], 5.00th=[ 211], 10.00th=[ 225], 20.00th=[ 249],| 30.00th=[ 274], 40.00th=[ 294], 50.00th=[ 318], 60.00th=[ 350],| 70.00th=[ 382], 80.00th=[ 430], 90.00th=[ 516], 95.00th=[ 596],| 99.00th=[ 844], 99.50th=[ 5088], 99.90th=[32128], 99.95th=[42240],| 99.99th=[58624]
bw(KB/s): min= 159, max= 6607, per=20.03%, avg=1905.53, stdev=328.56
write: io=2789.3MB, bw=2379.2KB/s, iops=2297 , runt=1200079msec
clat(usec): min=0 , max=1000.2K, avg=283.77, stdev=1432.42
lat(usec): min=0 , max=1000.2K, avg=284.21, stdev=1432.42
clat percentiles(usec):
| 1.00th=[
89], 5.00th=[ 110], 10.00th=[ 137], 20.00th=[ 153],| 30.00th=[ 165], 40.00th=[ 175], 50.00th=[ 189], 60.00th=[ 207],| 70.00th=[ 239], 80.00th=[ 302], 90.00th=[ 386], 95.00th=[ 458],| 99.00th=[ 660], 99.50th=[ 1976], 99.90th=[20352], 99.95th=[27520],| 99.99th=[43264]
bw(KB/s): min=
60, max= 1769, per=20.03%, avg=476.50, stdev=87.73
lat(usec): 2=0.08%, 100=0.51%, 250=29.98%, 500=59.64%, 750=8.40%
lat(usec): 1000=0.63%
lat(msec): 2=0.10%, 4=0.11%, 10=0.19%, 20=0.08%, 50=0.23%
lat(msec): 100=0.03%, 250=0.01%, 500=0.01%, 1000=0.01%, 2000=0.01%
cpu
: usr=6.13%, sys=37.70%, ctx=101478124, majf=0, minf=24056
IO depths
: 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit
: 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued
: total=r=11021114/w=2757348/d=0, short=r=0/w=0/d=0
Run status group 0(all jobs):
READ: io=11152MB, aggrb=9515KB/s, minb=9515KB/s, maxb=9515KB/s, mint=1200079msec, maxt=1200079msec
WRITE: io=2789.3MB, aggrb=2379KB/s, minb=2379KB/s, maxb=2379KB/s, mint=1200079msec, maxt=1200079msec
Disk stats(read/write):
sda: ios=11020977/2758079, merge=0/69, ticks=4004421/515149, in_queue=4514919, util=98.00%
10M的大文件
[root@localhost 1]# fio-filename=/data/B/1/10-direct=1-iodepth 1-thread-rw=randrw-rwmixread=80-ioengine=psync-bs=10M-size=10G-numjobs=10
-group_reporting-name=test-runtime=1800 test:(g=0): rw=randrw, bs=10M-10M/10M-10M, ioengine=psync, iodepth=1...test:(g=0): rw=randrw, bs=10M-10M/10M-10M, ioengine=psync, iodepth=1 fio 2.0.7 Starting 10 threads test: Laying out IO file(s)(1 file(s)/ 10240MB)Jobs: 4(f=4): [_m___mm_m_] [99.0% done] [220.2M/104.9M /s] [21 /10 iops] [eta 00m:03s]]
test:(groupid=0, jobs=10): err= 0: pid=29618
read : io=81910MB, bw=270613KB/s, iops=26 , runt=309948msec
clat(msec): min=15 , max=1006 , avg=334.89, stdev=102.97
lat(msec): min=15 , max=1006 , avg=334.89, stdev=102.97
clat percentiles(msec):
| 1.00th=[ 123], 5.00th=[ 157], 10.00th=[ 200], 20.00th=[ 249],| 30.00th=[ 289], 40.00th=[ 318], 50.00th=[ 343], 60.00th=[ 363],| 70.00th=[ 383], 80.00th=[ 412], 90.00th=[ 449], 95.00th=[ 482],| 99.00th=[ 578], 99.50th=[ 766], 99.90th=[ 963], 99.95th=[ 979],| 99.99th=[ 1004]
bw(KB/s): min= 7076, max=64912, per=10.25%, avg=27750.67, stdev=7359.31
write: io=20490MB, bw=67694KB/s, iops=6 , runt=309948msec
clat(msec): min=24 , max=752 , avg=161.82, stdev=105.86
lat(msec): min=25 , max=753 , avg=162.61, stdev=105.84
clat percentiles(msec):
| 1.00th=[
27], 5.00th=[
33], 10.00th=[
34], 20.00th=[
51],| 30.00th=[
54], 40.00th=[ 103], 50.00th=[ 178], 60.00th=[ 206],| 70.00th=[ 233], 80.00th=[ 260], 90.00th=[ 297], 95.00th=[ 326],| 99.00th=[ 392], 99.50th=[ 416], 99.90th=[ 644], 99.95th=[ 725],| 99.99th=[ 750]
bw(KB/s): min= 7398, max=82447, per=29.87%, avg=20218.16, stdev=9671.17
lat(msec): 20=0.01%, 50=3.69%, 100=4.55%, 250=23.75%, 500=65.39%
lat(msec): 750=2.18%, 1000=0.42%, 2000=0.01%
cpu
: usr=0.61%, sys=6.94%, ctx=600392, majf=0, minf=12529
IO depths
: 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit
: 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued
: total=r=8191/w=2049/d=0, short=r=0/w=0/d=0
Run status group 0(all jobs):
READ: io=81910MB, aggrb=270612KB/s, minb=270612KB/s, maxb=270612KB/s, mint=309948msec, maxt=309948msec
WRITE: io=20490MB, aggrb=67694KB/s, minb=67694KB/s, maxb=67694KB/s, mint=309948msec, maxt=309948msec
Disk stats(read/write):
sda: ios=261982/65792, merge=0/96, ticks=40438645/1040942, in_queue=41479880, util=100.00%
第三篇:IO企業(yè)文化
IO的企業(yè)文化是什么:
【企業(yè)文化】
——企業(yè)定位
· 四個(gè)人每個(gè)人找十個(gè)標(biāo)的,各自去實(shí)驗(yàn),標(biāo)的領(lǐng)域的選取根據(jù)各自偏好和擅長。公司注冊成功后去尋找一個(gè)信托平臺,費(fèi)用為一個(gè)點(diǎn)的回報(bào)率。財(cái)務(wù)方面不用管信托平臺會代為管理,并且將財(cái)務(wù)報(bào)表予以公示
·托管公司 代理大陸客戶進(jìn)行港股操盤
——使命
·為客戶利益而努力進(jìn)取
·提高每位員工的公司榮譽(yù)感,自豪感。
·像對待技術(shù)創(chuàng)新一樣致力于成本創(chuàng)新。
·讓更多的人獲得更好,更穩(wěn)健的服務(wù)
·充分調(diào)動(dòng)員工主觀能動(dòng)性,主動(dòng)完成好任務(wù)。
——核心價(jià)值觀
· 成就客戶—我們致力于每位客戶的滿意和成功。
· 尊重員工—我們致力于尊重每位員工的要求以及情感。
· 誠信正直—我們秉持信任、誠實(shí)和富有責(zé)任感,無論是對內(nèi)部還是外部?!?追求卓越—我們倡導(dǎo)每天學(xué)習(xí)一點(diǎn),開拓視野,每天爭做最佳最好。
——愿景
IO基于對行業(yè)的深厚理解,以及對優(yōu)秀的管理和文化基因的傳承,順應(yīng)時(shí)代的趨勢,爭取成為時(shí)代的領(lǐng)頭羊,在全球范圍內(nèi)打造高品質(zhì)的產(chǎn)品,讓消費(fèi)者充分享受卓越的IO服務(wù)。IO致力于發(fā)展成為一個(gè)自由民主的公司,一個(gè)可以自由討論,積極發(fā)出自己聲音的的公司,一個(gè)穩(wěn)健提升的企業(yè),為客戶、股東、員工和社會創(chuàng)造更多的價(jià)值,讓世界因IO更美好。
第四篇:黑馬程序員——IO(Input Output)流總結(jié)(一)
IO(Input Output)流總結(jié)
(一)IO流是處理數(shù)據(jù)之間數(shù)據(jù)傳輸?shù)摹?/p>
Java對數(shù)據(jù)的操作是通過流的方式。
Java中用于操作IO流的對象都放在java.io包中。
流的分類:按照操作數(shù)據(jù)分為:字符流和字節(jié)流。
按照流向分為:輸入流和輸出流。
輸入流:輸出流:
字符流:
ReaderWriter
|--BufferedReader|--BufferedWriter
|--inputStreamReader|--OutputStreamWriter
|--FileReader|--FileWriter
字節(jié)流:
InputStreamOutputStream
|--FileInputStream|--FileOutputStream
InputStreamOutputStream
|--FilterInputStream|--FilterOutputStream
|--BufferedInputStream|--BufferedOutputStream
在計(jì)算機(jī)中存儲的都是1和0的序列。也就是二進(jìn)制的有序序列,不論是文本、音樂或者是視頻。
那么為什么要在流中定義字節(jié)流和字符流呢?
這個(gè)與我們的字符編碼方式有關(guān)。我們都知道世界上有很多種的語言,比如:ASCII、GB2312、GBK、UTF-8和Unicode等。
如果一個(gè)文本文件使用GB2312編碼的方式存儲的,如果我們用Unicode的編碼方式來讀取,那么就會出現(xiàn)亂碼。所以字符流是一種特殊的流,在java中就定義了專門處理字符的流對象。
當(dāng)我們拿到一個(gè)API文檔我們應(yīng)該如何使用呢?
1,確定要使用的功能。
2,查閱API看有沒有相關(guān)的功能類。
3,如果沒有,就分析需要如何自定義一個(gè)出來,并且要使用到那些相關(guān)功能的類,這些類在API中有沒有定義。
4,不論有或者沒有需要自定義一個(gè),我們都要先查閱相關(guān)功能類的根類,那么查閱一個(gè)API的時(shí)候我們要注意一些什么呢?
5,找到相關(guān)功能根類,先看一下它是一個(gè)類,還是接口,還是抽象類,如果是接口或
者是抽象類我們就不能直接使用這個(gè)類,而要使用這個(gè)類的子類。
6,但是,我們不用急于先看它有哪些子類,我們先看一下它到底暴露了什么字段、構(gòu)造函數(shù)和方法。
7,在查看暴露的信息時(shí),我們要注意幾點(diǎn):
a.如果是static修飾的,說明是靜態(tài)的,我們不用new對象也可以直接使用。
b.我們要確定自己要使用的方法將會返回的數(shù)據(jù)的類型,是void呢、String呢、int呢、還是其他的。查找的時(shí)候就重點(diǎn)找返回這些類型的方法。(注意:如果我們使用的類是一個(gè)使用單例設(shè)計(jì)模式設(shè)計(jì)的,那么他就沒有構(gòu)造函數(shù),我們就一般可以通過靜態(tài)的getIstance()方法獲取相應(yīng)的對象,這時(shí)我們就要找返回值是對象類型的方法。)
8,如果在根類中找到了需要的方法,但是根類又不能創(chuàng)建對象,那么我們就看看,繼承這個(gè)根類的子類有哪些,一般子類都繼承了父類的方法,所以子類可以直接調(diào)用父類的方法,并且子類又定義了一些自身特別的方法。
9,找到需要的類創(chuàng)建對象,或者找到相關(guān)功能的對象自定義一個(gè)需要的類。
下面我們按照以上的方法來闡述IO流的學(xué)習(xí):
字節(jié)流:
字節(jié)流的根類有:讀取流(Reader)、寫入流(Writer)
根類都是abstract(抽象)的,我們不能直接創(chuàng)建對象,但是我們可以看一看父類都定義了什么方法。
Reader:
int read()
讀取單個(gè)字符。
int read(char[] cbuf)
將字符讀入數(shù)組。
abstractint read(char[] cbuf, int off, int len)
將字符讀入數(shù)組的某一部分。
intread(CharBuffer target)
試圖將字符讀入指定的字符緩沖區(qū)。
abstractvoid close()
關(guān)閉該流并釋放與之關(guān)聯(lián)的所有資源。
FileReader:Reader的子類,可以創(chuàng)建對象,專門用來操作字符數(shù)據(jù)流的。
Writer:
void write(char[] cbuf)
寫入字符數(shù)組。
abstractvoid write(char[] cbuf, int off, int len)
寫入字符數(shù)組的某一部分。
void write(int c)
寫入單個(gè)字符。
void write(String str)
寫入字符串。
void write(String str, int off, int len)
寫入字符串的某一部分。
abstractvoid close()
關(guān)閉此流,但要先刷新它。
abstractvoid flush()
刷新該流的緩沖。
寫入流(Writer)在每次調(diào)用write()方法的時(shí)候都要flush()(刷新)一次,當(dāng)然Writer也不能創(chuàng)建對象,我們可以使用他的子類FileWriter,F(xiàn)ileWriter是專門處理字符寫入流的類。
FileReader 和 FileWriter 為我們提供了操作字符數(shù)據(jù)流的一般方法,其中比較高效的就是自定義一個(gè)數(shù)組,用這個(gè)數(shù)組作為臨時(shí)存儲區(qū),每次讀取一塊(裝滿數(shù)組)數(shù)據(jù),然后再將這一塊數(shù)據(jù)寫入相應(yīng)的目的地。這樣就提高了效率,如果每次讀取一個(gè)字符然后寫入一個(gè)字符,就很低效,是不可取的。
自定一個(gè)數(shù)組為我們提高了效率,但是每次使用都要寫很多代碼,所以開發(fā)者就將這個(gè)數(shù)組封裝為了一個(gè)特殊的對象。那就是緩沖區(qū)!BufferedReader(字符讀取緩沖區(qū))和BufferedWriter(字符寫入緩沖區(qū))。他是用的是裝飾設(shè)計(jì)模式,是再不改變原來已定義類的基礎(chǔ)上增強(qiáng)類的功能。
補(bǔ)充:BufferedReader的子類LineNumberReader,增加了int getLineNumber():獲得當(dāng)前行號的功能,我們可以在使用緩沖區(qū)的同時(shí)讀取行號。
裝飾設(shè)計(jì)模式:
當(dāng)想要對已有的對象進(jìn)行功能增強(qiáng)時(shí),可以定義類,將已有對象傳入,基于已有的功能,并提供加強(qiáng)功能。那么自定義的該類稱為裝飾類。
字符流學(xué)習(xí)完了,那么如果要學(xué)習(xí)字節(jié)流就會簡單很多,我們通過查閱API知道:很多方法都似曾相識。所以,總結(jié)一下就是下面幾點(diǎn):
A.字節(jié)流分為:InputStream(讀取流)和OutputStream(寫入流)
B.字節(jié)流和字符流的功能基本相同,只不過傳入的參數(shù)由字符流中的字節(jié)char,變成了字節(jié)中的byte。
C.字節(jié)流也具有緩沖區(qū):
BufferedInputStream(字節(jié)讀取緩沖區(qū))和BufferedOutputStream(字節(jié)寫入緩沖區(qū))。方法與字符緩沖區(qū)相似。
第五篇:C8051f020 IO配置小結(jié)
C8051f020 I/O配置小結(jié)
020的每個(gè)I/O口引腳都可以被配置為推挽或漏極開路輸出。同時(shí)引入了數(shù)字交叉開關(guān),允許將內(nèi)部數(shù)字系統(tǒng)資源映射到P0、P1、P2和P3的端口引腳。通過設(shè)置交叉開關(guān)寄存器可將片內(nèi)的計(jì)數(shù)器/定時(shí)器、串行總線、硬件中斷、ADC轉(zhuǎn)換啟動(dòng)輸入、比較器輸出以及微控制器內(nèi)部的其他數(shù)字信號配置為出現(xiàn)在端口I/O引腳。必須在訪問這些外設(shè)的I/O之前配置和允許交叉開關(guān)。注意的問題:
1.低端口既能按位尋址,也可以按字節(jié)尋址;高端口只能按字節(jié)尋址。2.沒有被分配到的引腳作為一般的數(shù)字通用I/O口。3.P1口還可以用作ADC1的模擬輸入。
4.P0MDOUT~P3MDOUT用于控制I/O端口每一位的輸出狀態(tài)。
5.EMIF(外部存儲器接口)是用于CPU與片外XRAM之間的數(shù)據(jù)傳輸通道,通過寄存器EMI0CF和EMI0CN選擇和管理端口實(shí)現(xiàn)數(shù)據(jù)的傳輸。
6.為了能訪問片外存儲器空間,必須設(shè)置EMI0CN寄存器的內(nèi)容為片外存儲器的空間頁地址。7.如果把外部存儲器接口(EMIF)設(shè)置在高端口則首先要把EMI0CF的PRTSEL位設(shè)置為1,選擇高端口,同時(shí)選擇地址的復(fù)用或非復(fù)用方式,在把XBR的外部寄存器的EMIFLE位設(shè)置為0。8.復(fù)用方式配置:在復(fù)用方式下,數(shù)據(jù)總線和地址總線的第8位共用相同的引腳(AD0~AD7)。在該方式下,要用一個(gè)外部鎖存器(如74HC373或相同功能的鎖存器)保持RAM地址的低8位。外部鎖存器由ALE(地址鎖存使能)信號控制,ALE信號由外部存儲器接口邏輯驅(qū)動(dòng)。9.在總線復(fù)用時(shí),需要把地址數(shù)據(jù)復(fù)用端口配置為漏極開路。
10.ALE高/低脈寬占1個(gè)SYSCLK周期,地址建立/保持時(shí)間占0個(gè)SYSCLK周期,/WR和/RD占12個(gè)SYSCLK周期,EMIF工作在地址/數(shù)據(jù)復(fù)用方式,即:EMI0CF |= 0x2c;EMI0TC |= 0x2c;配置EMIF的步驟是:先將EMIF選到低端口或高端口;然后選擇復(fù)用方式或非復(fù)用方式;再選擇存儲器的模式(只用片內(nèi)存儲器、不帶塊選擇的分片方式、帶塊選擇的分片方式或只用片外存儲器);然后設(shè)置EMI0TC;最后通過寄存器PnMDOUT和P74OUT選擇所期望的相關(guān)端口的輸出方式。如: void PORT_Init(void){ XBR2 = 0x40;/*使能交叉開關(guān)和弱上拉*/ P74OUT |= 0xff;/*使能P4~P7推挽輸出*/ EMI0CF |= 0x2c;/*EMIF工作在地址/數(shù)據(jù)復(fù)用方式,只用外部存儲器,ALE高/低脈寬占1個(gè)SYSCLK周期*/ EMI0TC |= 0x6c;/*地址建立/保持時(shí)間占0個(gè)SYSCLK周期,/WR和/RD占12個(gè)SYSCLK周期*/ P3MDOUT |= 0xdf;/*使能P3.5推挽輸出*/ } 11.避免高端口處于“浮空”狀態(tài),以避免因輸入浮空為無效邏輯電平而導(dǎo)致不必要的功率消耗,為此應(yīng)采取如下措施的任何一種:a.將XBR2.7位設(shè)置為邏輯0選擇弱上拉狀態(tài)
R/W R/W R/W R/W R/W R/W R/W R/W 復(fù)位值 WEAKPUD XBARE-T4EXE T4E UART1E EMIFLE CNVSTE 00000000 位7 位6 位5 位4 位3 位2 位1 位0 SFR地址
位7 WEAKPUD 弱上拉禁止位 0 弱上拉全局允許 1 弱上拉全局禁止
位6 XBARE 交叉開關(guān)允許位 0 交叉開關(guān)禁止端口0 1 2 和3 的所有引腳被強(qiáng)制為輸入方式 1 交叉開關(guān)允許 位5 未用讀0 寫=忽略 位4 T4EXE T4EX 輸入允許位 0 T4EX 不連到端口引腳 1 T4EX 連到端口引腳 位3 T4E T4 輸入允許位 0 T4 不連到端口引腳 1 T4 連到端口引腳
位2 UART1E UART1 I/O 允許位 0 UART1 I/O 不連到端口引腳 1 UART1 TX 和RX 連到兩個(gè)端口引腳 位1 EMIFLE 外部存儲器接口低端口允許位
0 P0.7 P0.6 和P0.5 的功能由交叉開關(guān)或端口鎖存器決定 1 如果EMI0CF.4 = 0 外部存儲器接口為復(fù)用方式
則P0.7(/WR)P0.6(/RD)和P0.5(/ALE)被交叉開關(guān)跳過它們的輸出 狀態(tài)由端口鎖存器和外部存儲器接口決定 如果EMI0CF.4 = 1 外部存儲器接口為非復(fù)用方式
則P0.7(/WR)和P0.6(/RD)被交叉開關(guān)跳過它們的輸出狀態(tài)由端口鎖 存器和外部存儲器接口決定
位0 CNVSTE 外部轉(zhuǎn)換啟動(dòng)輸入允許位 0 CNVSTR 不連到端口引腳 1 CNVSTR 連到端口引腳;
b.令P74OUT=0xFF,將高端口輸出方式配置為推拉方式(P74OUT為高端口輸出方式寄存器); c.向高端口數(shù)據(jù)寄存器P4、P5、P6和P7寫0。12.配置端口引腳的輸出方式
每個(gè)端口引腳的輸出方式都可被配置為漏極開路或推挽方式。在推挽方式下向端口數(shù)據(jù)寄存器中的相應(yīng)位寫邏輯0 將使端口引腳被驅(qū)動(dòng)到GND 寫邏輯1 將使端口引腳被驅(qū)動(dòng)到VDD,在漏極開路方式下向端口數(shù)據(jù)寄存器中的相應(yīng)位寫邏輯0 將使端口引腳被驅(qū)動(dòng)到GND 寫邏輯1 將使端口引腳處于高阻狀態(tài),當(dāng)系統(tǒng)中不同器件的端口引腳有共享連接。即多個(gè)輸出連接到同一個(gè)物理線時(shí)(例如SMBus 連接中的SDA 信號),使用漏極開路方式可以防止不同器件之間的沖突。(推挽方式在有些書中稱為推拉方式)
轉(zhuǎn)載-關(guān)于開漏、推挽方式2008-01-27 17:53漏級開路即高阻狀態(tài),適用于輸入/輸出,其可獨(dú)立輸入/輸出低電平和高阻狀態(tài),若需要產(chǎn)生高電平,則需使用外部上拉電阻或使用如LCX245等電平轉(zhuǎn)換芯片。有些朋友,尤其是未學(xué)過此方面知識的朋友,在實(shí)際工作中將I/O口設(shè)置為漏開,并想輸出高電平,但向口線上寫1后對方并未認(rèn)出高電平,但用萬用表測量引腳確有電壓,這種認(rèn)為是不對的,對于高阻狀態(tài)來說,測量電壓是無意義的,正確的方法應(yīng)是外加上拉電阻,上拉電阻的阻值=上拉電壓/芯片引腳最大灌(拉)電流。
推挽方式可完全獨(dú)立產(chǎn)生高低電平,推挽方式為低阻,這樣,才能保證口線上不分走電壓或分走極小的電壓(可忽略),保證輸出與電源相同的高電平,推挽適用于輸出而不適用于輸入,因?yàn)槿魧ν仆欤ǖ妥瑁┘痈唠娖胶螅琁=U/R,I會很大,將造成口的燒毀。對與C8051F的很多型號片子,將I/O口設(shè)置為推挽方式的做法為:PnMDOUT=0xff,Pn=0x00,這樣設(shè)置I/O口為推挽,并輸出低電平(可降低功耗)將I/O口設(shè)置為漏開方式的做法為:PnMDOUT=0x00,Pn=0x11,這樣設(shè)置I/O口為漏開。
如果學(xué)過三極管放大電路一定知道,前置單管放大器和功放末級放大電路的區(qū)別。單片機(jī)內(nèi)部的邏輯經(jīng)過內(nèi)部的邏輯運(yùn)算后需要輸出到外面,外面的器件可能需要較大的電流才能推動(dòng),因此在單片機(jī)的輸出端口必須有一個(gè)驅(qū)動(dòng)電路。
這種驅(qū)動(dòng)電路有兩種形式: 其中的一種是采用一只N型三極管(npn或n溝道),以npn三極管為例,就是e接地,b接內(nèi)部的邏輯運(yùn)算,c引出,b受內(nèi)部驅(qū)動(dòng)可以控制三極管是否導(dǎo)通但如果三極管的c極一直懸空,盡管b極上發(fā)生高低變化,c極上也不會有高低變化,因此在這種條件下必須在外部提供一個(gè)電阻,電阻的一端接c(引出腳)另一端接電源,這樣當(dāng)三極管的b有高電壓是三極管導(dǎo)通,c電壓為低,當(dāng)b為低電壓時(shí)三極管不通,c極在電阻的拉動(dòng)下為高電壓,這種驅(qū)動(dòng)電路有個(gè)特點(diǎn):低電壓是三極管驅(qū)動(dòng)的,高電壓是電阻驅(qū)動(dòng)的(上下不對稱),三極管導(dǎo)通時(shí)的ec內(nèi)阻很小,因此可以提供很大的電流,可以直接驅(qū)動(dòng)led甚至繼電器,但電阻的驅(qū)動(dòng)是有限的,最大高電平輸出電流=(vcc-Vh)/r;
另一種是互補(bǔ)推挽輸出,采用2只晶體管,一只在上一只在下,上面的一只是n型,下面為p型(以三極管為例),兩只管子的連接為:npn(上)的c連vcc,pnp(下)的c接地,兩只管子的ee,bb相連,其中ee作為輸出(引出腳),bb接內(nèi)部邏輯,這個(gè)電路通常用于功率放大點(diǎn)路的末級(音響),當(dāng)bb接高電壓時(shí)npn管導(dǎo)通輸出高電壓,由于三極管的ec電阻很小,因此輸出的高電壓有很強(qiáng)的驅(qū)動(dòng)能力,當(dāng)bb接低電壓時(shí)npn截至,pnp導(dǎo)通,由于三極管的ec電阻很小因此輸出的低電壓有很強(qiáng)的驅(qū)動(dòng)能力,簡單的例子,9013導(dǎo)通時(shí)ec電阻不到10歐,以Vh=2.5v,vcc=5v計(jì)算,高電平輸出電流最大=250MA,短路電流500ma,這個(gè)計(jì)算同時(shí)告訴我們采用推挽輸出時(shí)一定要小心千萬不要出現(xiàn)外部電路短路的可能,否則肯定燒毀芯片,特別是外部驅(qū)動(dòng)三極管時(shí)別忘了在三極管的基極加限流電阻。推挽輸出電路的形式很多,有些單片機(jī)上下都采用n型管,但內(nèi)部邏輯提供互補(bǔ)輸出,以上的說明僅僅為了說明推挽的原理,為了更深的理解可以參考功率放大電路。
推挽方式可完全獨(dú)立產(chǎn)生高低電平,推挽方式為低阻,這樣,才能保證口線上不分走電壓或分走極小的電壓(可忽略),保證輸出與電源相同的高電平,推挽適用于輸出而不適用于輸入,因?yàn)槿魧ν仆欤ǖ妥瑁┘痈唠娖胶?,I=U/R,I會很大,將造成口的燒毀。
對與C8051F的很多型號片子,將I/O口設(shè)置為推挽方式的做法為:PnMDOUT=0xff,Pn=0x00,這樣設(shè)置I/O口為推挽,并輸出低電平(可降低功耗)將I/O口設(shè)置為漏開方式的做法為:PnMDOUT=0x00,Pn=0x11,這樣設(shè)置I/O口為漏開。
推挽輸出0的時(shí)候和開漏特性一樣,就是1的時(shí)候可以當(dāng)作直接接VCC.推挽輸出的驅(qū)動(dòng)能力相當(dāng)強(qiáng),因?yàn)檩敵?就等于接到了VCC.而同時(shí)推挽輸出的IO也需要注意不要直接接到地,否則一旦輸出1,就等于VCC通過內(nèi)部的場效應(yīng)管直接到地了,這時(shí)候IO端發(fā)熱就很大,時(shí)間長就就拜拜了.你看到DX32實(shí)驗(yàn)板上,按鍵部分都是串了個(gè)300歐才到地的,就是為了避免IO誤操作,使這些輸入變成推挽輸出1而做的保護(hù).以此為設(shè)計(jì)依據(jù),一般情況下,所有的IO都盡量避免直接到地,即使這個(gè)IO你是打算用來做輸入的.