java獲取本地文件的多種方式實(shí)現(xiàn)與比較
示例代碼
廢話少說,上測試代碼
package com.example.demo.utils; import java.io.*; import java.util.Scanner; public class TestCode { public static void main(String[] args) throws Exception,IOException{ // testCode(); // getFileContent(); // getFileContentTwo(); getFileContentThree(); } //方法一 public static void getFileContent() throws IOException{ FileReader fr = new FileReader("E:\\testfile\\test_utf8.txt"); BufferedReader br = new BufferedReader(fr); while(br.ready()){ System.out.println(br.readLine()); } } //方法二 public static void getFileContentTwo() throws IOException{ String encoding="GBK"; File file=new File("E:\\testfile\\test.txt"); //判斷文件是否存在 if(file.isFile() && file.exists()) { //考慮到編碼格式 InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding); BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; while ((lineTxt = bufferedReader.readLine()) != null) { System.out.println(lineTxt); } read.close(); }else { System.out.println("該文件不存在"); } } //方法三 public static void getFileContentThree() throws IOException{ Scanner in = new Scanner(new File("E:\\testfile\\test_utf8.txt")); while (in.hasNextLine()) { System.out.println(in.nextLine()); } } /** * *@param: *@return:獲得txt文件編碼格式 *@Date:2019/8/26 */ public static void testCode() throws Exception{ BufferedInputStream bin=new BufferedInputStream(new FileInputStream("E:\\testfile\\test.txt")); int p=(bin.read()<<8)+bin.read(); String code=null; switch (p){ case 0xefbb: code="UTF-8"; break; case 0xfffe: code="Unicode"; break; case 0xfeff: code="UTF-16BE"; break; default: code="GBK"; } System.out.println(String.format("測試文件的編碼格式是:"+code)); } }
相同點(diǎn):
三種方法都可以讀取到本地磁盤下的tex文件內(nèi)容
三種方法讀取編碼格式為utf-8的文件,都可以正常輸出
區(qū)別:
方法一、方法三輸出編碼格式為GBK的文件,會(huì)有問題 ———— 方法一控制臺(tái)輸出的文件內(nèi)容會(huì)亂碼、方法三則什么也不輸出
方法二讀取編碼格式為GBK的文件,可以正常輸出
測試結(jié)果
方法一、方法二、方法三
文件編碼:utf_8
方法一
文件編碼:GBK
方法二
文件編碼:GBK
方法三
文件編碼:GBK
概念
計(jì)算機(jī)中文件都用一堆二進(jìn)制的數(shù)字 0 、1保存的。文件的編碼格式指的是這個(gè)文件的內(nèi)容和0、 1的一個(gè)對(duì)應(yīng)關(guān)系。因此,可以得到兩個(gè)結(jié)論:
1.一個(gè)文件的編碼格式有且僅有一種。(要么是utf-8,要么是gbk,要么是其他編碼,不能幾種同時(shí)存在)
2.文件的編碼格式可以改變。
分析:讀取文件亂碼的原因是什么?
文件的編碼格式指的是一個(gè)對(duì)應(yīng)關(guān)系。對(duì)應(yīng)關(guān)系錯(cuò)了,肯定拿不到文件中的內(nèi)容。所以亂碼的根源就是保存文件的編碼格式和讀取文件的編碼格式不同。
知道了文件亂碼的原因就好解決問題了
java中只有在轉(zhuǎn)換流中才能設(shè)置讀取流文件中編碼格式。(代碼示例詳見上述方法二)
其他字節(jié)流,字符流讀取的文件格式都是默認(rèn)的utf-8,無法設(shè)置編碼格式。這種方法讀取utf-8的文件不會(huì)有問題,一旦非utf-8就會(huì)出錯(cuò)。
所以,上面方法二雖然代碼量最多,但優(yōu)勢也顯而易見——健壯性、穩(wěn)定性、擴(kuò)展性都優(yōu)于方法一、三。
補(bǔ)充:
字符流:txt文件。該流只能處理字符,但處理字符速度很快
字節(jié)流:txt文件,Excel文件,word文件、圖片、視頻等文件??梢蕴幚硭幸詁it為單位儲(chǔ)存的文件,也就是說可以處理所有的文件,但是在處理字符上的速度不如字符流
除了字符流和字節(jié)流之外,還有轉(zhuǎn)換流:
- InputStreamReader:
- OutputStreamWriter:
轉(zhuǎn)換流可以把字節(jié)流轉(zhuǎn)化為字符流,可以解決編碼格式和解碼格式不一致的問題。
字符流文件和字節(jié)流文件的區(qū)別在于計(jì)算機(jī)用來保存文件的二進(jìn)制編碼0 、1的位數(shù)。
字符流就是一個(gè)字符由一個(gè)8位數(shù)的二進(jìn)制數(shù)表示;
字節(jié)流表示一個(gè)基本存儲(chǔ)單元的二進(jìn)制數(shù)可能是8位,也可能是16位,32位等。
因此字符流可以理解為特殊的字節(jié)流。
以上就是java獲取本地文件的多種方式實(shí)現(xiàn)與比較的詳細(xì)內(nèi)容,更多關(guān)于java獲取本地文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java用單向環(huán)形鏈表來解決約瑟夫環(huán)Josepfu問題
如果把單鏈表的最后一個(gè)節(jié)點(diǎn)的指針指向鏈表頭部,而不是指向NULL,那么就構(gòu)成了一個(gè)單向循環(huán)鏈表,通俗講就是把尾節(jié)點(diǎn)的下一跳指向頭結(jié)點(diǎn)2021-10-10探究springboot中的TomcatMetricsBinder
springboot的TomcatMetricsBinder主要是接收ApplicationStartedEvent然后創(chuàng)建TomcatMetrics執(zhí)行bindTo進(jìn)行注冊(cè),TomcatMetrics主要注冊(cè)了globalRequest、servlet、cache、threadPool、session相關(guān)的指標(biāo),本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-11-11Spring-AOP @AspectJ切點(diǎn)函數(shù)之@annotation()用法
這篇文章主要介紹了Spring-AOP @AspectJ切點(diǎn)函數(shù)之@annotation()用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07關(guān)于Mybatis-Plus?Wrapper是否應(yīng)該出現(xiàn)在Servcie類中
最近在做代碼重構(gòu),代碼工程采用了Controller/Service/Dao分層架構(gòu),Dao層使用了Mybatis-Plus框架,本文帶領(lǐng)大家學(xué)習(xí)Mybatis-Plus?Wrapper應(yīng)該出現(xiàn)在Servcie類中嗎,需要的朋友可以參考下2023-05-05Java數(shù)據(jù)結(jié)構(gòu)之鏈表的增刪查改詳解
今天帶大家來學(xué)習(xí)Java鏈表的增刪改查的相關(guān)知識(shí),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05Mybatis實(shí)現(xiàn)SQL存儲(chǔ)流程詳解
MyBatis作為一款優(yōu)秀的持久層框架,它支持自定義SQL、存儲(chǔ)過程以及高級(jí)映射。它免除了幾乎所有的JDBC代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作2023-03-03Spring Boot靜態(tài)資源路徑的配置與修改詳解
最近在做SpringBoot項(xiàng)目的時(shí)候遇到了“白頁”問題,通過查資料對(duì)SpringBoot訪問靜態(tài)資源做了總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09