zoukankan      html  css  js  c++  java
  • 使用字节流读写数据

    -------------siwuxie095

       

       

       

       

       

       

    工程名:TestRWByteStream

    包名:com.siwuxie095.bytestream

    类名:ReadByteStream.java、WriteByteStream.java、CopyByByteStream.java

       

       

    手动在工程上创建文件:

    在工程名:TestRWByteStream 上,右键->New->Untitled Text File,

    输入文本,保存路径选择 TestRWByteStream,命名为 text.txt

       

    text.txt 的内容如下:

       

       

       

       

    打开资源管理器,在工程 TestRWByteStream 文件夹下,放入一张

    GIF图片:cherry.gif

     

       

    工程结构目录如下:

       

       

       

       

       

    ReadByteStream.java:

       

    package com.siwuxie095.bytestream;

       

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.IOException;

       

    public class ReadByteStream {

       

     

    public static void main(String[] args) {

     

    //使用字节流读取文件

    //这里读取的是文本数据,所以后面的操作中使用的是文本方式

    //对当前读到的字节进行解码

    //如果操作的是别的类型的文件,如:MP3,影片等,

    //后续需要对读取到的字节使用另外的方式进行解码

     

    try {

     

    //创建一个文件输入流 FileInputStream 传入String型参数:text.txt

    //(一般由 Stream 结尾是字节流)

    //有异常抛出,用 try catch 捕获:Surround with try/catch

    FileInputStream fis=new FileInputStream("text.txt");

     

     

    //使用 FileInputStreamread()方法读取数据,需要传入一个byte型数组参数

    //根据字节数组的大小从文件中读取相应数量的数据放入到数组中

    //要读取到字节数组中首先要创建一个字节数组,指定的字节数组的长度不能超过文件的大小

    //执行读取操作 fis.read() 时会有异常抛出,

    //添加到try catch语句中:Add catch clause to surrounding try

    byte input[]=new byte[20];

    fis.read(input);

     

     

     

    //将数组读取到input数组中后,由于知道读取的目标是一个文本文档

    //可以把当前读取到的数据转换成字符串

    //

    //创建一个String对象,传入数组input,此时数组长度为20

    //1)打印发现出现问号,这是因为在读取时,假如每一个汉字占两个字节,

    //如果当前读取到汉字的第一个字节就结束的话,数据就被损坏了

    //2)此时将数组的长度改为22,就正常显示了

    //

    //这里并没有出现乱码的问题,因为在系统的默认情况下,Java会以当前系统的默认字符集作为解码方式

    //由于默认字符集就是 UTF-8,和写入文件 text.txt 时使用的字符集相同,所以没有乱码

    //

    //如果只传入数组input的同时,手动指定字符集,如果指定错误就会乱码

    //3)当前文本 text.txt UTF-8,如果强制当前String使用GBK方式来解码,输出就会乱码

    //String inputString=new String(input,"GBK");

    String inputString=new String(input,"UTF-8");

    System.out.println(inputString);

     

     

    //当输入输出流操作完毕后,要将流关闭

    fis.close();

     

     

    //流的打开(new)、流的读取/写入、流的关闭

    //才是一个完整的流的操作过程

     

    } catch (FileNotFoundException e) {

    //FileInputStream catch

    e.printStackTrace();

    } catch (IOException e) {

    //fis.read() fis.close() catch

    e.printStackTrace();

    }

    }

       

    }

       

       

    运行一览:

       

    1)当数组长度为 20 时:

       

       

    2)当数组长度为 22 时:

       

       

    3)当指定编码为 GBK 时:

       

       

       

       

       

       

    WriteByteStream.java:

       

    package com.siwuxie095.bytestream;

       

    import java.io.FileNotFoundException;

    import java.io.FileOutputStream;

    import java.io.IOException;

       

    public class WriteByteStream {

       

    public static void main(String[] args) {

     

    //使用字节流写入文件

     

    try {

     

    //创建一个文件输出流 FileOutputStream 实例

    //传入字符串,为当前的文件输出流指定文件

    //有异常抛出,使用 try catch语句捕获:Surround with try/catch

    FileOutputStream fos=new FileOutputStream("textx.txt");

     

     

    //使用 FileOutputStream write() 方法写出数据

    //这里选择写出字节数组的方法,需要有一个字节数组作参数

    //因为要写出的数据是文本数据,先创建一个String

    String outString="write:123456写出数据";

     

     

    //可以直接从当前的String对象中获取它的字节数组

    //同时可以使用字符串指定字符编码

    byte output[]=outString.getBytes();

     

     

    //在这里由于写出的是文本文件,所以在写出数组之前,是将String获取为字节数组

    //如果需要写出别的类型的数据,如:音乐、电影、图片等,需要使用对应的方法将

    //那些数据同样转换为字节型的数组,然后再进行写出

     

     

     

    //传入output,同时有异常抛出,使用 try catch包围

    //Add catch clause to surrounding try

    fos.write(output);

     

     

    //当输入输出流操作完毕后,要将流关闭

    fos.close();

     

    //流的打开(new)、流的读取/写入、流的关闭

    //才是一个完整的流的操作过程

     

    } catch (FileNotFoundException e) {

    //FileOutputStream catch

    e.printStackTrace();

    } catch (IOException e) {

    //fos.write() fos.close() catch

    e.printStackTrace();

    }

    }

       

    }

       

       

    运行后,工程结构目录一览:

       

       

       

    textx.txt 的内容:

       

       

       

       

       

       

    CopyByByteStream.java:

       

    package com.siwuxie095.bytestream;

       

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.FileOutputStream;

    import java.io.IOException;

       

    public class CopyByByteStream {

       

    /**

    * 文件的拷贝:

    *

    * 字节流能将文件的数据读取到本地的字节数组当中,

    * 而且字节流也能将本地的字节数组写入到文件当中,

    *

    * 如果将这个字节数组作为中间的链接,同时使用输入流和输出流,

    * 就可以实现文件的拷贝

    *

    * @param args

    */

    public static void main(String[] args) {

     

    //通过字节的输入流和输出流,实现文件读取、文件写入、文件拷贝

     

    try {

     

    //会有异常抛出,选中下面一段代码,右键->Surround With->Try/catch Block

    //创建一个文件输入流,读取文件数据

    //(这里是一张樱花飘落的GIF:28 KB--29256 byte)

    FileInputStream fis=new FileInputStream("cherry.gif");

    //再创建一个文件输出流,作为文件的拷贝对象

    FileOutputStream fos=new FileOutputStream("cherry_new.gif");

     

     

    //文件输入流直接将数据读取到一个字节型数组:input数组中,直接将该数组写出到新的文件

     

     

    //FileInputStream read() 方法可以将文件数据读取到一个字节型的数组当中

    //先创建一个字节型的数组,并指定大小为50

    byte input[]=new byte[50];

     

     

    //但当前的文件是 28 KB50个字节只能读取一小部分,远远不够

    //需要循环将文件里的数据读取并写入到新的文件中

    //FileInputStream read() 方法,返回一个int型值,

    //这个int值代表从文件读取到数组中的数据长度,如果返回-1

    //则说明文件中已经没有数据了,即读取到文件末尾了

    //有异常抛出:Add catch clause to surrounding try

    while (fis.read(input)!=-1) {

    //读取到数组中后,再写入到新的文件中

    fos.write(input);

    }

     

     

    //写出之后,关闭流

    fis.close();

    fos.close();

    System.out.println("done");

     

    } catch (FileNotFoundException e) {

    //FileInputStream FileOutputStream catch

    e.printStackTrace();

    } catch (IOException e) {

    //fis.read() fos.write() fis.close() fos.close() catch

    e.printStackTrace();

    }

     

    }

       

    }

       

       

    运行一览:

       

       

       

    运行后,工程结构目录一览:

       

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    kali linux 2019.1 替换burpsuite pro 1.7.37
    java反序列化漏洞实战
    我是一个997程序员
    清晨小悟
    vue webpack配置Error
    USSD 杂记
    WingMoney APP逆向,实现自动话费充值
    保持空杯心态
    解决python在命令行中运行时导入包失败,出现错误信息 "ModuleNotFoundError: No module named ***"
    【转】Mac find 去除 “Permission denied” 信息的方法
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6618838.html
Copyright © 2011-2022 走看看