javaIO流

IO流这个就是内存与硬盘之间的读写关系,
当你把这个学会了之后 就可以实现文件 或者是 目录(就是文件夹)的复制了,当然也可以用代码来加密一些文档、日志、对文档的修改,当然这些读取不一定都是文档,如果你读取的图片,但是这些东西底层都是二进制,所有你读取的东西就可能是一堆乱码
具体的一些知识如下所示:
======在写入字符/字节之后必须要刷新 即flush()
字节用byte数组 字符用char数组
流的分类
按流的方向
向内存中去,输入流 ,就是读
从内存中出来,输出流,就是写
读取数据方式不同
按字节读取 一次一个字节 什么都能读取
按字符读取的 一次读取一个字符 只能读txt普通文件
就是:输入流、输出流、字节流、字符流
所有流都在java.io.*;
java.io.InputStream //字节输入流
java.io.OutputStream//字节输出流

java.io .Reader//字符输入流
java.io.Writer//字符输出流

都是抽象类
stream结尾是字节流 Reader/Writer 字符流
所有流实现之后
java.io.Closeable接口 都有close()方法 来关闭流 流毕竟是一个管道 是内存和硬盘的通道
所有输出流实现之后
java.io.Flushable接口 都是可刷新的 都有Flush() 输出流在最终输出之后 一定记得flush()方法 如果没有flush 可能会丢失数据
需要掌握的流
文件专属
java.io.FileInputStream //万能 必须掌握
java.io.FileOutputStream//万能必须掌握
java.io.FileReader //只能是普通文本
java.io.FileWriter //只能是普通文本 //上面这四个就是两个类 除了处理方面不同用的数组不同 其他都差不多
转换流(将字节流转换为字符流)
java.io.InputStreamReader
java.io.OutputStreamWriter
缓冲流专属
java.io.BufferedReader
java.io.BufferedWrider
java.io.BufferedInputStream
java.io.BUfferedOutputStream
数据流专属
java.io.DataInputStream
java.io.DataOutputStream
标准输出流
java.io.PtintWriter
java.io.PrintStream ***掌握
对象专属流
java.io.ObjectInputStream
掌握
java.io.ObjectOutputStream
掌握
IDEA默认路径 工程Project地根目录 我的默认路径存在“C:\Users\爱的双重魔力\IdeaProjects\untitled”
可以用到的其他的知识点
String s=“我是一个帅哥”;
byte[] by=s.getBytes();//可以把字符串转换为byte数组

