#IO流概述:
##IO :輸入/輸出(Input/Output)
串流:是一種抽象概念,是對資料傳輸的總稱。也就是說資料在設備間的傳輸稱為流,流的本質是資料傳輸IO流就是用來處理設備間資料傳輸問題的, 常見的應用:文件複製;文件上傳;文件下載等等,總而言之,涉及到傳輸的,都涉及到流。
IO流體系圖:
#既然IO是涉及檔案的操作,那麼一定離不開檔案操作的技術:File類別:File 類別是java.io 套件中唯一代表磁碟檔案本身的物件。 File 類別定義了一些方法來操作文件,主要用來取得或處理與磁碟文件相關的信息,像是文件名稱、 文件路徑、存取權限和修改日期等,還可以瀏覽子目錄層次結構。 File 類別表示處理檔案和檔案系統的相關資訊。 File 類別不具有從檔案讀取資訊和寫入資訊到檔案的功能,它僅描述檔案本身的屬性。所以和IO搭配在一起進行讀出與寫入的操作。先看一張File類別常用的方法總匯圖:
#使用createNewFile()建立一個檔案:
public class test01 { public static void main(String[] args) throws IOException { //先建立一个File对象,并传入路径 File file1 = new File("G://abc.txt"); //创建空文件,如果没有存在则新建一个,并且返回True,如果存在了就返回false System.out.println(file1.createNewFile()); }
如果執行後,該目錄沒有這個文件,那麼會創建一個,並且返回true,如果已經存在了,就會返回false,代表創建失敗。
使用mkdir()建立目錄:
File file2 = new File("G://a"); System.out.println(file2.mkdir()); //创建一个目录,如果没有存在则新建一个,并且返回True,如果存在了就返回false
使用mkdirs()建立多層級目錄:
File file3 = new File("G://a//b//c"); System.out.println(file3.mkdirs()); //创建多级目录,如果没有存在则新建一个,并且返回True,如果存在了就返回false
接著我們需要使用IO流裡面的功能來輸入與輸出:
# #先介紹四個常用的流:
字節輸入流:InputStream
字節輸出流:
OutputStream
字元輸入流:
Reader字元輸出流:
Writer
為什麼會有位元組和字元兩種流呢?
ASCII 碼中
,一個英文字母(不分大小寫)為一個字節,一個中文漢字為兩個位元組。UTF-8 編碼中
,一個英文字為一個位元組,一個中文為三個位元組。 Unicode 編碼中,一個英文為一個位元組,一個中文為兩個位元組。 所以我們知道電腦讀取資料是一個一個的讀取,當檔案裡面是數字或英文的時候,因為都佔了一個字節,所以可以正常讀取出來。
那如果是漢字呢?最少也佔了兩個字節,如果把一個漢字拆分讀取,顯示出來一定是有問題的。
小結:如果資料透過Window自帶的記事本軟體打開,我們還可以讀懂裡面的內容,就使用字元流,否則使用位元組流。如果你不知道該使用哪種類型的串流,就使用位元組流!
###以下是四個流對應功能的方法名稱總彙表:##################位元組輸出流:##### ####我們使用位元組輸出流給abc.txt檔案裡面寫一句話:######public class test01 { public static void main(String[] args) { try{ //创建输出流对象: OutputStream fos = null; fos = new FileOutputStream("G://abc.txt"); String str = "今天的博客是IO流"; //先将需要写入的字符打散成数组: byte[] words = str.getBytes(); //使用写入的功能 fos.write(words); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }######運行後:############# ####位元組輸入流(從檔案讀取到控制台):######我們知道如果檔案內是漢字,使用位元組輸入流,那麼顯示的肯定是亂碼,如果現在檔案裡面是「我愛中國」這四個字,使用下面這段程式碼:###
public class test02 { public static void main(String[] args) { //创建字节输入流对象: InputStream fis = null; try{ fis = new FileInputStream("G://abc.txt"); int data; //fis.read()取到每一个字节通过Ascll码表转换成0-255之间的整数,没有值返回-1 while((data=fis.read())!=-1){ //(char) data 将读到的字节转成对应的字符 //中文的字符是2+个字节组成 System.out.print((char) data); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try{ fis.close(); } catch (IOException e) { e.printStackTrace(); } } } }######輸出的結果是:################## ##接著把檔案內資訊換成英文和數字:######################結論:有漢字的檔案讀取不能用位元組流### ###
我们使用字符输出流给abc.txt文件里面写几句话:
public class test03 { public static void main(String[] args) { try{ //使用字符输出流的FileWriter写入数据 Writer fw = new FileWriter("G://abc.txt"); fw.write("我们在学Java"); fw.write("一起加油"); fw.close(); //关闭资源 } catch (IOException e) { e.printStackTrace(); } } }
也没用问题,我们发现,使用字符流写中文汉字更方便。
可以设置缓存流提高获取值的效率:
public class test04 { public static void main(String[] args) throws IOException { //创建字符输入流对象: Reader fr = null; try{ fr = new FileReader("G:/abc.txt"); //借助字符流对象创建了字符缓存区 把字符一个一个的取到后先放到缓存区 //然后一起再读写到程序内存来,效率更高 BufferedReader br = new BufferedReader(fr); //先去缓存区一行一行的读取 String line = br.readLine(); while(line != null){ System.out.println(line); line = br.readLine(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } }
当文件内的信息为多行的时候:
字节流和字符流总结:
IO是文件的输入和输出,我们要想去对文件或者写,或者通过程序发送消息给另外的用户都要用到流。
IO流分 字节流和字符流,字节流是以字节为单位IO,字符流是以字符为单位IO;通常读写图片、视频音频等用字节 流,如果读写文件的内容比如中文建议用字符流。
以上是Java中的File類別與IO流介紹與實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!