java_io 涉及到文件(txt,圖片)上傳,下載畏邢,讀取文件业扒,excel上傳和下載

java_io 涉及到文件(txt,圖片)上傳,下載舒萎,讀取文件程储,excel上傳和下載

字符流和字節(jié)流

  1. UML

字符流

byte.png

字節(jié)流

[圖片上傳失敗...(image-d5611-1662632030088)]

  1. 字符流code

字符流輸入



/**
 * 屬于字節(jié)流 InputStream 輸入流FileInputStream
 * FileInputStream:只能以字節(jié)單位讀取,對漢字不友好臂寝;讀取漢字亂碼章鲤,換成字符流讀取即可
 * 從另一角度來說:字符流 = 字節(jié)流 + 編碼表。
 */
public class FileInputStreamTest {

    //FileInputStream讀取 txt,中文亂碼
//    public static void main(String[] args) throws IOException {
//        //創(chuàng)建一個(gè)輸入流咆贬,方便讀取
//        FileInputStream fis = new FileInputStream("D:/output4.txt");
//
//        //定義一個(gè)字節(jié)數(shù)組咏窿,裝字節(jié)數(shù)據(jù)容器
//        byte[] b = new byte[2];
//        while (fis.read(b) != -1) {
//            //按照每2個(gè)字節(jié)讀取: 一個(gè)英文單詞一個(gè)字節(jié),一個(gè)漢字3個(gè)字節(jié)
//            System.out.println(new String(b));
//
//        }
//    }

    //InputStreamReader: 根據(jù)字符讀取素征,但是不能一行一行讀燃丁;解決:使用緩沖流解決
    public static void main(String[] args) throws IOException {
        //創(chuàng)建一個(gè)輸入流御毅,方便讀取
        FileInputStream fis = new FileInputStream("D:/output4.txt");

        //轉(zhuǎn)換成字符流的輸入流
        Reader reader = new InputStreamReader(fis,"utf-8");
        char[] b = new char[2];

        int readData;
        while (-1 != (readData = reader.read(b))) {
            //按照每4個(gè)字節(jié)讀取: 一個(gè)漢字一個(gè)字符
            System.out.println(new String(b));

        }

    }
}

字符流輸出


/**
 * 字節(jié)流根欧,OutputStream輸出流:FileOutputStream,ObjectOutputStream
 * 寫入不了漢字字符串
 */
public class FileOutputStreamTest {

    //FileOutputStream測試
//    public static void main(String[] args) throws Exception {
//        //定義一個(gè)文件輸出流:相當(dāng)于一個(gè)最終輸出的容器端蛆,以文件形式存在
//        FileOutputStream fos = new FileOutputStream("D:/output.txt");
//        fos.write(97);//可以寫int
//        fos.write("abc".getBytes());//寫字節(jié)
//        fos.write("qwer".getBytes(),1,2);//寫指定長度的字節(jié)
//        fos.close();//關(guān)閉資源
//
//    }

    //ObjectOutputStream 功能更強(qiáng)大凤粗,輸出流可以寫 漢字字符串,對象
    //解決亂碼:對象沒有序列化,但是寫漢字字符串依然亂碼
    //解決漢字亂碼:使用PrintStream
    public static void main(String[] args) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/output2.txt"));
        String s = "abc";
        oos.writeChars(s);
        Map<String, String> map = new HashMap<>();
        map.put("name","lg");
        map.put("age", "10");
        oos.writeObject(JSONObject.toJSONString(map));
        oos.close();//關(guān)閉資源

        PrintStream printStream = new PrintStream(new FileOutputStream("D:/output3.txt"));
        printStream.println("發(fā)的發(fā)但是\n rqwer");
        printStream.close();
    }
}

字符流讀


/**
 * 字符流,讀嫌拣,
 * InputStreamReader:按照字符讀取柔袁,效率低
 * BufferedReader:按照一行讀取,效率高异逐;字節(jié)流 => 字符流讀 => 緩沖流讀
 */
