色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

java中的IO流與Guava工具

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-09-25 16:24 ? 次閱讀

Guava IO

日常系統交互中,文件的上傳下載都是常見的,一般我們會通過jdk提供的IO操作庫幫助我們實現。IO指的是數據相對當前操作程序的入與出,將數據通過 輸出流從程序輸出,或者通過輸入流將數據(從文件、網絡、數據等)寫入到程序,這里的IO指的是基于流作為載體進行數據傳輸。如果把數據比作合理的水,河就是IO流,也是數據的載體。

Java為我們提供了非常多的操作IO的接口與類,幫助開發者實現不同源間的數據傳輸,比如硬盤文件、網絡傳輸、應用調用間的數據交互與傳遞。今天我們來簡單了解下Java中的流 以及在Guava工具包中,針對IO操作做了什么樣的封裝與設計。

分類

在java.io包中有非常多的IO相關接口,我們可以根據流的輸出類型、處理對象以及功能將其分為以下幾種類型:

  • 按數據流向
    • 輸入流 (java.io.InputStream)
      用于實現將數據讀入到程序
    • 輸出流 (java.io.OutputStream)
      用于實現將數據從程序寫出
  • 按操作單位
    • 字節流
      以字節(byte)為單位進行數據的讀、寫 (其中針對文件也提供了按基礎數據類型的讀與寫DataInpoutStream,也就是按照Java基礎類型所占字節數來進行定量字節讀取并合并)
    • 字符流
      以字符(char)為單位進行數據的讀、寫,此時需要注意字符編碼

區分:

字節流一般以Stream結尾 字符流一般以Reader或Writer結尾

  • 按操作方式
    • 讀 (java.io.Reader)
      主要針對字符流的讀取操作
    • 寫 (java.io.Writer)
      主要針對字符流的寫出操作
  • 按功能
    • 緩存流
      按字節進行數據讀寫時,通過緩沖批量寫入來提高傳輸效率
    • 轉換流
      實現輸入/出與讀/寫方式間的轉換

常用的流

  • 操作文件的
    java.io.FileinputStream/FileOutputStream java.io.FileReader/FileWriter
  • 通用的字節流
    java.io.InputStreamReader/outputStreamWriter
  • 緩沖流
    java.io.BufferedReader/BufferedWriter java.io.BufferedInputStream/BufferedOutputStream
  • 數據流
    java.io.DataInpoutStream/DataOutputStream
  • 功能型的
    java.io.PrintWriter/PrintStream
  • 對象序列化相關的
    java.io.ObjectInputStream/ObjectOutputStream

可見,提供的IO對象基本都是成對出現的,用以完成數據的輸入輸出,實現程序與外部載體間的數據交換

示例

下面我們通過一些常用示例來看看IO的使用的場景與使用方法:

  • 文件復制
  • 文件的合并
  • 讀取文件內容為字符串
  • 字節數組轉換成流
  • 對象序列化與反序列化
  • 流的轉換
  • ......

  • 文件復制
@Test
    public void copyByBytes() throws IOException {
        String root = FileTests.class.getResource("/").getPath();

        FileInputStream fis = new FileInputStream(new File(root,"/start.bat"));
        FileOutputStream fos = new FileOutputStream(root+"/out2.bat");

        byte[] buff = new byte[100];

        int b;
        while ( (b = fis.read(buff))!=-1 ){
            fos.write(buff, 0, b);
        }
        // close
    }
  • 文件合并
@Test
    public void mergeFiles() throws IOException {
        File file1 = new File("E:_projectssuclsblogmy_studyguavaguava-iosrctestjavacomsuclsblogguavaiocategoryFileTests.java");
        File file2 = new File("E:_projectssuclsblogmy_studyguavaguava-iosrctestjavacomsuclsblogguavaiocategoryStreamTests.java");

        Enumeration< InputStream > ins = Collections.enumeration(Arrays.asList(
                new FileInputStream(file1),
                new FileInputStream(file2)
        ));

        SequenceInputStream sequenceInputStream = new SequenceInputStream(ins);

        FileOutputStream fos = new FileOutputStream(root+"/out4");

        byte[] buff = new byte[100];

        int read; // 真實讀取到的字節數
        while ( (read = sequenceInputStream.read(buff)) !=-1){
            fos.write(buff, 0, read);
        }

        fos.close();
    }
  • 讀取文件內容為字符串
