《java基础知识》Java IO流详解

Java IO概念

1. 用于设备之间的数据传输。

2. Java 将操作数据流的功能封装到了IO包中。

3. 数据流流向分:输入流和输出流,操作对象为文件。

4. 流按照操作数据分:字节流(通用)和字符流。

5. 将计算机语言:二进制数据转换成文件显示到电脑上。

IO包:继承关系图:

字符流:

Reader :读取字符流,方法见API。

Writer :写入字符流,方法见API。

案例(Writer ):

import java.io.*;

public class var {
    public static void main(String[] agrs){
        Writer writer = null;
        try{
            writer = new FileWriter("Demo.txt");            // writer = new FileWriter("Demo.txt",true); 文件续写功能,否则会覆盖。
            writer.write("今天天气真好!");
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(writer != null){
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

案例(Reader):

文件数据:

import java.io.*;

public class var {
    public static void main(String[] agrs){
        Reader reader = null;
        try{
            reader = new FileReader("Demo.txt");
            char[] arr = new char[5];
            int red = reader.read(arr); //red是装到数组的长度。
            while(red != -1 ){
                System.out.println(new String(arr,0,red));
                red = reader.read(arr);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

实现一个完整的文件复制。

import java.io.*;

public class var {
    public static void main(String[] agrs){
        Reader reader = null;
        Writer writer = null;
        try{
            reader = new FileReader("Demo.txt");
            writer = new FileWriter("Dome1.txt"); //
            char[] arr = new char[5];
            int red = 0; //red是装到数组的长度。
            while((red = reader.read(arr)) != -1 ){
                writer.write(new String(arr,0,red));
                writer.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(writer != null){
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

优化文件复制案例(缓冲流):

import java.io.*;

public class var {
    public static void main(String[] agrs){
        BufferedReader bufferedReader = null; //缓冲读取流
        BufferedWriter bufferedWriter = null; //缓冲写入流
        try{
            bufferedReader = new BufferedReader(new FileReader("Demo.txt"));
            bufferedWriter = new BufferedWriter(new FileWriter("Dome2.txt"));
            String str ;
            while((str = bufferedReader.readLine()) != null ){
                bufferedWriter.write(str);
                bufferedWriter.newLine();   //换行。
                bufferedWriter.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(bufferedReader != null){
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(bufferedWriter != null){
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

上述IO无法处理视频,图片等一些文件,拷贝出来的文件也无法打开,由此我们引出字节流。

字节流:

OutputSteam:写入字节流,方法见API。

InputSteam: 读取字节流,方法见API。

案例(OutputSteam):

public class var {
    public static void main(String[] agrs){
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream("demo.txt");
            fileOutputStream.write("今天天气真好,我们去玩吧!".getBytes());
            //不需要刷新。
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(fileOutputStream != null){
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

案例(InputSteam):

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

public class PublicTest {
    public static void main(String[] args) {
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream("demo.txt");
            int ch =0;
            byte[] arr = new byte[fileInputStream.available()];  //正式写代码不要使用fileInputStream.available(),因为文件比较大的时候内存会不够用。
            while((ch = fileInputStream.read(arr)) != -1){
                System.out.println(new String(arr,0,ch));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fileInputStream != null){
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

案例:复制一个视频文件

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

public class PublicTest {
    public static void main(String[] args) {
        FileOutputStream fileOutputStream = null;
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream("video.avi");
            fileOutputStream = new FileOutputStream("video1.avi");
            int ch =0;
            byte[] arr = new byte[fileInputStream.available()];  //正式写代码不要使用fileInputStream.available(),因为文件比较大的时候内存会不够用。
            while((ch = fileInputStream.read(arr)) != -1){
                fileOutputStream.write(arr);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fileInputStream != null){
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fileOutputStream != null){
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

转换流(键盘输入和控制台输出作为案例):

import java.io.*;

public class var {
    public static void main(String[] agrs){
        OutputStream out = System.out;  //控制台打印
        OutputStreamWriter outputStreamWriter = null;
        outputStreamWriter = new OutputStreamWriter(out);  // outputStreamWriter = new OutputStreamWriter(out,"GBK");  可以指定写的编码
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);

        InputStream in = System.in;   //键盘输入流。
        InputStreamReader inputStreamReader = new InputStreamReader(in); // InputStreamReader inputStreamReader = new InputStreamReader(in,"BGK"); 同样可以指定编码
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        try {
            String line = null;
            while((line = bufferedReader.readLine()) != null){
                if("exit".equals(line)){
                    break;
                }
                bufferedWriter.write(line);
                bufferedWriter.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(bufferedWriter != null){
                    bufferedWriter.close();
                }
                if(bufferedReader != null){
                    bufferedReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

IO流先讲到这里,Java IO流还有很多有意思的类和方法见API。

参考:https://www.cnblogs.com/runningTurtle/p/7088125.html

 

原文地址:https://www.cnblogs.com/jssj/p/11487214.html

时间: 2024-08-06 13:36:14

《java基础知识》Java IO流详解的相关文章

java IO流详解(一)

从本篇博文开始,详细讲解JAVA IO流的基本操作,力求每一个例子都给大家一个DEMO,在最终完成的时候,我会贴出最终的源码,方便大家交流学习. 上一篇博文中转载了大神的博文和图片,非常好! 文章链接如下:Java IO流 下面一个个的用实例进行讲解每个IO流的基本用法. 1 File文件 public static void main(String[] args) throws IOException { File file = new File("."); myPrint(file

Java IO流详解(二)——File类

在上一章博客中简单的介绍了Java IO流的一些特征.也就是对文件的输入输出,既然至始至终都离不开文件,所以Java IO流的使用得从File这个类讲起. File类的描述:File类是文件和目录路径名的抽象表示形式,主要用于文件和目录的创建.查找和删除等操作.即Java中把文件或者目录(文件夹)都封装成File对象.也就是说如果我们要去操作硬盘上的文件或者目录只要创建File这个类即可. 不过要注意的是File类只是对文件的操作类,只能对文件本身进行操作,不能对文件内容进行操作. 1.File

Java IO流详解(五)——缓冲流

缓冲流也叫高效流,是处理流的一种,即是作用在流上的流.其目的就是加快读取和写入数据的速度. 缓冲流本身并没有IO功能,只是在别的流上加上缓冲效果从而提高了效率.当对文件或其他目标频繁读写或操作效率低,效能差时.这时使用缓冲流能够更高效的读写信息.因为缓冲流先将数据缓存起来,然后一起写入或读取出来.所以说,缓冲流还是很重要的,在IO操作时加上缓冲流提升性能. Java IO流中对应的缓冲流有以下四个: 字节缓冲流:BufferedInputStream.BufferedOutputStream 字

Java IO流详解

初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializa

Java IO流详解(五)

使用的是InputStreamReader和OutputStreamWriter,它们本身属于的是reader和writer字符流,我们之所以会用到这些转化流是因为系统有时候只给我们提供了字节流,为了方便操作,要用到字符流.比如说System.in标准输入流就是字节流.你想从那里得到用户在键盘上的输入,只能是以转换流将它转换为Reader以方便自己的程序读取输入.再比如说Socket里的getInputStream()很明显只给你提供字节流,你要想读取字符,就得给他套个InputStreamRe

Java IO流详解(四)

Serializable序列化 1 对象的序列化 class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return "Name:" + this.name + ", Age:&

Java IO流详解(三)

Scanner类 1 从键盘读取 public class ScannerTest { public static void main(String[] args ) { Scanner input = new Scanner(System.in); System.out.println("请输出一个整数:"); int i = input.nextInt(); System.out.println("你输入的整数是:" + i); } } 结果: 2 从字符串读取

Java IO流详解(二)

1 文件对象 public class CreateFile { public static void main(String[] args) { //创建要操作的文件路径和名称 //其中,File.separator表示系统相关的分隔符,Linux下为:/ Windows下为:\\ //path在此程序里面代表父目录,不包含子文件 String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\parent"; //ch

java知识点分享,IO流详解!

Java知识IO流详解有人觉得IO知识不太重要,其实不然,IO的使用范围很广,最能体现IO价值的就是网络上的数据传递,尤其是进入互联网时代后,各种常见的分布式架构,都少不了IO的体现.并且很多大厂的面试题中都会体现出对IO的重视,包括衍生出来的NIO.序列化等等.因此学好IO,变成了一件很重要的事情.IO基本概念IO可以简单的理解成INPUT和OUT,代表输入输出的意思.输入就是读,输出就是写.IO可以读写硬盘.光盘.内存.键盘.网络等资源上的数据.流IO中的流就相当于现实生活中的水流一样,一打