首页 > 其他分享 >io流之字节流【基础流】

io流之字节流【基础流】

时间:2022-12-10 09:23:28浏览次数:36  
标签:java 字节 流之 Lucky System FileOutputStream io com

①字节输入流:读取文件中的数据

package com.Lucky.io.byteStream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/*
   字节输入流:  FileInputStream【读取文件中的数据】
         细节:
                 创建阶段: 文件不存在,就直接报错【文件都不存在,我读取啥???】
                 读取阶段: 一次读取一个字节,到了最后return 返回-1
                         {
                           空格也是数据:空格在ASCII编码中的数字是32
                           如果数据中有-1,那么会将-先进行读取,再对1进行读取操作
                          }
                 关闭阶段:每次都要关闭资源

     步骤:1.创建2.读取3.关闭

 */
public class fileinputstream {
    public static void main(String[] args) throws IOException {

        System.out.println("----------初级写法:太麻烦---------");
        FileInputStream inputStream=
                new FileInputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\testNext.txt");

        inputStream.read();  //Y              每次读取的只有一个【默认返回的是根据ASCII编码转换大的数字】
        System.out.print((char) inputStream.read());//Y   可以强行转换成char类型数据
        System.out.print((char) inputStream.read());//D   可以强行转换成char类型数据
        System.out.print((char) inputStream.read());//S   可以强行转换成char类型数据
        System.out.print((char) inputStream.read());//N   可以强行转换成char类型数据
        System.out.print((char) inputStream.read());//B   可以强行转换成char类型数据
        System.out.print((char) inputStream.read());//空格   可以强行转换成char类型数据
        System.out.print((char) inputStream.read());//-     可以强行转换成char类型数据
        System.out.println((char) inputStream.read());//1     可以强行转换成char类型数据
        System.out.print("结尾了"+inputStream.read());//-1     结尾了,返回-1

        inputStream.close();

        System.out.println();
        System.out.println("----------中级写法:循环遍历读取数据---------");
        FileInputStream inputStream1=
                new FileInputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\testNext.txt");

        //定义一个遍历储存read的每一个值
        int val;
        //遍历条件【不是结尾】
        while ((val=inputStream1.read())!=-1){
            System.out.println((char) val);  //转换成char类型数据并且输出到控制台
        }


        //关闭资源
        inputStream1.close();
    }
}

  

②字节输出流:将数据写出到文件中

package com.Lucky.io.byteStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*
       io:  1.按照流的方式分类  --》  【输入流and输出流】
            2.按照操作文件分类  --》  【字节流and字符流】
            注意点:{
                        字节流可以操作所有类型的文件
                        字符流只能操作纯文本文件【用window自带的记事本打开能正常阅读的就是,例如:md/txt】
            }
 */

/**
 * 字节输出流的小细节:
 *         创建阶段:
 *                 1.FileOutputStream的参数可以是文件路径,也可以是File对象
 *                 2.如果不存在指定的文件,会自动创建该文件并且写出数据【前提是:父级路径要真实存在】
 *                 3.如果指定文件已经存在,进行写出操作时,会将原本文件的数据删除
 *        写数据阶段:
 *                 1.write方法的参数是整数,该整数会根据ASCII上对应的字符进行输出并写入到file文件
 *       释放资源阶段:
 *                 1.每次使用完都要关闭资源。
 */
public class fileoutputstream {
    public static void main(String[] args) throws IOException {
        System.out.println("---------基础部分--------------");
          //创建文件输出流
        java.io.FileOutputStream fileOutput=new java.io.FileOutputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\test.txt");

          //写出操作
        fileOutput.write(97);   //一个参数:可以整数
           byte[] bytes={97,98,99,100,101,102,103};
        fileOutput.write(bytes);   //一个参数:也可以是数组
        fileOutput.write(bytes,1,3);   //三个参数:①数组②开始输出索引③输出字节的数量

        //释放资源
        fileOutput.close();


        System.out.println("---------进阶部分【换行写】--------------");
        java.io.FileOutputStream fileOutput1=new java.io.FileOutputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\testDemo.txt");

        String str="WYRSYYDS";
        byte[] bytes1 = str.getBytes();
        //写出操作
        fileOutput1.write(bytes1);   //一个参数:数组

        //换行写【就是将在中间加上\r\n】
        String rn="\r\n";
        byte[] bytes2 = rn.getBytes();
        fileOutput1.write(bytes2);

        String str1="NB";
        byte[] bytes3 = str1.getBytes();
        //写出操作
        fileOutput1.write(bytes3);   //一个参数:数组
        fileOutput1.close();

        System.out.println("---------进阶部分【续写】--------------");
        /*
        续写: 在创建阶段时,添加的第二个参数就是开关【默认是false,可以手动开启】
         */
        java.io.FileOutputStream fileOutput2=new java.io.FileOutputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\testNext.txt",true);
//        String xu="YYDS";
//        byte[] bytes4 = xu.getBytes();
//        //写出操作
//        fileOutput2.write(bytes4);   //一个参数:数组

        String next="NB";
        byte[] bytes5 = next.getBytes();
        //写出操作
        fileOutput2.write(bytes5);   //一个参数:数组
        fileOutput2.close();

    }
}

 综合小练习:

