I/O流

Input:从硬盘到内存
output: 从内存到硬盘

分为字节、字符流
InputStream OutStream是字节流
Reader Writer人能去读,能去写,是字符

Java.io.OutputStream是一切输出流的父类(一个抽象类)
共性的方法,都可以使用
主要用子类

需要注意的点是,无论是字节输出,还是字符输出,读进来的都是int 类型

1.输出流(从程序中往硬盘中读)

package todaty.IO;

import java.io.FileOutputStream;
import java.io.IOException;

public class OutputStream {
     
    /*
    OutputStream是所有输出流的超类,作为一个超类
    抽象超类,不太多,主要用子类
     主要定义了一些,共性的成员方法
     public void close()关闭输出流,并释放系统资源
     public void flush()刷新输出流,并强制任何缓冲的输出字节被写出
     public void write(byte[] b) 将b.length字节从指定字节数组,写入此字节流
     public void write(byte [] b,int off,int len)从指定字节数组写入len字节,从偏移量off开始,输出到此输出流
     public abstract void write(int b):将指定字节输出流
     */
    /*
    工作核心是java.io.FileOutputStream这是OutputStream的子类
    构造方法FileOutStream(String name)//String name是目的地的名称,(就是路径)
            FileOutputStream(File file)直接往文件中去写

            构造方法可以根据文件或者路径创造一个空的文件
            然后让对象指向创建好的文件

            方法1:创建对象,构造方法里传入目的
            2.调用write方法写入数据
            3.释放资源,节约内存,使用完毕,清空内存

     */
    public static void main(String[] args) throws IOException {
     
        FileOutputStream fos = new FileOutputStream("D:\\经典\\新建文件夹 (2)\\b.txt");//方法可能会有异常
        fos.write(99);//效率太差,一次只能传一个字节

        //这个方法抛出的异常都是IO异常的子类,抛出父类异常一个就可以了

        /*
        public void write(byte[] b) 将b.length字节从指定字节数组,写入此字节流
     public void write(byte [] b,int off,int len)从指定字节数组写入len字节,从偏移量off开始,输出到此输出流
     可以创建更多流
     1.如果第一个字节是正数,显示的时候会查询,ACSII吗表
     2.如果第一个字节是负数,显示的时候会查询,默认码表(中文默认码)
         */
        byte[] bytes = {
     55, 38, 57, 56, 33};//这样查的就是ASCII码表,是英文
        byte[] bytes1 = {
     -51, 55, -55, 83, 55};//两个字节形成一个字,这里开头是-55的,会和后面一位,形成中文汉字
        fos.write(bytes1);//如果后面有单独整数的话,这个整数还是按ASCII来处理
        /*
        public void write(byte [] b,int off,int len)从指定字节数组写入len字节,从偏移量off开始,输出到此输出流
        off是索引数组的下标,len是索引长度
        字符串可以用getbytes()方法,转化为字节数组,再用字节流去给输出

         */

        byte [] bytes2 = "你好".getBytes();
        fos.close();//别忘了省资源


    }
}

/*
追加写,续写
FileOutputStream(String name ,boolean append)方法的重载,可以让方法追加到上次写的后面后面为true会继续
在上次文件的末尾,追加写数据
False情况下,创建新文件,覆盖原来的文件
 */
public class Demo02OutputStream {
     
byte[] bytes1 = {
     65,66,67,68};
        FileOutputStream fos = new FileOutputStream("D:\\王泽林\\扫雷\\a.txt");
        fos.write(bytes1,0,3);
        fos.close();//有异常就try或者throws

        FileOutputStream fos1 = new FileOutputStream("D:\\王泽林\\扫雷\\a.txt",true);
        //追加写开关,进行追加写操作,
        fos1.write(88);
        fos1.write("\r\n".getBytes());//加入换行符号,字节输出流,需要把字符串变成字节
}

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

/*
java.io.FileInputStream类是所有字节输出流的超类
 */
public class InputStream {
     
    /*
    FileinputStream(String name)读取文件的路径
    指定路径之后,对象指向路径
    使用1.创建对象
    2.int read()读取一个字节,每次,读取到末尾会返回-1;
    3.使用之后要释放资源
     */
    public static void main(String[] args) throws IOException {
     
        FileInputStream fis = new FileInputStream("D:\\sql工具\\a\\txt");
        int len = fis.read();
        while(len != -1){
     
            System.out.println(len);      //循环读读到文件结尾为止
            //最后不要忘记优化



        }
        /*
        一次性读取多个字节
        int read(byte [] b)
        Stringl类的构造方法String(bytes[] bytes)将字节数组转化为字符串
         */
        byte[] bytes1 = new byte[2];//数组长度一般定义为1024的倍数1kb
        System.out.println(new String(bytes1));

        fis.read(bytes1);//输入流中放一个字节数组,是为了,将数据读进这个字节数组里,返回值是一个len代表读了几个字节
        //这点与字节输出流完全不一样
        //常规流程是
        int leen = 0;//记录每次读取的有效字节
        while((leen = fis.read(bytes1)) != -1 ){
     
            System.out.println(new String(bytes1));//将数组转化为字符串然后输出
        }
        fis.close();

    }
}

字节输入流,循环的错误写法:

package com.company.DemoShark;

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