public class InputStreamReadTest {

    //InputStreamReader
//    public static void main(String[] args) throws IOException {
//        InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("D:/test.txt"));
//
//        char[] chars = new char[2];
//
//        while (inputStreamReader.read(chars) != -1) {
//            System.out.println(new String(chars));
//        }
//
//    }

    // 字節(jié)流 => 字符流讀 => 緩沖流讀
    public static void main(String[] args) throws IOException{
        Reader reader = new InputStreamReader(new FileInputStream("D:/test.txt"));
        BufferedReader bufferedReader = new BufferedReader(reader);
        String lineStr = null;
        while ((lineStr = bufferedReader.readLine()) != null) {
            System.out.println(lineStr);
        }

        bufferedReader.close();
    }
}

字符流寫


/**
 * 字符流捶索,寫入,依賴于字節(jié)流
 * OutputStreamWriter:只能寫入字符灰瞻,字符串腥例,
 * OutputStreamWriter:寫入效率快
 */
public class OutputStreamWriterTest {
    //OutputStreamWriter
//    public static void main(String[] args) throws IOException,Exception {
//        //字符流寫的創(chuàng)建依賴與 字節(jié)流輸出創(chuàng)建
//        Writer writer = new OutputStreamWriter(new FileOutputStream("D:/output6.txt"), "utf-8");
//
//        writer.write("發(fā)放時(shí)");//
//
//        writer.close();
//
//    }

    //字節(jié)流 =》 字符流 => 緩存字符流  : 效率快
    public static void main(String[] args) throws IOException {
        Writer writer = new OutputStreamWriter(new FileOutputStream("D:/output6.txt"), "utf-8");
        BufferedWriter bufferedWriter = new BufferedWriter(writer);
        bufferedWriter.write("Fsdfasd方法士大夫");
        bufferedWriter.close();
    }
}

  1. 總結(jié)
  • 字符流 比 字節(jié)流 效率慢;字符流適合中文讀寫操作
  • 可以使用緩沖流 提升讀寫效率酝润;字節(jié)流 =》 字符流 =》 緩存字符流
  • 注意:中文亂碼bug
  • 序列化問題
  • 編碼格式

上傳和下載

excel上傳和下載

使用第三方的jar

<!--        excel導(dǎo)入和導(dǎo)出工具 easypoi-base-->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>3.2.0</version>
        </dependency>
  1. 后臺代碼
//實(shí)體必須加上注解@Excel
@Data
@AllArgsConstructor
public class UserDTO {

    @Excel(name = "名稱")
    private String name;
    @Excel(name = "年齡")
    private Integer age;
}

@RequestMapping("/user")
@RestController
public class UserController {

    @Resource
    private UserService userService;

    @GetMapping("/find")
    public String find() {
        String s = userService.find();
        return s;
    }


    //上傳功能
    @PostMapping("/importExecl")
    public String importExecl(@RequestParam("file") MultipartFile file) throws Exception {
//        Excel
        List<UserDTO> userDTOS = ExcelImportUtil.importExcel(file.getInputStream(), UserDTO.class, new ImportParams());
        userDTOS.stream().forEach(v -> System.out.println(v));
        //插入數(shù)據(jù)庫操作
        return "ok";
    }

    //導(dǎo)出功能
    @GetMapping("/exportExecl")
    public String exportExecl(String id, HttpServletRequest request, HttpServletResponse response) throws IOException {
        List<UserDTO> userDTOS = new ArrayList<>();
        userDTOS.add(new UserDTO("FASD",12));
        userDTOS.add(new UserDTO("Fdsf",100));

        //必須設(shè)置的
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment; filename=" + "用戶");
        Workbook sheets = null;
        ExportParams exportParams = new ExportParams(null,"用戶");
        exportParams.setType(ExcelType.XSSF);
        ServletOutputStream outputStream = response.getOutputStream();

        try {
            sheets = ExcelExportUtil.exportBigExcel(exportParams, UserDTO.class, userDTOS);

            sheets.write(outputStream);
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (sheets != null){
                sheets.close();
            }
            ExcelExportUtil.closeExportBigExcel();
        }


        return "ok";
    }



}


  1. 前端 代碼 jq ajax
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
    <!-- <script src="./js-file-download-master/file-download.js"></script> -->