package com.Lucky.io.byteStream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;

/*
    拷贝小文件  :边读边写

    要求:要求计算拷贝所消耗的时间【单位是毫秒】
 */
public class copyMinData {
    public static void main(String[] args) throws IOException {
        //创建
        FileInputStream input=new FileInputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\test.txt");   //读取对象
        FileOutputStream outout=new FileOutputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\copyminData.txt");  //输出对象

        long l1 = System.currentTimeMillis();

        //遍历
        int val;
        while ((val=input.read())!=-1){  //读取
              outout.write(val);         //输出到copy文件中
        }

        //关闭资源{先开后关}  --》可以保证数据读取完整
        outout.close();
        input.close();


        long l2 = System.currentTimeMillis();

        System.out.println(l2-l1);   //消耗的毫秒数

    }
}

  

package com.Lucky.io.byteStream;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;

/*
    拷贝大文件  :边读边写【一次读取多个字节】
 */
public class copyMaxData {
    public static void main(String[] args) throws IOException {
        //创建
        FileInputStream input=new FileInputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\test.txt");   //读取对象
        FileOutputStream outout=new FileOutputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\copymaxData.txt");  //输出对象

        //创建一次读取的字节数组
        byte[] arr=new byte[2];   //数组长度为2
        //byte[] arr=new byte[1024*1024*5];   //数组长度为5M

        //遍历
        int val;  //每一次遍历几个字节

        while ((val=input.read(arr))!=-1){  //读取
            //输出到copy文件中【参数1:要写的数据源;参数2:开始索引;参数3:个数】
            outout.write(arr,0,val);
        }

        //关闭资源{先开后关}  --》可以保证数据读取完整
        outout.close();
        input.close();




////////////////////////////////////////////////////////////////////////////
          //使用try catch
        /*
        FileInputStream inputTry=null;   //必须先赋值为null
        FileOutputStream outTry=null;
        try {
            //创建
            inputTry=new FileInputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\test.txt");   //读取对象
            outTry=new FileOutputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\copymaxData.txt");  //输出对象

            //创建一次读取的字节数组
            byte[] arrTry=new byte[5];   //数组长度为5

            //遍历
            int valTry;  //每一次遍历几个字节

            while ((valTry=inputTry.read(arrTry))!=-1){  //读取
                //输出到copy文件中【参数1:要写的数据源;参数2:开始索引;参数3:个数】
                outTry.write(arrTry,0,valTry);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭资源{先开后关}  --》可以保证数据读取完整
            //判断outTry对象是否是null
            if(outTry!=null){
                try {//因为close可能也存在异常
                    outTry.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            //判断inputTry对象是否是null
            if(outTry!=null){
                try {//因为close可能也存在异常
                    inputTry.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

*/
    }
}

  ★★★拓展:加密/解密

package com.Lucky.io.test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 加密与解密:   关键点:  ^
 *
 *   在对要加密的文件数据进行【^】异或操作就可以使得储存的数据发生改变
 *   当对要加密的文件数据进行解密时,只要再次使用【^】异或操作就可以
 */
public class mecryOrDecode {
    public static void main(String[] args) throws IOException {
        //加密
        FileInputStream inStr = new FileInputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\characterStream\\girl.jpg");
        FileOutputStream OutStr = new FileOutputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\characterStream\\encry.jpg");

        //解密
//        FileInputStream inStr = new FileInputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\characterStream\\encry.jpg");
//        FileOutputStream OutStr = new FileOutputStream("H:\\项目\\javaSE\\IO\\src\\com\\Lucky\\io\\characterStream\\redu.jpg");



        int val;
        while ((val=inStr.read())!=-1){
            OutStr.write(val ^ 20);
        }

        inStr.close();
        OutStr.close();
    }


}

  

 

标签:java,字节,流之,Lucky,System,FileOutputStream,io,com
From: https://www.cnblogs.com/Lucky-only/p/16970766.html

相关文章