国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

Java IO流 文件傳輸基礎(chǔ)

2019-11-26 14:04:27
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、文件的編碼

package com.study.io;/*** 測(cè)試文件編碼*/public class EncodeDemo {/*** @param args* @throws Exception */public static void main(String[] args) throws Exception {String s="好好學(xué)習(xí)ABC";byte[] bytes1=s.getBytes();//這是把字符串轉(zhuǎn)換成字符數(shù)組,轉(zhuǎn)換成的字節(jié)序列用的是項(xiàng)目默認(rèn)的編碼(這里為UTF-8)for (byte b : bytes1) {//把字節(jié)(轉(zhuǎn)換成了int)以16進(jìn)制的方式顯示System.out.print(Integer.toHexString(b & 0xff)+" ");//& 0xff是為了把前面的24個(gè)0去掉只留下后八位}System.out.println();/*utf-8編碼中中文占用3個(gè)字節(jié),英文占用1個(gè)字節(jié)*/byte[] bytes2 = s.getBytes("utf-8");//這里會(huì)有異常展示,我們就throw這個(gè)異常for (byte b : bytes2) {System.out.print(Integer.toHexString(b & 0xff)+" ");}System.out.println();/*gbk編碼中文占用2個(gè)字節(jié),英文占用1個(gè)字節(jié)*/byte[] bytes3 = s.getBytes("gbk");//這里會(huì)有異常展示,我們就throw這個(gè)異常for (byte b : bytes3) {System.out.print(Integer.toHexString(b & 0xff)+" ");}System.out.println();/*utf-16be編碼中文占用2個(gè)字節(jié),英文占用2個(gè)字節(jié)*/byte[] bytes4 = s.getBytes("utf-16be");//這里會(huì)有異常展示,我們就throw這個(gè)異常for (byte b : bytes4) {System.out.print(Integer.toHexString(b & 0xff)+" ");}System.out.println();/*當(dāng)你的字節(jié)序列是某種編碼時(shí),這個(gè)時(shí)候想把字節(jié)序列變成字符串,也需要用這種編碼方式,否則會(huì)出現(xiàn)亂碼*/String str1=new String(bytes4);//這時(shí)會(huì)使用項(xiàng)目默認(rèn)的編碼來(lái)轉(zhuǎn)換,可能出現(xiàn)亂碼System.out.println(str1);//要使用字節(jié)序列的編碼來(lái)進(jìn)行轉(zhuǎn)換String str2=new String(bytes4,"utf-16be");System.out.println(str2);}}

分析:

* 1. “& 0xff”的解釋:
* 0xFF表示的是16進(jìn)制(十進(jìn)制是255),表示為二進(jìn)制就是“11111111”。
* 那么&符表示的是按位數(shù)進(jìn)行與(同為1的時(shí)候返回1,否則返回0)

* 2.字節(jié)byte與int類型轉(zhuǎn)換:
* Integer.toHexString(b & 0xff)這里先把byte類型的b和0xff進(jìn)行了運(yùn)算,然后Integer.toHexString取得了十六進(jìn)制字符串
* 可以看出b & 0xFF運(yùn)算后得出的仍然是個(gè)int,那么為何要和 0xFF進(jìn)行與運(yùn)算呢?直接 Integer.toHexString(b);,將byte強(qiáng)轉(zhuǎn)為int不行嗎?答案是不行的.
* 其原因在于:1.byte的大小為8bits而int的大小為32bits;2.java的二進(jìn)制采用的是補(bǔ)碼形式
* Integer.toHexString的參數(shù)是int,如果不進(jìn)行&0xff,那么當(dāng)一個(gè)byte會(huì)轉(zhuǎn)換成int時(shí),由于int是32位,而byte只有8位這時(shí)會(huì)進(jìn)行補(bǔ)位。。。。。。
* 所以,一個(gè)byte跟0xff相與會(huì)先將那個(gè)byte轉(zhuǎn)化成整形運(yùn)算,這樣,結(jié)果中的高的24個(gè)比特就總會(huì)被清0,于是結(jié)果總是我們想要的。

* 3.utf-8編碼:中文占用3個(gè)字節(jié),英文占用1個(gè)字節(jié)
* gbk編碼:中文占用2個(gè)字節(jié),英文占用1個(gè)字節(jié)
* Java采用雙字節(jié)編碼(就是Java中的一個(gè)字符占兩個(gè)字節(jié))是utf-16be編碼。中文占用2個(gè)字節(jié),英文占用2個(gè)字節(jié)
*
* 4.當(dāng)你的字節(jié)序列是某種編碼時(shí),這個(gè)時(shí)候想把字節(jié)序列變成字符串,也需要用這種編碼方式,否則會(huì)出現(xiàn)亂碼

* 5.文本文件 就是字節(jié)序列。可以是任意編碼的字節(jié)序列。
* 如果我們?cè)谥形臋C(jī)器上直接創(chuàng)建文本文件,那么該文件只認(rèn)識(shí)ANSI編碼(例如直接在電腦中創(chuàng)建文本文件)

二、File類的使用

package com.study.io;import java.io.File;/*** File類的使用*/public class FileDemo {/*java.iO.File類表示文件或目錄File類只用于表示文件或目錄的信息(名稱,大小等),不能用于文件內(nèi)容的訪問(wèn)。*/public static void main(String[] args) {File file=new File("D://111");//創(chuàng)建文件對(duì)象時(shí)指定目錄需要用雙斜杠,因?yàn)椤?”是轉(zhuǎn)義字符/*目錄的中間的分隔符可以用雙斜杠,也可以用反斜杠,也可以用File.separator設(shè)置分隔符*/// File file1=new File("d:"+File.separator);// System.out.println(file.exists());//exists()判斷文件或文件夾是否存在if(!file.exists()){//如果文件不存在file.mkdir();//創(chuàng)建文件夾mkdir(),還有mkdirs()創(chuàng)建多級(jí)目錄}else{file.delete();//刪除文件或文件夾}//判斷是否是一個(gè)目錄isDirectory,如果是目錄返回true,如果不是目錄或者目錄不存在返回falseSystem.out.println(file.isDirectory());//判斷是否是一個(gè)文件isFileSystem.out.println(file.isFile());File file2=new File("D://222","123.txt");//常用API:System.out.println(file);//打印的是file.toString()的內(nèi)容System.out.println(file.getAbsolutePath());//獲取絕對(duì)路徑System.out.println(file.getName());//獲取文件名稱System.out.println(file2.getName());System.out.println(file.getParent());//獲取父級(jí)絕對(duì)路徑System.out.println(file2.getParentFile().getAbsolutePath());}}

運(yùn)行結(jié)果:

說(shuō)明:

java.iO.File類表示文件或目錄

File類只用于表示文件或目錄的信息(名稱,大小等),不能用于文件內(nèi)容的訪問(wèn)。

常用的API:

1.創(chuàng)建File對(duì)象:File file=new File(String path);注意:File.seperater();獲取系統(tǒng)分隔符,如:“/”.
2.boolean file.exists();是否存在.
3.file.mkdir();或者file.mkdirs();創(chuàng)建目錄或多級(jí)目錄。
4.file.isDirectory()判斷是否是目錄
file.isFile()判斷是否是文件。
5.file.delete();刪除文件或目錄。
6.file.createNewFile();創(chuàng)建新文件。
7.file.getName()獲取文件名稱或目錄絕對(duì)路徑。
8.file.getAbsolutePath()獲取絕對(duì)路徑。
9.file.getParent();獲取父級(jí)絕對(duì)路徑。

1、遍歷目錄

package com.study.io;import java.io.File;import java.io.IOException;/*** File工具類* 列出File類的常用操作,比如:過(guò)濾、遍歷等操作*/public class FileUtils {/*** 列出指定目錄下(包括其子目錄)的所有文件* @param dir* @throws IOException*/public static void listDirectory(File dir) throws IOException{if(!dir.exists()){//exists()方法用于判斷文件或目錄是否存在throw new IllegalArgumentException("目錄:"+dir+"不存在");}if(!dir.isDirectory()){//isDirectory()方法用于判斷File類的對(duì)象是否是目錄throw new IllegalArgumentException(dir+"不是目錄");}/*String[] fileNames = dir.list();//list()方法用于列出當(dāng)前目錄下的子目錄和文件(直接是子目錄的名稱,不包含子目錄下的內(nèi)容),返回的是字符串?dāng)?shù)組for (String string : fileNames) {System.out.println(string);}*///如果要遍歷子目錄下的內(nèi)容就需要構(gòu)造成File對(duì)象做遞歸操作,F(xiàn)ile提供了直接返回File對(duì)象的APIFile[] listFiles = dir.listFiles();//返回的是直接子目錄(文件)的抽象if(listFiles !=null && listFiles.length >0){for (File file : listFiles) {/*System.out.println(file);*/if(file.isDirectory()){//遞歸listDirectory(file);}else{System.out.println(file);}}}}}

測(cè)試類:

public class FileUtilsTest {public static void main(String[] args) throws IOException {FileUtils.listDirectory(new File("D://ioStudy"));}}

運(yùn)行結(jié)果:

三、RandomAccessFile類的使用

RandomAccessFile:java提供的對(duì)文件內(nèi)容的訪問(wèn),既可以讀文件,也可以寫(xiě)文件。

RandomAccessFile支持隨機(jī)訪問(wèn)文件,可以訪問(wèn)文件的任意位置。

注意 Java文件的模型:

運(yùn)行結(jié)果:

1
12
[65, 66, 127, -1, -1, -1, 127, -1, -1, -1, -42, -48]
7f
ff
ff
ff
7f
ff
ff
ff
d6
d0

四、字節(jié)流(FileInputStream、FileOutputStream)

IO流可分為輸入流和輸出流。

這里又可分為字節(jié)流和字符流。

代碼示例:

package com.study.io;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/*** IO工具類* ❤文件輸入輸出流:* FileInputStream-->具體實(shí)現(xiàn)了在文件上讀取數(shù)據(jù)* FileOutputStream-->實(shí)現(xiàn)了向文件中寫(xiě)出byte數(shù)據(jù)的方法* ❤數(shù)據(jù)輸入輸出流:* DataOutputStream / DataInputStream:對(duì)"流"功能的擴(kuò)展,可以更加方面的讀取int,long,字符等類型數(shù)據(jù)* DataOutputStream writeInt()/writeDouble()/writeUTF()* ❤字節(jié)緩沖流:* BufferedInputStream & BufferedOutputStream* 這兩個(gè)流類位IO提供了帶緩沖區(qū)的操作,一般打開(kāi)文件進(jìn)行寫(xiě)入或讀取操作時(shí),都會(huì)加上緩沖,這種流模式提高了IO的性能 * 比如:從應(yīng)用程序中把輸入放入文件,相當(dāng)于將一缸水倒入到另一個(gè)缸中:FileOutputStream--->write()方法相當(dāng)于一滴一滴地把水“轉(zhuǎn)移”過(guò)去DataOutputStream-->writeXxx()方法會(huì)方便一些,相當(dāng)于一瓢一瓢把水“轉(zhuǎn)移”過(guò)去BufferedOutputStream--->write方法更方便,相當(dāng)于一瓢一瓢先放入桶中(即緩存區(qū)),再?gòu)耐爸械谷氲搅硪粋€(gè)缸中,性能提高了*/public class IOUtil {/*** 讀取指定文件內(nèi)容,按照16進(jìn)制輸出到控制臺(tái)* 并且每輸出10個(gè)byte換行* @param fileName* 單字節(jié)讀取不適合大文件,大文件效率很低*/public static void printHex(String fileName)throws IOException{//把文件作為字節(jié)流進(jìn)行都操作FileInputStream in=new FileInputStream(fileName);int b;int i=1;while((b=in.read())!=-1){/* 0xff換成2進(jìn)制就是8個(gè)1,這樣與的話,其實(shí)就是取到了字符的低8位。 * oxf就是15, 小于15的數(shù)會(huì)轉(zhuǎn)換成一個(gè)16進(jìn)制數(shù),* 你的代碼里希望是固定的兩個(gè)16進(jìn)制數(shù),所以當(dāng)只會(huì)產(chǎn)生一個(gè)時(shí)要加個(gè)0*/if(b <= 0xf){//單位數(shù)前面補(bǔ)0System.out.print("0");}//Integer.toHexString(b)將整型b轉(zhuǎn)換為16進(jìn)制表示的字符串System.out.print(Integer.toHexString(b)+" ");if(i++%10==0){System.out.println();}}in.close();//文件讀寫(xiě)完成以后一定要關(guān)閉}/*** 批量讀取,對(duì)大文件而言效率高,也是我們最常用的讀文件的方式* @param fileName* @throws IOException*/public static void printHexByByteArray(String fileName)throws IOException{FileInputStream in = new FileInputStream(fileName);byte[] buf = new byte[8 * 1024];/*從in中批量讀取字節(jié),放入到buf這個(gè)字節(jié)數(shù)組中,* 從第0個(gè)位置開(kāi)始放,最多放buf.length個(gè) * 返回的是讀到的字節(jié)的個(gè)數(shù)*//*int bytes = in.read(buf,0,buf.length);//一次性讀完,說(shuō)明字節(jié)數(shù)組足夠大int j = 1; for(int i = 0; i < bytes;i++){System.out.print(Integer.toHexString(buf[i] & 0xff)+" ");if(j++%10==0){System.out.println();}}*/int bytes = 0;int j = 1;while((bytes = in.read(buf,0,buf.length))!=-1){for(int i = 0 ; i < bytes;i++){System.out.print(Integer.toHexString(buf[i] & 0xff)+" ");/*** & 0xff:byte類型8位,int類型32位,為了避免數(shù)據(jù)轉(zhuǎn)換錯(cuò)誤,通過(guò)&0xff將高24位清零*/if(j++%10==0){System.out.println();}}}in.close();}/*** 文件拷貝,字節(jié)批量讀取* @param srcFile* @param destFile* @throws IOException*/public static void copyFile(File srcFile, File destFile) throws IOException {if (!srcFile.exists()) {throw new IllegalArgumentException("文件:" + srcFile + "不存在");}if (!srcFile.isFile()) {throw new IllegalArgumentException(srcFile + "不是文件");}FileInputStream in = new FileInputStream(srcFile);FileOutputStream out = new FileOutputStream(destFile);//文件不存在時(shí),會(huì)直接創(chuàng)建;如果存在,刪除后建byte[] buf = new byte[8 * 1024];//批量讀寫(xiě)int b;while ((b = in.read(buf, 0, buf.length)) != -1) {//read(buf,0,buf.length)帶參數(shù)的read返回的是字節(jié)的總長(zhǎng)度;當(dāng)全部讀完后返回的是-1;out.write(buf, 0, b);out.flush();// 最好加上}in.close();out.close();}/*** 進(jìn)行文件的拷貝,利用帶緩沖的字節(jié)流* @param srcFile* @param destFile* @throws IOException*/public static void copyFileByBuffer(File srcFile,File destFile)throws IOException{if(!srcFile.exists()){throw new IllegalArgumentException("文件:"+srcFile+"不存在");}if(!srcFile.isFile()){throw new IllegalArgumentException(srcFile+"不是文件");}BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));int c ;while((c = bis.read())!=-1){bos.write(c);bos.flush();//刷新緩沖區(qū)}bis.close();bos.close();}/*** 單字節(jié),不帶緩沖進(jìn)行文件拷貝* @param srcFile* @param destFile* @throws IOException*/public static void copyFileByByte(File srcFile,File destFile)throws IOException{if(!srcFile.exists()){throw new IllegalArgumentException("文件:"+srcFile+"不存在");}if(!srcFile.isFile()){throw new IllegalArgumentException(srcFile+"不是文件");}FileInputStream in = new FileInputStream(srcFile);FileOutputStream out = new FileOutputStream(destFile);int c ;while((c = in.read())!=-1){//read()不帶參數(shù)的read返回的是讀到的字節(jié)內(nèi)容;當(dāng)全部讀完后返回的都是是-1;out.write(c);out.flush();}in.close();out.close();}}

測(cè)試類:

package com.study.io;import java.io.File;import java.io.IOException;import org.junit.Test;public class IOUtilTest {@Testpublic void testPrintHex() {try {IOUtil.printHex("D://Javaio//FileUtils.java");} catch (IOException e) {e.printStackTrace();}}@Testpublic void testPrintHexByByteArray() {try {long start = System.currentTimeMillis();//當(dāng)前時(shí)間與協(xié)調(diào)世界時(shí) 1970 年 1 月 1 日午夜之間的時(shí)間差(以毫秒為單位測(cè)量)//IOUtil.printHexByByteArray("e://javaio//FileUtils.java");//IOUtil.printHex("e://javaio//1.mp3");IOUtil.printHexByByteArray("e://javaio//1.mp3");System.out.println();long end = System.currentTimeMillis();System.out.println(end - start);} catch (IOException e) {e.printStackTrace();}}@Testpublic void testCopyFile(){try {IOUtil.copyFile(new File("d://javaio//1.txt"), new File("d://javaio//1copy.txt"));} catch (IOException e) {e.printStackTrace();}}@Testpublic void testCopyFileByBuffer(){try {long start = System.currentTimeMillis();/*IOUtil.copyFileByByte(new File("e://javaio//1.mp3"), new File("e://javaio//2.mp3"));*/ //兩萬(wàn)多毫秒/*IOUtil.copyFileByBuffer(new File("e://javaio//1.mp3"), new File("e://javaio//3.mp3"));//一萬(wàn)多毫秒*/IOUtil.copyFile(new File("e://javaio//1.mp3"), new File("e://javaio//4.mp3"));//7毫秒long end = System.currentTimeMillis();System.out.println(end - start );} catch (IOException e) {e.printStackTrace();} }}

五、字符流

package com.study.io;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;public class IsrAndOswDemo {public static void main(String[] args)throws IOException {FileInputStream in = new FileInputStream("e://javaio//utf8.txt");InputStreamReader isr = new InputStreamReader(in,"utf-8");//默認(rèn)項(xiàng)目的編碼,操作的時(shí)候,要寫(xiě)文件本身的編碼格式FileOutputStream out = new FileOutputStream("e://javaio//utf81.txt");OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");/*int c ;while((c = isr.read())!=-1){System.out.print((char)c);}*/char[] buffer = new char[8*1024];int c;/*批量讀取,放入buffer這個(gè)字符數(shù)組,從第0個(gè)位置開(kāi)始放置,最多放buffer.length個(gè)返回的是讀到的字符的個(gè)數(shù)*/while(( c = isr.read(buffer,0,buffer.length))!=-1){String s = new String(buffer,0,c);System.out.print(s);osw.write(buffer,0,c);osw.flush();}isr.close();osw.close();}}

字符流之文件讀寫(xiě)流(FileReader/FileWriter)

字符流的過(guò)濾器

六、對(duì)象的序列化和反序列化

示例:

注意:

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 苏州市| 北安市| 普安县| 宜章县| 红桥区| 宁陵县| 澎湖县| 尼勒克县| 施秉县| 绩溪县| 安多县| 滨海县| 芷江| 西丰县| 石泉县| 阳新县| 巴楚县| 锡林浩特市| 东源县| 宣汉县| 宁国市| 辽阳县| 天峻县| 页游| 光山县| 深水埗区| 那坡县| 唐河县| 新平| 涪陵区| 淮北市| 会泽县| 嫩江县| 贵南县| 黄骅市| 洛阳市| 延川县| 凤阳县| 锡林郭勒盟| 宁夏| 平阳县|