@Test
    public void readStringFromFile() throws IOException {
        FileReader fileReader = new FileReader(new File(this.getClass().getResource("/").getPath(),"/start.bat"));

        StringBuilder stringBuilder = new StringBuilder();

        int i;
        while ( (i = fileReader.read())!=-1 ){
            stringBuilder.append( (char)i ); // 按字符讀取
        }

        System.out.println( stringBuilder ); // 文件內容
    }
  • 字節數組轉換成流
@Test
    public void bytesToStream(){
        byte [] data = new byte[1024]; // 來源于其他數據源

        ByteArrayInputStream inputStream = new ByteArrayInputStream(data);

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        int v;
        while ( (v=inputStream.read())!=-1 ){
            outputStream.write(v);
        }

        System.out.println( Arrays.toString( outputStream.toByteArray() ));
    }
  • 對象序列化與反序列化
@Test
    public void objectToFile() throws IOException {

        Person person = new Person();
        person.setName("張三").setAge(25);

        String root = FileTests.class.getResource("/").getPath();

        FileOutputStream fos = new FileOutputStream(new File(root,"/person"));
        ObjectOutputStream oos = new ObjectOutputStream(fos);

        oos.writeObject(person);
    }

    @Test
    public void fileToObject() throws IOException, ClassNotFoundException {
        String root = FileTests.class.getResource("/").getPath();

        FileInputStream fis = new FileInputStream(new File(root,"/person"));
        ObjectInputStream ois = new ObjectInputStream(fis);

        Person person = (Person) ois.readObject();
        System.out.println( person );
    }
  • 流的轉換 將字節流轉換成字符流來操作,同樣以文件復制為例
@Test
    public void copyByBuffer() throws IOException {
        String root = FileTests.class.getResource("/").getPath();

        FileInputStream fis = new FileInputStream(new File(root,"/start.bat"));
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader br = new BufferedReader(isr);

        FileOutputStream fos = new FileOutputStream(root+"/out3.bat");
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        BufferedWriter bw = new BufferedWriter(osw);

        String line;
        while ( (line = br.readLine())!=null ){
            bw.append(line);
            bw.newLine();
            bw.flush();
        }

        // close
    }

關于流的操作非常多,像包括網絡通信中、音視頻文件處理、流合并等等

Guava中的IO

關于IO的內容并不復雜,上面的那些例子在很多工具庫中基本都會提供對應的API方便開發者調用,今天主要看下Guava IO模塊針對流的操作提供了什么樣的 封裝

Files

提供對文件快捷讀寫方法 其中主要提供了ByteSource、ByteSink、CharSource、CharSink 4個類,分別對應按字節的讀寫與按字符的讀寫,

/**
     * 文件復制
     */
    @Test
    public void copy() throws IOException {
        File from = new File(root,"from");
        File to = new File(root,"to");
        Files.copy(from,to);
    }

    /**
     * 文件移動
     */
    @Test
    public void move() throws IOException {
        File from = new File(root,"from");
        File to = new File(root,"to");
        Files.move(from,to);
    }

    /**
     * 按行讀取文件
     * @throws IOException
     */
    @Test
    public void readLines() throws IOException {
        File dest = new File(root,"start.bat");
        List< String > lines = Files.readLines(dest, Charset.defaultCharset());
        lines.forEach(System.out::println);
    }

    /**
     * 寫入文件
     * @throws IOException
     */
    @Test
    public void writeToFile() throws IOException {
        File dest = new File(root,"demo.txt");
        Files.write("hello world!".getBytes(Charset.defaultCharset()), dest);
    }

    /**
     * 修改文件更新時間
     * @throws IOException
     */
    @Test
    public void touch() throws IOException {
        File dest = new File(root,"demo.txt");
        Files.touch(dest);
    }

    /**
     * 文件的零拷貝
     * @throws IOException
     */
    @Test
    public void map() throws IOException, URISyntaxException {
        File from = new File(root,"from");
        File to = new File(root,"to");
        Files.touch(to);
        
        MappedByteBuffer fromBuff = Files.map(from, MapMode.READ_ONLY, 1024);
        // = >
        FileChannel channel = FileChannel.open(Paths.get(to.toURI()), StandardOpenOption.WRITE);

        channel.write(fromBuff);

        channel.close();
    }

    /**
     * 讀文件為字節數組
     * @throws IOException
     */
    @Test
    public void fileAndBytes() throws IOException {
        File dest = new File(root,"start.bat");
        ByteSource byteSource = Files.asByteSource(dest);
        byte[] bytes = byteSource.read();
        System.out.println( bytes );

        // 字節寫入文件,實現復制
        File target = new File(root, "start2.bat");
        ByteSink byteSink = Files.asByteSink(target);
        byteSink.write(bytes);
    }

    @Test
    public void wrapper(){
        File dest = new File(root,"start.bat");
        // 作為字節讀
        Files.asByteSource(dest);
        // 作為字節寫
        Files.asByteSink(dest);

        // 作為字符讀
        Files.asCharSource(dest, Charset.defaultCharset());
        // 作為字符寫
        Files.asCharSink(dest, Charset.defaultCharset());
    }