java.io.FileInputStream //读取的都是字节 字节字节
read()读取数据
available() 剩余没有读取的字节或就是可以算出总字节数
skip(数字a)//表示读取时跳过a个字节
read(byte[] b)
一次最多读取b.length字节 减少内存有硬盘的交互 提高执行效率
byte[] b=new byte[3]; //数组空间为3
int du=file1.read(b); //这个表示读取字节的个数
************* 如果再用改byte数组读取一次 就会覆盖之情读取的数据,例如:
*******
************* 文本数据有abcd 那么byte第一次读取的数据就是 abc***********
************* 再用该数组读取一次 数组内就变成了 dbc***********
如果想知道数组每次新读取的数据 可以转换为字符串读取 利用 字符串的方法 可以固定选取位置读取
****java.io.FileOutputStream
flush()刷新 每次写入之后 必须要刷新
file01.new(FileOutputStream(“文件名路径”);//(如果该路径之下没有这个文件 则会自动创建 ) ,这个方式会先把文件清空在写入“谨慎使用”
file01.new(FileOutputStream(“文件名路径”,true);//(如果该路径之下没有这个文件 则会自动创建 ),在里面加一个true会在文件后面追加
file01.write(byte数组) //把数组内的东西全部读入
file01.write(byte数组,起始位置,结束位置)//会把数组指定的部分加入文件
***—FileInputStream和FileOutputStream配合可以复制粘贴文件----
这个过程时变复制变粘贴的 复制粘贴时同时进行的
代码会写在IDEA中

java.io.FileReader和java.io.FileWriter
基本和上面一样
部分代码写在IDEA中

*******----------BufferedReader //子类FileReader //IDEA有实现代码
不需要在建立数组,
自带缓冲 方法 readLine()读取一行文本 返回字符串 如果读完最后一行的时候 在读会返回null
*****这个方法不会读取换行
因为这个流是抽象类 所以应该建立子类对象 把子类对象传给这个流
子类称“节点流” 抽象类是“包装流/处理流”
FileReader reader=new FileReader(“C:\Users\爱的双重魔力\Desktop\桌面背景\1号.jpg”);
BufferedReader buff=new BufferedReader(reader);

再关闭流的时候 只需要关闭buff.close()  虽然开启两个流 但是你在关闭buff流的时候 会自动关闭他使用的子类的流 

InputStreamReader
将字节转换为字符
如:InputStreamReader re=new InputStreamReader(字节流);


java.io.DataInputStream
可以将数据连同数据的类型一起写入文件 且该文件不能被记事本打开
java.io.DataOutputStream
在读的时候 要与写入的时候顺序一样
例:写入的时候 是 float f=2.0;
int i=10;
字节流对象名.writeFloat(f);
字节流对象名.writeInt(i);
读的时候 是 float fl=字节流对象.readFloat();
int in=字节流对象名.readInt();
java.io.PrintStream 这个不需要手动关闭close()
System.out.println(“Hello World”); //不分开写
//下面是分开写的
PrintStream ps=System.out;
ps.println(“HELLO WORLD”);

复制文件夹/目录 在IDEA中

序列化 Serialize 将java对象保存下来的过程 ObjectOutputStream
反序列化 DeSerialize 将硬盘的数据重新恢复到内存 ObjectInputStream
参与序列化和反序列化的对象· 必须实现Serializable接口
通过源代码发现 Serialzable接口 只是标志性接口 什么方法也没有
这个接口只是标志性作用 这样java虚拟机看到后 会有特殊的编译方法
java虚拟机看到接口后 会自动生成序列化版本号
transient 把这个加在变量前面 就不会序列化
java在调用类的时候 是先根据名字来区分的 如果名字一样的话 就通过序列化版本号来确定 所有java源代码中的那些类 所用的序列化版本号
都是固定的 没有改变的 这样后续代码如String 重新加入一些方法时 在进行使用时 也不会报错了
如果一个类先序列化 在给类添加一些变量 这样在反序列化就会异常 因为这样会自动生成两个序列版本号
所有 将序列化版本号 改为自己定义
private static final long serialVersionUID = -6849794470754667710L //这个就是自己固定的序列化版本号抒写格式 等号后面的数字字母组合不能重复 (其实乱打一下 也不会重复)


Properties(Map)集合和IO流(此处使用的是FileReader)
FileReader filess=new FileReader(“file”);
Properties pro=new Properties(); //这个是Map集合中的
pro.load(filess);//这个就是调用properties对象的load方法把文件中的数据 存到Map集合中
//等号左右分别存入key 和 value
System.out.println(pro.getProperty(“user”)); //通过key 来获取value的数据
System.out.println(pro.getProperty(“key” ));
就算文件方式改变 编译的时候会自动读取改变

Java属性文件就是配置文件。其中以键值对的形式存放信息。注意,每个键值对结尾没有分号
属文件内存的数据如: 编写属性文件xxx.properties 后缀名最好改为properties
driverClass=com.mysql.jdbc.Driver
url=jdbc:myql:///jdbctest
username=root
password=123456

下面是一些代码测试等等,可以看一下:

package IO;


import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;

public class log日志 {
    public static void zlog(String str){
        try {
            FileOutputStream  file=new FileOutputStream("log.txt",true);//指定输出文件,这个文件当然可以填一下绝对路径
            PrintStream out=new PrintStream(file);
            System.setOut(out);//改变输出方向  到指定文件
            Date time=new Date();
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss SSS");
            String strtime=sdf.format(time);
            System.out.println(strtime+"  "+str);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}
class  使用{  //这个类是对上面代码的使用
    public static void main(String[] args) {
        log日志.zlog("第一个日志小程序代码");
        log日志.zlog("感觉很好玩");
    }
}

下面是文件夹的复制//复制的代码可以有多种写法

package IO;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class nzmxnmnjkxnknasjkxnkj {


        public static void main(String[] args) throws IOException {
            copyDir("D:\\微信文件","C:\\Users\\爱的双重魔力\\Desktop");
            System.out.println("复制完成!");
        }
        /**
         * 复制目录
         * @param fromDir
         * @param toDir
         * @throws IOException
         */
        public static void copyDir(String fromDir,String toDir) throws IOException{
            //创建目录的File对象
            File dirSouce = new File(fromDir);
            //判断源目录是不是一个目录
            if (!dirSouce.isDirectory()) {
                //如果不是目录那就不复制
                return;
            }
            //创建目标目录的File对象
            File destDir = new File(toDir);
            //如果目的目录不存在
            if(!destDir.exists()){
                //创建目的目录
                destDir.mkdir();
            }
            //获取源目录下的File对象列表
            File[] files = dirSouce.listFiles();
            for (File file : files) {
                //拼接新的fromDir(fromFile)和toDir(toFile)的路径
                String strFrom = file.getAbsolutePath();
                System.out.println(strFrom);
                String strTo = toDir + File.separator + file.getName();
                System.out.println(strTo);
                //判断File对象是目录还是文件
                //判断是否是目录
                if (file.isDirectory()) {
                    //递归调用复制目录的方法
                    copyDir(strFrom,strTo);
                }
                //判断是否是文件
                if (file.isFile()) {
                    System.out.println("正在复制文件:"+file.getName());
                    //递归调用复制文件的方法
                    copyFile(strFrom,strTo);
                }
            }
        }
        /**
         * 复制文件
         * @param fromFile
         * @param toFile
         * @throws IOException
         */
        public static void copyFile(String fromFile,String toFile) throws IOException{
            //字节输入流——读取文件
            FileInputStream in = new FileInputStream(fromFile);
            //字节输出流——写入文件
            FileOutputStream out = new FileOutputStream(toFile);
            //把读取到的内容写入新文件
            //把字节数组设置大一些   1*1024*1024=1M
            byte[] bs = new byte[1*1024*1024];
            int count = 0;
            while((count = in.read(bs))!=-1){
                out.write(bs,0,count);
            }
            //关闭流
            in.close();
            out.flush();
            out.close();
        }
    }



下面的是序列化的代码,就是在原来类中

package IO;

import java.io.*;

public class xvliehua {
    public static void main(String[] args) throws Exception{
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("C:\\Users\\爱的双重魔力\\Desktop\\桌面背景\\fil"));
        student st=new student();
        st.setName("zahngsan");
        st.setNo(25);
        student st1=new student();
        st1.setName("lisi");
        st1.setNo(456);
        oos.writeObject(st);
        oos.writeObject(st1);
        oos.flush();
        oos.close();
    }
}
class student implements Serializable {
    int no;
    String name;
    int m;
    int a;
    int c;
    private static final long serialVersionUID = -121561;

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
``
下面是反序列化的代码
package IO;

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class fanxvlihua {
    public static void main(String[] args) throws Exception {
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("C:\\Users\\爱的双重魔力\\Desktop\\桌面背景\\fil"));
        Object ob=ois.readObject();
        System.out.println(ob.toString());
        Object ob1=ois.readObject();
        System.out.println(ob1.toString());
        ois.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值