public class LearnFile {
     
    public static void main(String[] args) throws IOException {
     

        FileInputStream fis = new FileInputStream("D:\\王泽林\\扫雷\\a.txt");
        do{
     
            int len = fis.read();
            System.out.println((char)len);
        }while (fis.read() != -1);
        //这种错误循环写法,问题在于,每次fis.read被调用,就已经读进来东西了,我这种写法
        //就变成了隔着一个,读一个

        }

}

字节流文件复制
1.一读一写而已


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

public class CopyFile {
     
    public static void main(String[] args) throws IOException {
     
        FileInputStream fis = new FileInputStream("D:\\360安全浏览器下载\\python\\1.jpg");
        FileOutputStream fos = new FileOutputStream("D:\\360安全浏览器下载\\python\\2.jpg");

//        int len = 0;
//        while(( len = fis.read()) != -1){
     
//            fos.write(len);//边读边写
//
//
//        }效率太低

        byte[] bytes = new byte[1024];
        int len = 0;
        while((len = fis.read(bytes)) != -1){
     
            //直接用字符数组来读效率很高
            fos.write(bytes,0,len);
        }

        fos.close();
        fis.close();

    }

}

package com.company.DemoShark;

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

public class LearnFile {
     
    public static void main(String[] args) throws IOException {
     

        /*
        文件字符输入流,解决读中文时候容易出现的,乱码问题,中文一般占用三个字节
        FileReader()字符输入流
        FileWriter()字符输出流

         */
        FileReader fr = new FileReader("D:\\王泽林\\扫雷\\a.txt");
        while(true){
     
            int len = fr.read();//读进来也是Int
            if(len == -1){
     
                break;
            }

            System.out.println(len);
        }
        
        //唯一区别就是使用数组进行输出的时候,使用的是char[] arrayChar
        //使用字符数组进行输出
        }

}

Properties集合,和IO流结合紧密的集合


import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;

public class Demo02Properties {
     
    /*
    void store(OutputStream out,String comments)字节输出流

    void store(Writer writer,  )字符输出流
    String comments用来说明保存文件是干什么用的

    Properties方法store将集合中临时数据写入硬盘

    1.第一步,创建一个Properties集合
    2.创建字节流和字符流,确定数据的流向
    3.使用Properties集合中store方法,将集合中临时数据,放进硬盘里
    4.释放资源
     */
    public static void main(String[] args) throws IOException {
     
        Properties properties = new Properties();
        properties.setProperty("赵丽颖","168");
        properties.setProperty("古力娜扎","118");
        properties.setProperty("杨幂","188");
        properties.setProperty("周期","158");

        FileWriter fos = new FileWriter("D:\\王泽林\\2.txt");//创建一个流
        properties.store(fos,"save money");//相当于注释
        fos.close();//;利用store方法,将集合中数据写进硬盘


    }
}

import java.util.Properties;
import java.util.Set;

public class Demo01Propertist {
     
    /*
    Properties集合唯一和IO流结合的
    Properties集合中方法store,将集合中的临时数据,持久化,写入到硬盘存储
    可以使用Properties集合中方法,load,把硬盘中保存的文件,读取到集合中使用
    IO流的一度
    Properties是键值对,key和Value都是字符串
    setProperties(String key,String value)
    String getProperty(String key)
    通过key找到value

    Set  stringPropertyNames()返回键值对集合,存放在一个set集合里

     */
    public static void main(String[] args) {
     
        Properties properties = new Properties();
        properties.setProperty("赵丽颖","168");
        properties.setProperty("古力娜扎","118");
        properties.setProperty("杨幂","188");
        properties.setProperty("周期","158");

        Set<String> set = properties.stringPropertyNames();

        for (String key: set
             ) {
     
            System.out.println(properties.getProperty(key));//通过key取到value

        }


    }

    private static void show02(Set<String> set) {
     
        for (String key: set
             ) {
     
            System.out.println(key);
            
        }

    }
}
package com.company.DemoShark;

import java.io.*;
import java.util.Properties;
import java.util.Set;

public class LearnFile {
     




        /*
        Properties集合唯一和IO流结合的
        Properties集合中方法store,将集合中的临时数据,持久化,写入到硬盘存储
        可以使用Properties集合中方法,load,把硬盘中保存的文件,读取到集合中使用
        IO流的一度
        Properties是键值对,key和Value都是字符串
        setProperties(String key,String value)
        String getProperty(String key)
        通过key找到value

        Set  stringPropertyNames()返回键值对集合,存放在一个set集合里

         */
        public static void main(String[] args) throws IOException {
     
            Properties properties = new Properties();
            properties.setProperty("赵丽颖","168");
            properties.setProperty("古力娜扎","118");
            properties.setProperty("杨幂","188");
            properties.setProperty("周期","158");

            properties.store(new FileWriter("D:\\王泽林\\扫雷\\x.txt"),"");
            //将集合中数据放进文件中
            //方法第二个参数是加个描述

            properties.load(new FileReader("D:\\王泽林\\扫雷\\x.txt"));
            Set<String> set = properties.stringPropertyNames();//将pro中的key整合起来
            for (String str:set
                 ) {
     
                System.out.println(properties.getProperty(str));

            }


        }




}

你可能感兴趣的:(JAVA)