其他

管道流

PipedOutputStream PipedInputStream 實現多線程間的數據通信;類似生產消費者模式

@Test
    public void pipe() throws IOException {
        PipedOutputStream pipedOutputStream = new PipedOutputStream();
        PipedInputStream pipedInputStream = new PipedInputStream();
        pipedOutputStream.connect(pipedInputStream);

        new Thread(()- >{
            while (true){
                String date = new Date().toString();
                try {
                    pipedOutputStream.write( date.getBytes(StandardCharsets.UTF_8) );
                    pipedOutputStream.flush();
                    TimeUnit.SECONDS.sleep(2);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }).start();
        
        new Thread(()- >{
            while (true){
                byte [] buff = new byte[1024];
                try {
                    int read = pipedInputStream.read(buff);
                    TimeUnit.SECONDS.sleep(4);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println( new String(buff) );
            }
        }).start();
    }

結束語

在任何編程語言中,數據的IO都是比較常見并相當重要的。Guava作為工具型類庫,主要是幫助開發者封裝常用、重復的操作,開放出簡介的API,不僅能讓讓代碼更加整潔, 同時對開發出穩健程序也是比不可少的。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • IO
    IO
    +關注

    關注

    0

    文章

    473

    瀏覽量

    39654
  • 數據傳輸
    +關注

    關注

    9

    文章

    1974

    瀏覽量

    65028
  • 硬盤
    +關注

    關注

    3

    文章

    1328

    瀏覽量

    57684
  • JAVA
    +關注

    關注

    19

    文章

    2980

    瀏覽量

    105673
  • 工具包
    +關注

    關注

    0

    文章

    47

    瀏覽量

    9599
收藏 人收藏

    評論

    相關推薦

    Java基礎的 IO

    java ,程序通常會和其他外部設備進行數據交互,比如寫入磁盤,網絡發送數據等等,今天我們來學學 java 基礎的 IO
    的頭像 發表于 10-10 16:16 ?1884次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>基礎的 <b class='flag-5'>IO</b> <b class='flag-5'>流</b>

    Java的輸入輸出盤點

    Java分為兩種,一種是字節流,另一種是字符,分別由四個抽象類來表示(每種包括輸入和輸出兩種所以一共四個):InputStream
    發表于 07-11 07:56

    Java NIO編程理論基礎之Java IO及linux網絡IO模型發展

    Java NIO編程理論基礎篇——Java IO的發展以及linux網絡IO模型
    發表于 07-18 12:40

    淺析javaIO模型

    java IO初識與Linux網絡IO模型簡介
    發表于 08-05 06:28

    Java 那些最常用的工具類庫

    緩存通常用redis的hash,如下:# 設置用戶信息hset student name testhset student age 10這種場景下map和bean的互相轉換的工具類就特別
    發表于 06-15 17:18

    javaIO和單片機的IO口整體對比

    作為從本科學單片機出身筆者,對IO口獨有情鐘,這里對javaIO和單片機的IO口整體對比一
    發表于 01-18 08:28

    java與文件實驗

    實驗10 與文件一、實驗目的 1. 理解數據的概念2. 理解Java的層次結構3. 理解文件的概念二、實驗要求 1. 掌握字節流
    發表于 09-23 19:04 ?1949次閱讀

    javaio分析

    一、的概念 (stream)的概念源于UNIX管道(pipe)的概念。在UNIX,管道是一條不間斷的字節流,用來實現程序或進程間的通信,或讀寫外圍設備、外部文件等。 一個
    發表于 09-27 14:51 ?0次下載
    <b class='flag-5'>java</b><b class='flag-5'>中</b>的<b class='flag-5'>io</b><b class='flag-5'>流</b>分析

    關于javaio知識總結詳解

    一、Java io的開始:文件 1. 我們主要講的是,的本質也是對文件的處理,我們循序漸進一步一步從文件將到流去。 2. java 處理
    發表于 09-28 13:20 ?0次下載

    理解Java字符與字節流的區別

    JDK稱為Java開發包或Java開發工具,是一個編寫Java的Applet小程序和應用程序的程序開發環境。JDK是整個Java的核心,包括
    發表于 12-04 10:39 ?1138次閱讀
    理解<b class='flag-5'>Java</b><b class='flag-5'>中</b>字符<b class='flag-5'>流</b>與字節流的區別

    基礎:Java IO學習總結

    IO的分類 根據處理數據類型的不同分為:字符和字節流 根據數據流向不同分為:輸入流和輸出
    發表于 03-08 14:38 ?2119次閱讀

    java數組的三種定義方式_java數組的定義及使用方法(推薦)

    java,數組是一種很常用的工具,本文將介紹來java數組的三種定義方式以及java
    發表于 01-29 09:53 ?3.3w次閱讀

    Guava Collect常見的集合類

    Guava工具的一個子模塊,主要對jdk的集合操作添加了一些簡易的API,同時也是對Collections工具類的擴展。當然
    的頭像 發表于 10-08 11:35 ?572次閱讀

    java的字符分析

    上次聊到了 java 的 字符 Reader ,今天來看看它的好朋友 Writer 字符。 Writer java
    的頭像 發表于 10-10 15:38 ?628次閱讀

    Guava這些Map的操作,讓我的代碼量減少了50%

    Guava是google公司開發的一款Java類庫擴展工具包,內含了豐富的API,涵蓋了集合、緩存、并發、I/O等多個方面。
    的頭像 發表于 10-20 11:30 ?474次閱讀
    <b class='flag-5'>Guava</b><b class='flag-5'>中</b>這些Map的操作,讓我的代碼量減少了50%
    主站蜘蛛池模板: 嫩交18xxxx| 黑丝女仆恋上我 | 久久91精品国产91久 | 亚洲深夜在线 | 95国产精品人妻无码久 | 日韩av片无码一区二区不卡电影 | 69精品国产人妻蜜桃国产毛片 | qovd伦理| 美女张开腿让我了一夜 | 俄罗斯雏妓的BBB孩交 | 国产 亚洲 另类 欧美 在线 | 欧美阿v在线免播播放 | 亚洲AV综合99一二三四区 | 国产在线播放KKK | 麻豆精品传媒2021网站入口 | 久久99热这里只有精品66 | 快播电影网站大全 | 最近2019中文字幕免费 | 久久婷婷五月综合色丁香 | bl肉yin荡受np各种play | 高清午夜福利电影在线 | 国产二级一片内射视频播放 | 无敌在线视频观看免费 | 狠狠色综合久久婷婷 | 亚洲中文字幕永久在线 | 久久99精品视频 | 2019午夜75福利不卡片在线 | 美娇妻的性奴史1一4 | 国产揄拍国产精品 | 18黄女脱内衣 | 99热这里只有是精品 | 校草让我脱了内裤给全班看 | 精品国产乱码久久久人妻 | 97在线观看免费 | 国产精品久人妻精品 | 粗暴玩烂货调教 | 久久re这里视频精品15 | 国产成人精品男人的天堂网站 | 伊人色啪啪天天综合婷婷 | 久久久青青 | 张开腿我尝尝你的草莓 |