1. 程式人生 > 實用技巧 >題解 UVA10140 Prime Distance

題解 UVA10140 Prime Distance

IO流

I/O 輸入、輸出 流(資料流動)
資料流動的方向 讀資料(輸入input) 寫資料(輸出output)
檔案流 字元流 物件流 網路流.......

1. File

與電腦上的檔案或資料夾產生一一對應的對映關係

檔案:

電腦上的一種儲存形式

檔案有不同的格式 .txt .doc .ppt .mp4 .jpg .rar ...
資料夾---目錄路徑

1.檔案或目錄路徑名(資料夾)的抽象表示形式

2.File與真實硬碟中的檔案或資料夾 不是一個東西

File是記憶體中的一個物件<--對映-->硬碟上的檔案或資料夾

2.File類中的常用方法

canRead() canWrite() isHidden() isFile() isDirectory()

length()

獲取檔案中位元組的個數

lastModified()

獲取檔案最後的修改時間-毫秒值

*getAbsolutePath()

獲取檔案的絕對路徑 d://text

絕對路徑-->可以通過完整的字串 定位碟符 資料夾 檔案
相對路徑沒有碟符的寫法-->當前專案的所在位置找尋(F:\workplace\SSM\javase\text\22.txt)

*getName()

獲取檔案的名字 text.txt

creatNewFile() 建立檔案

建立資料夾

madkir()

外層沒有不能建立

madkirs()

外層沒有,也會同時建立

*getParent()

獲取當前file的父檔名

**getParentFile()

獲取當前file的父親物件

String[] names=list()

獲取當前file物件所有子元素的名字

File[] files=listFiles()

獲取當前file的所有的兒子物件

delete()

刪除檔案或空的資料夾,不能刪掉帶元素的資料夾
1.資料夾的遍歷---需要遞迴        
2.什麼叫檔案流 
讀取檔案中的內容          向檔案中中寫內容
檔案輸入流               檔案輸出流
位元組型檔案輸入流          位元組型檔案輸出流
字元型檔案輸入流          字元型檔案輸出流  

stream

1.io

 流按照方向(功能)來區分
       in(讀取)  out(寫入)
  操作的目標來區分
       檔案流 陣列流 字串流 資料流 物件流 網路流......

2.位元組IO流:

1.位元組型檔案輸入流:

FileInputStream
1.包 java.io
2.父類--InputStream
3.建立物件

呼叫一個帶File型別的構造方法

File file = new File( new File());

呼叫一個帶String型別的構造方法

File file = new File("d://test//test.txt");
4.常用方法:
int code=read()       每次從流管道中讀取一個位元組 位元組的code碼
*int count=read(byte[])   每次從管道中讀取若干個位元組 存入陣列內 返回有效元素個數
new byte[1024]         通常建立的陣列 1kb-8kb之間 1kb-1024位元組
int count=available()      返回流管道中還有多少快取的位元組數
*skip(long n)          跳過幾個位元組 再讀取
*close() 關閉流通道 必須要做 放到finally 注意程式碼的健壯性(考慮空指標)
多執行緒-->利用幾個執行緒同時讀取檔案
10000位元組 5個小人同時讀取
1-2000 2001-4000 4001-6000......

2.位元組型檔案輸出

FileOutStream
1.java.io
2.繼承OutputStream 所有位元組型輸入流的父類
3.建立物件
new FileOutStream(File) new FileOutStream(File,append)
new FileOutStream(String) new FileOutStream(String,append)
4.常用方法:
write(int code);將給定的code對應得字元寫入檔案
write(byte[]) 將陣列中的全部檔案寫入檔案 
flush() 將管道內的位元組推入檔案
close() 關閉流通道

3.特點

位元組流優點在於什麼型別的檔案都可以處理
缺點在於處理純文字檔案時可能會產生亂碼問題

3.字元型IO流

只能操作純文字檔案.txt 。properties /.doc(不是)

FileReader

1.java.io
2.繼承 InputStreamReader Reader
3.構造方法(file,string)
reead()
read(char[])

FileWriter

2.繼承 OutputStreamWriter Writer
3.構造方法
file boolean
string boolean

4.常用方法

write(int)
write(char[])
write(string)
flush close
編碼問題:
位元組型: String s="fe";
      byte[]=s.getBytes("utf-8");
      new String(byte[],"utf-8");     
字元型:通過修改檔案或ide編碼格式

4.檔案流

 讀取檔案中的資訊in 將資訊寫入檔案中out
    檔案流按照讀取或寫入的單位(位元組數)大小來區分
    
   位元組型檔案流(1位元組)
        FileInputStream/FileOutStream
   字元型檔案流(2位元組-1字元)
        FileReader/FileWriter
       讀取檔案中的內容          向檔案中中寫內容
       檔案輸入流               檔案輸出流
       位元組型檔案輸入流          位元組型檔案輸出流
       字元型檔案輸入流          字元型檔案輸出流         
 容器
 1.容量 只能存一份
 2.陣列  儲存好多個 資料型別統一
 3.集合 儲存好多個 儲存後個數還能改變 泛型--資料型別統一
 如上三個都是java中的型別(物件-->記憶體)
  都儲存在記憶體中 程式執行完畢 虛擬機器停止的時候 記憶體空間就回收了
 4.檔案 儲存好多資訊
 檔案時儲存在硬碟上的-->永久性儲存
 資料雖然安全 但檔案不在記憶體中 需要通過io操作檔案    

5.緩衝流

在流管道內增加快取的資料
讓我們使用流讀取的文字更加的流暢
 高階流----->建立通過低階流
 
BufferedInputStream/BufferedOutputStream

BufferedReader/BufferedWriter

BuffererInputStream

構建方式 使用低階流 構建

基本使用與低階流的方法完全一致
read() skip() available() close()

BufferedOutputStream
構建方式 使用低階流構建 注意 緩衝流構建的時候沒有boolean型別的引數
基本使用與低階流的方法完全一致
write() flish() close()    
BufferedReader
           readLine() -一次讀一行
BufferedWriter
           newLine()-換行  


總結

        InputStream      OutputStream
             Reader          Writer
檔案流 
         低階 
             位元組型 FileInputStream FileOutPutStream
             字元型 FileReader FileWriter
         *緩衝 
             位元組型 BufferedInputStream BufferedOutputStream
             字元型 BufferedReader  BufferedWriter   
陣列流
        byte陣列      ByteArrayInputStream  ByteArrayOutputStream
        char陣列      CharArrayReader    CharArrayWriter
字串流
         StringReader    StringWriter     
資料流
        DataInputStream      DataOutPutStream
*物件流-將物件直接存入檔案中
   
        ObjectInputStream      ObjectOutputStream    
        物件的序列化/反序列化
        物件的序列化指的是:將一個完整的物件拆分成位元組碎片 記錄在檔案中
                 反序列化:將檔案中記錄的物件 反過來組合成一個完整的物件
          如果要將物件序列化到檔案中
                   需要讓物件實現Serializable介面(示意性介面)
          如果要將物件反序列化 
                   需要給物件提供一個序列化的版本號
                     private long serialVersionUID=任意l;(也可以不寫)