java 基礎(chǔ)知識(shí)之IO總結(jié)
java 基礎(chǔ)知識(shí)之IO總結(jié)
我計(jì)劃在接下來(lái)的幾篇文章中快速回顧一下Java,主要是一些基礎(chǔ)的JDK相關(guān)的內(nèi)容。
工作后,使用的技術(shù)隨著項(xiàng)目的變化而變化,時(shí)而C#,時(shí)而Java,當(dāng)然還有其他一些零碎的技術(shù)??傮w而言,C#的使用時(shí)間要更長(zhǎng)一些,其次是Java。我本身對(duì)語(yǔ)言沒(méi)有什么傾向性,能干活的語(yǔ)言,就是好語(yǔ)言。而且從面向?qū)ο蟮慕嵌葋?lái)看,我覺(jué)得C#和Java對(duì)我來(lái)說(shuō),沒(méi)什么區(qū)別。
這篇文章主要回顧Java中和I/O操作相關(guān)的內(nèi)容,I/O也是編程語(yǔ)言的一個(gè)基礎(chǔ)特性,Java中的I/O分為兩種類(lèi)型,一種是順序讀取,一種是隨機(jī)讀取。
我們先來(lái)看順序讀取,有兩種方式可以進(jìn)行順序讀取,一種是InputStream/OutputStream,它是針對(duì)字節(jié)進(jìn)行操作的輸入輸出流;另外一種是Reader/Writer,它是針對(duì)字符進(jìn)行操作的輸入輸出流。
下面我們畫(huà)出InputStream的結(jié)構(gòu)
- FileInputStream:操作文件,經(jīng)常和BufferedInputStream一起使用
- PipedInputStream:可用于線程間通信
- ObjectInputStream:可用于對(duì)象序列化
- ByteArrayInputStream:用于處理字節(jié)數(shù)組的輸入
- LineNumberInputStream:可輸出當(dāng)前行數(shù),并且可以在程序中進(jìn)行修改
下面是OutputStream的結(jié)構(gòu)
PrintStream:提供了類(lèi)似print和println的接口去輸出數(shù)據(jù)
下面我們來(lái)看如何使用Stream的方式來(lái)操作輸入輸出
使用InputStream讀取文件
使用FileInputStream讀取文件信息 public static byte[] readFileByFileInputStream(File file) throws IOException { ByteArrayOutputStream output = new ByteArrayOutputStream(); FileInputStream fis = null; try { fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int bytesRead = 0; while((bytesRead = fis.read(buffer, 0, buffer.length)) != -1) { output.write(buffer, 0, bytesRead); } } catch(Exception ex) { System.out.println("Error occurs during reading " + file.getAbsoluteFile()); } finally { if (fis !=null) fis.close(); if (output !=null) output.close(); } return output.toByteArray(); }
使用BufferedInputStream讀取文件 public static byte[] readFileByBufferedInputStream(File file) throws Exception { FileInputStream fis = null; BufferedInputStream bis = null; ByteArrayOutputStream output = new ByteArrayOutputStream(); try { fis = new FileInputStream(file); bis = new BufferedInputStream(fis); byte[] buffer = new byte[1024]; int bytesRead = 0; while((bytesRead = bis.read(buffer, 0, buffer.length)) != -1) { output.write(buffer, 0, bytesRead); } } catch(Exception ex) { System.out.println("Error occurs during reading " + file.getAbsoluteFile()); } finally { if (fis != null) fis.close(); if (bis != null) bis.close(); if (output != null) output.close(); } return output.toByteArray(); }
使用OutputStream復(fù)制文件
使用FileOutputStream復(fù)制文件 public static void copyFileByFileOutputStream(File file) throws IOException { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(file); fos = new FileOutputStream(file.getName() + ".bak"); byte[] buffer = new byte[1024]; int bytesRead = 0; while((bytesRead = fis.read(buffer,0,buffer.length)) != -1) { fos.write(buffer, 0, bytesRead); } fos.flush(); } catch(Exception ex) { System.out.println("Error occurs during copying " + file.getAbsoluteFile()); } finally { if (fis != null) fis.close(); if (fos != null) fos.close(); } }
使用BufferedOutputStream復(fù)制文件 public static void copyFilebyBufferedOutputStream(File file)throws IOException { FileInputStream fis = null; BufferedInputStream bis = null; FileOutputStream fos = null; BufferedOutputStream bos = null; try { fis = new FileInputStream(file); bis = new BufferedInputStream(fis); fos = new FileOutputStream(file.getName() + ".bak"); bos = new BufferedOutputStream(fos); byte[] buffer = new byte[1024]; int bytesRead = 0; while((bytesRead = bis.read(buffer, 0, buffer.length)) != -1) { bos.write(buffer, 0, bytesRead); } bos.flush(); } catch(Exception ex) { System.out.println("Error occurs during copying " + file.getAbsoluteFile()); } finally { if (fis != null) fis.close(); if (bis != null) bis.close(); if (fos != null) fos.close(); if (bos != null) bos.close(); } }
這里的代碼對(duì)異常的處理非常不完整,稍后我們會(huì)給出完整嚴(yán)謹(jǐn)?shù)拇a。
下面我們來(lái)看Reader的結(jié)構(gòu)
這里的Reader基本上和InputStream能夠?qū)?yīng)上。
Writer的結(jié)構(gòu)如下
下面我們來(lái)看一些使用Reader或者Writer的例子
使用Reader讀取文件內(nèi)容
使用BufferedReader讀取文件內(nèi)容 public static String readFile(String file)throws IOException { BufferedReader br = null; StringBuffer sb = new StringBuffer(); try { br = new BufferedReader(new FileReader(file)); String line = null; while((line = br.readLine()) != null) { sb.append(line); } } catch(Exception ex) { System.out.println("Error occurs during reading " + file); } finally { if (br != null) br.close(); } return sb.toString(); }
使用Writer復(fù)制文件
使用BufferedWriter復(fù)制文件 public static void copyFile(String file) throws IOException { BufferedReader br = null; BufferedWriter bw = null; try { br = new BufferedReader(new FileReader(file)); bw = new BufferedWriter(new FileWriter(file + ".bak")); String line = null; while((line = br.readLine())!= null) { bw.write(line); } } catch(Exception ex) { System.out.println("Error occurs during copying " + file); } finally { if (br != null) br.close(); if (bw != null) bw.close(); } }
下面我們來(lái)看如何對(duì)文件進(jìn)行隨機(jī)訪問(wèn),Java中主要使用RandomAccessFile來(lái)對(duì)文件進(jìn)行隨機(jī)操作。
創(chuàng)建一個(gè)大小固定的文件
創(chuàng)建大小固定的文件 public static void createFile(String file, int size) throws IOException { File temp = new File(file); RandomAccessFile raf = new RandomAccessFile(temp, "rw"); raf.setLength(size); raf.close(); }
向文件中隨機(jī)寫(xiě)入數(shù)據(jù)
向文件中隨機(jī)插入數(shù)據(jù) public static void writeFile(String file, byte[] content, int startPos, int contentLength) throws IOException { RandomAccessFile raf = new RandomAccessFile(new File(file), "rw"); raf.seek(startPos); raf.write(content, 0, contentLength); raf.close(); }
接下里,我們來(lái)看一些其他的常用操作
移動(dòng)文件
移動(dòng)文件 public static boolean moveFile(String sourceFile, String destFile) { File source = new File(sourceFile); if (!source.exists()) throw new RuntimeException("source file does not exist."); File dest = new File(destFile); if (!(new File(dest.getPath()).exists())) new File(dest.getParent()).mkdirs(); return source.renameTo(dest); }
復(fù)制文件
復(fù)制文件 public static void copyFile(String sourceFile, String destFile) throws IOException { File source = new File(sourceFile); if (!source.exists()) throw new RuntimeException("File does not exist."); if (!source.isFile()) throw new RuntimeException("It is not file."); if (!source.canRead()) throw new RuntimeException("File cound not be read."); File dest = new File(destFile); if (dest.exists()) { if (dest.isDirectory()) throw new RuntimeException("Destination is a folder."); else { dest.delete(); } } else { File parentFolder = new File(dest.getParent()); if (!parentFolder.exists()) parentFolder.mkdirs(); if (!parentFolder.canWrite()) throw new RuntimeException("Destination can not be written."); } FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(source); fos = new FileOutputStream(dest); byte[] buffer = new byte[1024]; int bytesRead = 0; while((bytesRead = fis.read(buffer, 0, buffer.length)) != -1) { fos.write(buffer, 0, bytesRead); } fos.flush(); } catch(IOException ex) { System.out.println("Error occurs during copying " + sourceFile); } finally { if (fis != null) fis.close(); if (fos != null) fos.close(); } }
復(fù)制文件夾
復(fù)制文件夾 public static void copyDir(String sourceDir, String destDir) throws IOException { File source = new File(sourceDir); if (!source.exists()) throw new RuntimeException("Source does not exist."); if (!source.canRead()) throw new RuntimeException("Source could not be read."); File dest = new File(destDir); if (!dest.exists()) dest.mkdirs(); File[] arrFiles = source.listFiles(); for(int i = 0; i < arrFiles.length; i++) { if (arrFiles[i].isFile()) { BufferedReader reader = new BufferedReader(new FileReader(arrFiles[i])); BufferedWriter writer = new BufferedWriter(new FileWriter(destDir + "/" + arrFiles[i].getName())); String line = null; while((line = reader.readLine()) != null) writer.write(line); writer.flush(); reader.close(); writer.close(); } else { copyDir(sourceDir + "/" + arrFiles[i].getName(), destDir + "/" + arrFiles[i].getName()); } } }
刪除文件夾
刪除文件夾 public static void del(String filePath) { File file = new File(filePath); if (file == null || !file.exists()) return; if (file.isFile()) { file.delete(); } else { File[] arrFiles = file.listFiles(); if (arrFiles.length > 0) { for(int i = 0; i < arrFiles.length; i++) { del(arrFiles[i].getAbsolutePath()); } } file.delete(); } }
獲取文件夾大小
獲取文件夾大小 public static long getFolderSize(String dir) { long size = 0; File file = new File(dir); if (!file.exists()) throw new RuntimeException("dir does not exist."); if (file.isFile()) return file.length(); else { String[] arrFileName = file.list(); for (int i = 0; i < arrFileName.length; i++) { size += getFolderSize(dir + "/" + arrFileName[i]); } } return size; }
將大文件切分為多個(gè)小文件
將大文件切分成多個(gè)小文件 public static void splitFile(String filePath, long unit) throws IOException { File file = new File(filePath); if (!file.exists()) throw new RuntimeException("file does not exist."); long size = file.length(); if (unit >= size) return; int count = size % unit == 0 ? (int)(size/unit) : (int)(size/unit) + 1; String newFile = null; FileOutputStream fos = null; FileInputStream fis =null; byte[] buffer = new byte[(int)unit]; fis = new FileInputStream(file); long startPos = 0; String countFile = filePath + "_Count"; PrintWriter writer = new PrintWriter(new FileWriter( new File(countFile))); writer.println(filePath + "\t" + size); for (int i = 1; i <= count; i++) { newFile = filePath + "_" + i; startPos = (i - 1) * unit; System.out.println("Creating " + newFile); fos = new FileOutputStream(new File(newFile)); int bytesRead = fis.read(buffer, 0, buffer.length); if (bytesRead != -1) { fos.write(buffer, 0, bytesRead); writer.println(newFile + "\t" + startPos + "\t" + bytesRead); } fos.flush(); fos.close(); System.out.println("StartPos:" + i*unit + "; EndPos:" + (i*unit + bytesRead)); } writer.flush(); writer.close(); fis.close(); }
將多個(gè)小文件合并為一個(gè)大文件
將多個(gè)小文件合并成一個(gè)大文件 public static void linkFiles(String countFile) throws IOException { File file = new File(countFile); if (!file.exists()) throw new RuntimeException("Count file does not exist."); BufferedReader reader = new BufferedReader(new FileReader(file)); String line = reader.readLine(); String newFile = line.split("\t")[0]; long size = Long.parseLong(line.split("\t")[1]); RandomAccessFile raf = new RandomAccessFile(newFile, "rw"); raf.setLength(size); FileInputStream fis = null; byte[] buffer = null; while((line = reader.readLine()) != null) { String[] arrInfo = line.split("\t"); fis = new FileInputStream(new File(arrInfo[0])); buffer = new byte[Integer.parseInt(arrInfo[2])]; long startPos = Long.parseLong(arrInfo[1]); fis.read(buffer, 0, Integer.parseInt(arrInfo[2])); raf.seek(startPos); raf.write(buffer, 0, Integer.parseInt(arrInfo[2])); fis.close(); } raf.close(); }
執(zhí)行外部命令
執(zhí)行外部命令 public static void execExternalCommand(String command, String argument) { Process process = null; try { process = Runtime.getRuntime().exec(command + " " + argument); InputStream is = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line = null; while((line = br.readLine()) != null) { System.out.println(line); } } catch(Exception ex) { System.err.println(ex.getMessage()); } finally { if (process != null) process.destroy(); } }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
springboot攔截器過(guò)濾token,并返回結(jié)果及異常處理操作
這篇文章主要介紹了springboot攔截器過(guò)濾token,并返回結(jié)果及異常處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09關(guān)于Jsoup將相對(duì)路徑轉(zhuǎn)為絕對(duì)路徑的方法
這篇文章主要介紹了關(guān)于Jsoup將相對(duì)路徑轉(zhuǎn)為絕對(duì)路徑的方法,jsoup 是一款Java 的HTML解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容,需要的朋友可以參考下2023-04-04Spring向頁(yè)面?zhèn)髦岛徒邮茼?yè)面?zhèn)鬟^(guò)來(lái)的參數(shù)詳解
這篇文章主要給大家介紹了關(guān)于Spring向頁(yè)面?zhèn)髦岛徒邮茼?yè)面?zhèn)鬟^(guò)來(lái)的參數(shù)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06Alibaba?SpringCloud集成Nacos、openFeign實(shí)現(xiàn)負(fù)載均衡的解決方案
Spring?Cloud?Alibaba?致力于提供微服務(wù)開(kāi)發(fā)的一站式解決方案,此項(xiàng)目包含開(kāi)發(fā)分布式應(yīng)用微服務(wù)的必需組件,這篇文章主要介紹了Alibaba?SpringCloud集成Nacos、openFeign實(shí)現(xiàn)負(fù)載均衡,需要的朋友可以參考下2024-05-05MYSQL批量插入數(shù)據(jù)的實(shí)現(xiàn)代碼
非常的實(shí)現(xiàn)原理,代碼較多,建議大家仔細(xì)看看。2008-10-10SpringBoot @Cacheable自定義KeyGenerator方式
這篇文章主要介紹了SpringBoot @Cacheable自定義KeyGenerator方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12