再多学一点吧

导航

IO流

                       字节流                                                          字符流
     字节输入流                        字节输出流                       字符输入流              字符输出流
     InputStream               OutputStream                   Reader                    Writer   (抽象类)
     FileInputStream               FileOutputStream            FileReader             FileWriter(实现类)
     BufferedInputStream       BufferedOutputStream          BufferedReader     BufferedWriter(实现类,缓冲流)
                                                                                                     InputStreamReader  OutputStreamWriter
     ObjectInputStream       ObjectOutputStream

>   - Windows系统里,每行结尾是 `回车+换行` ,即`\r\n`;
>   - Unix系统里,每行结尾只有 `换行` ,即`\n`;
>   - Mac系统里,每行结尾是 `回车` ,即`\r`。从 Mac OS X开始与Linux统一。


字节输出流【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)` :将指定的字节输出流。

- `public FileOutputStream(File file)`:创建文件输出流以写入由指定的 File对象表示的文件。
- `public FileOutputStream(String name)`: 创建文件输出流以指定的名称写入文件。 

这两个构造方法,参数中都需要传入一个boolean类型的值,`true` 表示追加数据,`false`

 

 

 

复制文件夹

ublic class TestCopyDirDemo1 {
    public static void main(String[] args) throws IOException {
        File file1 = new File("D:\\qq\\I18N");
        File file2 = new File("D:\\qq\\new");
        copyDir(file1,file2);

    }

    private static void copyDir(File file1,File file2) throws IOException {
        if (file1.isDirectory()&&file1!=null){
            file2.mkdirs();
            File[] files = file1.listFiles();
            for (File file : files) {
                if(file.isFile()){
                    copy(file,new File(file2,file.getName()));
                }else {
                    copyDir(file,new File(file2,file.getName()));
                }
            }
        }
    }

    private static void copy(File file, File file1) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file1));
        byte[] bytes = new byte[1024];
        int len;
        while ((len=bis.read(bytes))!=-1){
            bos.write(bytes,0,len);
        }
    }
}

 

public class FileOutputStreamDemo2 {
    public static void main(String[] args) throws IOException {
        OutputStream os=new FileOutputStream("d.txt");//追加数据管道
        os.write('a');
        os.write(98);
        byte[] bytes={99,112,111,116,106};
        os.write(bytes);
        os.write("\n".getBytes());

        byte[] bytes1="我的名字很拽\r\n".getBytes();
        System.out.println(bytes1.length);
        os.write(bytes1);


        byte[] bytes3="abcde".getBytes();
        os.write(bytes3,0,3);  //abcpotj
        os.close();                    //我的名字很拽
                                       //abc
    }
}

字节输入流【InputStream】:

- `public void close()` :关闭此输入流并释放与此流相关联的任何系统资源。    
- `public abstract int read()`: 从输入流读取数据的下一个字节。
- `public int read(byte[] b)`: 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。

- `FileInputStream(File file)`: 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
- `FileInputStream(String name)`: 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

public class FileInputStreamDemo2 {
    public static void main(String[] args) throws IOException {
//        File file = new File("b.txt");
//        file.createNewFile();
//
//        InputStream is=new FileInputStream(file);
//        byte[] buffer=new byte[3];

//        int read = is.read(buffer);
//        System.out.println(read);
//        String s=new String(buffer);
//        System.out.println(s);
//
//        int read1 = is.read(buffer);
//        System.out.println(read1);
//        String s1 = new String(buffer);
//        System.out.println(s1);
//
//        int read2 = is.read(buffer);
//        System.out.println(read2);
//        String s2 = new String(buffer);
//        System.out.println(s2);
        InputStream is= new FileInputStream("b.txt");
        byte[] buffer=new byte[3];
        int len=0;
        while((len=is.read(buffer))!=-1){
            String s=new String(buffer,0,len);
            System.out.print(s);
        }     
      is.close(); } }

字符输入流【Reader】:

- `public void close()` :关闭此流并释放与此流相关联的任何系统资源。    
- `public int read()`: 从输入流读取一个字符。
- `public int read(char[] cbuf)`: 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。

- `FileReader(File file)`: 创建一个新的 FileReader ,给定要读取的File对象。   
- `FileReader(String fileName)`: 创建一个新的 FileReader ,给定要读取的文件的名称。 

public class FileReaderDemo2 {
    public static void main(String[] args) throws IOException {
//        Reader fr=new FileReader("bb.txt");
//        char[] buffer=new char[3];
//        int len = fr.read(buffer);
//        String s=new String(buffer);
//        System.out.println(s);


        Reader  fr = new FileReader("bb.txt");
        char[] buffer=new char[1024];
        int len;
        while ((len=fr.read(buffer))!=-1){
            System.out.println(new String(buffer,0,len));
        }
        fr.close();
        
    }
}

字符输出流【Writer】:

- `public abstract void close()` :关闭此输出流并释放与此流相关联的任何系统资源。  
- `public abstract void flush() ` :刷新此输出流并强制任何缓冲的输出字符被写出。  
- `public void write(int c)` :写出一个字符。
- `public void write(char[] cbuf)`:将 b.length字符从指定的字符数组写出此输出流。  
- `public abstract void write(char[] b, int off, int len)` :从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。  
- `public void write(String str)` :写出一个字符串。

- `FileWriter(File file)`: 创建一个新的 FileWriter,给定要读取的File对象。   
- `FileWriter(String fileName)`: 创建一个新的 FileWriter,给定要读取的文件的名称

**写出字符数组** :`write(char[] cbuf)` 和 `write(char[] cbuf, int off, int len)`

public class FileWriterDemo2 {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("www.txt");
        fw.write("我");
        fw.flush();
        fw.write("爱");
        fw.flush();
        fw.write("中");
        fw.close();
        fw.write("国");
        fw.close();  //报错 java.io.IOException: Stream closed
    }
}
public class FileWriterDemo3 {
    public static void main(String[] args) throws IOException {
        FileWriter fw1 = new FileWriter("www.txt");
        char[] ch="我爱中国".toCharArray();
        fw1.write(ch,1,2);  //爱中
        fw1.write("\r\n");

        String s="喜羊羊与灰太狼";
        fw1.write(s,1,5);  //羊羊与灰太

        fw1.close();

    }
}

字节缓冲流:

* `public BufferedInputStream(InputStream in)` :创建一个 新的缓冲输入流。
* `public BufferedOutputStream(OutputStream out)`: 创建一个新的缓冲输出流。

// 创建字节缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt"));
// 创建字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));

public class BufferedStreamDemo1 {
    public static void main(String[] args) {
        long start=System.currentTimeMillis();
        try(BufferedInputStream bis = new BufferedInputStream(
                new FileInputStream("E:\\素材\\鬼灭之刃-栗花落香奈乎(包含图片素材)\\tsy.mp4"));
            BufferedOutputStream bos=new BufferedOutputStream(
                    new FileOutputStream("E:\\素材\\鬼灭之刃-栗花落香奈乎(包含图片素材)\\缓冲速度.mp4"));

                ) {
            byte[] bytes = new byte[8*1024];
            int len;
            while ((len=bis.read(bytes))!=-1){
                bos.write(bytes,0,len);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        long end=System.currentTimeMillis();
        System.out.println(end-start);  //108
    }
}

字符缓冲流

* `public BufferedReader(Reader in)` :创建一个 新的缓冲输入流。
* `public BufferedWriter(Writer out)`: 创建一个新的缓冲输出流。

// 创建字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader("br.txt"));
// 创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));

* BufferedReader:`public String readLine()`: 读一行文字。
* BufferedWriter:`public void newLine()`: 写一行行分隔符,由系统属性定义符号。

public class BufferedWriterDemo1 {
    public static void main(String[] args) throws IOException{
         BufferedWriter bw = new BufferedWriter(new FileWriter("缓冲字符流.txt"));
            bw.write("我爱中国");
            bw.newLine();
            bw.write("我和他他他");
            bw.write("\r\n");
            bw.write("我们之间的距离");
            bw.newLine();
            bw.close();

        BufferedReader bd = new BufferedReader(new FileReader("缓冲字符流.txt"));
//        int len;
//        while ((len=bd.read())!=-1){
//            System.out.print((char) len);
//        }

       String line;
        while ((line=bd.readLine())!=null){
            System.out.println(line); //我爱中国
                                      //我和他他他
                                      //我们之间的距离
        }
        bd.close();

 转换流

InputStreamReader类

* `InputStreamReader(InputStream in)`: 创建一个使用默认字符集的字符流。
* `InputStreamReader(InputStream in, String charsetName)`: 创建一个指定字符集的字符流。

InputStreamReader isr = new InputStreamReader(new FileInputStream("in.txt"));
InputStreamReader isr2 = new InputStreamReader(new FileInputStream("in.txt") , "GBK");

public class InputStreamReaderDemo1 {
    public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("d.txt"));
        int len;
        while ((len=isr.read())!=-1){
            System.out.print((char)len);  //�ҵ����ֺ�ק
        }
      isr.close(); InputStreamReader isr2
= new InputStreamReader(new FileInputStream("d.txt"),"GBK"); int len2; while ((len2=isr2.read())!=-1){ System.out.print((char)len2); //我的名字很拽 }
      isr2.close(); } }

OutputStreamWriter类

- `OutputStreamWriter(OutputStream in)`: 创建一个使用默认字符集的字符流。
- `OutputStreamWriter(OutputStream in, String charsetName)`: 创建一个指定字符集的字符流。

OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("out.txt"));
OutputStreamWriter isr2 = new OutputStreamWriter(new FileOutputStream("out.txt") , "GBK");

public class OutputStreamWriterDemo1 {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("转换流的写入.txt"));
        osw.write("我和大家都在一起");  //UTF-8
        osw.close();

        OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream("转换流的写入2.txt"),"GBK");
        osw2.write("我和大家都在一起");
        osw2.close();  //GBK
    } 
}

 序列化:就是把Java对象数据直接存储到文件中去。 对象 => 文件中
反序列化:把Java对象的文件数据恢复到Java对象中。 文件中 => 对象

1一个对象要想序列化,必须满足两个条件:
* 该类必须实现`java.io.Serializable ` 接口,`Serializable` 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出`NotSerializableException` 。
* 该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用`transient` 关键字修饰。

-- 构造器:public ObjectInputStream(InputStream is)
-- 方法:public final Object readObject()

public class SerializeDemo1 {
    public static void main(String[] args) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));
        Student student = new Student("猪猪侠",16,98);
        oos.writeObject(student);
        oos.close();

    }
}
class Student implements Serializable { 
    private static final long serialVersionUID = 1L; //序列版本号
    private String name;
    private int age;
    private transient int score;//transient修饰的成员变量将不参与序列化
public class SerializeDemo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));
        Student student=(Student) ois.readObject();
        System.out.println(student);  //需要重写toString方法
        ois.close();
    }
}

 

打印流:PrintStream / PrintWriter.

打印流的构造器:
        public PrintStream(OutputStream os):
        public PrintStream(String filepath):

打印流可以方便,且高效的打印各种数据。
         PrintStream不光可以打印数据,还可以写"字节数据"出去。
         PrintWriter不光可以打印数据,还可以写"字符数据"出去

public class PrintStreamDemo1 {
    public static void main(String[] args) throws IOException {
//        PrintStream ps = new PrintStream(new FileOutputStream("打印流.txt"));
        PrintStream ps = new PrintStream("打印流.txt");

        ps.println(true);
        ps.println("我爱你");
        ps.println('s');
        ps.println(95);
        ps.println(15.26);
        ps.close();
    }
}

public static void setOut(PrintStream out) :让系统的输出流向打印流。

public class PrintStreamDemo2 {
    public static void main(String[] args) throws IOException {
        PrintStream ps = new PrintStream("打印流2.txt");
        System.setOut(ps);
        System.out.println(123);
        System.out.println("四五六");
        System.out.println('7');
    }
}

 

posted on 2021-08-17 19:48  糟糟张  阅读(48)  评论(0编辑  收藏  举报