</head>

<body>
    <input type="file" id="file">
    <button id="import">上傳</button>
    <button id="export">導(dǎo)出</button>


</body>
<script>

    //導(dǎo)出
    $("#export").click(() => {
        $.ajax({
            url: "http://127.0.0.1:8080/user/exportExecl",
            method: "GET",
            data: null,
            processData: false,
            contentType: false,
            xhrFields: { responseType: "arraybuffer" },//必須設(shè)置燎竖,不然會亂碼
            success: function (res) {
                console.log(res);

                //
                const blob = new Blob([res], { type: "application/vnd.ms-excel" });

                if (blob.size < 1) {

                    alert('導(dǎo)出失敗,導(dǎo)出的內(nèi)容為空要销!');

                    return

                }

                if (window.navigator.msSaveOrOpenBlob) {

                    navigator.msSaveOrOpenBlob(blob, '用戶.xlsx')

                } else {

                    const aLink = document.createElement('a');

                    aLink.style.display = 'none';
                    //[關(guān)鍵]
                    aLink.href = window.URL.createObjectURL(blob);//把二進(jìn)制流轉(zhuǎn)換成下載鏈接

                    aLink.download = '用戶.xlsx';

                    document.body.appendChild(aLink);

                    aLink.click();

                    document.body.removeChild(aLink);

                }

            }

        })


    })

    //下載
    $("#import").click(() => {
        let file = $("#file")[0].files[0];
        console.log(file)
        let formData = new FormData();
        formData.append("file", file);


        $.ajax({
            url: "http://127.0.0.1:8080/user/importExecl",
            method: "POST",
            data: formData,
            processData: false,
            contentType: false,
            success: function (res) {
                console.log(res);
                fileDownload(res, '用戶.xlsx');
            }

        })

    })

    $.ajax({
        url: "http://127.0.0.1:8080/user/find",
        method: "GET",
        success: function (res) {
            console.log(res);
        }

    })
</script>

</html>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末构回,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疏咐,更是在濱河造成了極大的恐慌纤掸,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凳鬓,死亡現(xiàn)場離奇詭異茁肠,居然都是意外死亡患民,警方通過查閱死者的電腦和手機(jī)缩举,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匹颤,“玉大人仅孩,你說我怎么就攤上這事∮”停” “怎么了辽慕?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赦肃。 經(jīng)常有香客問我溅蛉,道長,這世上最難降的妖魔是什么他宛? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任船侧,我火速辦了婚禮,結(jié)果婚禮上厅各,老公的妹妹穿的比我還像新娘镜撩。我一直安慰自己,他們只是感情好队塘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布袁梗。 她就那樣靜靜地躺著宜鸯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遮怜。 梳的紋絲不亂的頭發(fā)上淋袖,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音奈泪,去河邊找鬼适贸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛涝桅,可吹牛的內(nèi)容都是我干的拜姿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼冯遂,長吁一口氣:“原來是場噩夢啊……” “哼蕊肥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛤肌,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤壁却,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后裸准,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體展东,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年炒俱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盐肃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡权悟,死狀恐怖砸王,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情峦阁,我是刑警寧澤谦铃,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站榔昔,受9級特大地震影響驹闰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撒会,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一嘹朗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茧彤,春花似錦骡显、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壁顶。三九已至,卻和暖如春溜歪,著一層夾襖步出監(jiān)牢的瞬間若专,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工蝴猪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留调衰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓自阱,卻偏偏與公主長得像嚎莉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子沛豌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容