java中IO流,输入输出流的概述

1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中。其中,

所有输入流类都是抽象类InputStream(字节输入流),或者抽象类Reader(字符输入流)的子类;

而所有输出流都是抽象类OutputStream(字节输出流)或者Writer(字符输出流)的子类。

【首先需要明白的是:流是干什么的???(为了永久性的保存数据)

  根据数据流向的不同分为输入流和输出流;

  根据处理数据类型的不同分为字符流和字节流;

【然后需要明白的是输入模式和输出模式是谁流向谁:

InputStream(字节输入流)和Reader(字符输入流)通俗的理解都是读(read)的。

OutputStream(字节输出流)和Writer(字符输出流)通俗的理解都是写(writer)的。

最后下面搞清楚各种流的类型的该怎么用,谁包含谁,理清思路。

2:InputStream类是字节输入流的抽象类,是所有字节输入流的父类,InputStream类具有层次结构如下图所示;

3:java中的字符是Unicode编码的,是双字节的。InputStream是用来处理字节的,在处理字符文本时很不方便。Java为字符文本的输入提供了专门的一套类Reader。Reader类是字符输入流的抽象类,所有字符输入流的实现都是它的子类。

4:输出流OutputStream类是字节输出流的抽象类,此抽象类表示输出字节流的所有类的超类。

5:Writer类是字符输出流的抽象类,所有字符输出类的实现都是它的子类。

6:下面以一些字节输入输出流具体的案例操作(操作的时候认清自己使用的是字节流还是字符流):

注意:read()方法读取的是一个字节,为什么返回是int,而不是byte。

字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111;那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上;24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型

FileInputStream的单个字节读取:

FileOutputStream的单个字节写入:

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

//输出流
public class fos_demo {
    public static void main(String[] args) throws Exception {
        FileInputStream fis = new FileInputStream("a.txt");
        FileOutputStream fos = new FileOutputStream("b.txt", true);
        //FileOutputStream()后面加true指文件后面可追加

        int a = fis.read();//单个读取输入流字节
        System.out.println(a);
        int b = fis.read();
        System.out.println(b);
        int c = fis.read();
        System.out.println(c);
        fos.write(97);//单个读出字节
        fos.write(98);
        fos.write(99);
        fis.close();//关闭输出流
        fos.close();//关闭输出流
    }
}

FileInputStream和FileOutputStream进行拷贝文本或者图片或者歌曲(以图片为例):

方法一:package IO;

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

//拷贝图片
public class copy_demo {
    public static void main(String[] args) throws IOException {
        copy();
    }
    public static void copy() throws IOException {
        FileInputStream fis = new FileInputStream("aaa.jpg");
        FileOutputStream fos = new FileOutputStream("copy.jpg");
        byte[] bytes = new byte[fis.available()];//将图片转为字节数组,这样会浪费空间
        fis.read(bytes);
        fos.write(bytes);
        fis.close();
        fos.close();
    }
}
方法二:
package IO;

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

public class copy_demo1 {
    public static void main(String[] args) throws IOException{
        copy_2();
    }
    public static void copy_2() throws IOException{
        FileInputStream fis= new FileInputStream("aaa.jpg");
        FileOutputStream fos = new FileOutputStream("copy1.jpg");
        int b;
        while((b=fis.read())!=-1){
           fos.write(b);
        }
        fis.close();
        fos.close();
    }
}

FileInputStream和FileOutputStream定义小数组进行操作:

//拷贝图片
package IO;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Array_copy {
    public static void main(String[] args) throws IOException {
        FileInputStream fis= new FileInputStream("aaa.jpg");
        FileOutputStream fos= new FileOutputStream("copy3.jpg");
        byte[] bytes = new byte[1024 * 8];//自定义字节大小
        int len;
        while ((len=fis.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }
        fis.close();
        fos.close();
    }
}
//进行读写操作
package IO;

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

public class Array_copy1 {
    public static void main(String[] args) throws IOException {
        test();
    }
    public static void test() throws IOException{
        FileInputStream fis = new FileInputStream("b.txt");
        byte[] bytes = new byte[3];//自定义读取字节的个数
        int len=fis.read(bytes);
        System.out.println(len);
        for(byte a:bytes){
            System.out.println(a);
        }
        System.out.println("************");
        int len1=fis.read(bytes);//没读完的接着读,依然是每次以上面自定义的读取的个数读
        System.out.println(len1);
        for(byte b:bytes){
            System.out.println(b);
        }
        fis.close();
    }
}

IO流(BufferedInputStream和BufferOutputStream拷贝)

* A:缓冲思想

  * 字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想,所以提            供了字节缓冲区流。

* B.BufferedInputStream

  * BufferedInputStream内置了一个缓冲区(数组), 从BufferedInputStream中读取一个字节时, BufferedInputStream会一次性从文件中读取8192个, 存在缓冲区中, 返回              给程序,程序再次读取时, 就不用找文件了, 直接从缓冲区中获取,直到缓冲区中所有的都被使用过, 才重新从文件中读取8192个。

* C.BufferedOutputStream

  * BufferedOutputStream也内置了一个缓冲区(数组),程序向流中写出字节时, 不会直接写到文件, 先写到缓冲区中,直到缓冲区写满, BufferedOutputStream才会把缓冲区           中的数据一次性写到文件里。

package IO;

import java.io.*;

//Buffer 相当于缓冲池 输入输出的转化
public class Buffer_demo {
    public static void main(String[] args) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("ren.jpg"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.jpg"));
        int len;
        while((len=bis.read())!=-1){
            bos.write(len);
        }
        bis.close();
        bos.close();
    }
}

 注意:

IO流(字符流是否可以拷贝非纯文本的文件)

* 不可以拷贝非纯文本的文件

* 因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替,写出的时候会将字符转换成字节写出去

* 如果是?,直接写出,这样写出之后的文件就乱了,看不了了

 

 

 



原文地址:https://www.cnblogs.com/rfj123/p/10566209.html

时间: 2024-11-12 05:59:28

java中IO流,输入输出流的概述的相关文章

java中常见的输入输出流案例学习

字节输入流: 1.FileInputStream 用途:从文件系统中的文件获得输入字节,常用于读取图像.声音等原始字节流,读取字符流可考虑使用FileReader 详细构造函数与常用方法可参考API文档,网上已经有中文版的API了,我是个E文盲,伤不起 这里介绍一个最常见的方法: read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中. ->off:b字节数组中的偏移量 小知识:数组偏移量,比如a[1,2,3,4,5]

JAVA中IO流总结

本文是在学习中的总结,欢迎转载但请注明出处:http://write.blog.csdn.net/postedit/42119261 我想你对JAVA的IO流有所了解,平时使用的也比较的多,但是对于其具体分类和继承体系可能知道的并不多,可能也很少去看相关的API文档,找出其中的关系和各自的应用情形.本文简单对常用的IO流进行分类整理,并简单举例说明其应用.希望本文对你有所帮助. (A)IO流大致分为两种: (1)字节流:对应抽象类为InputStream(输入流)和 OutputStream(输

Java中IO流,输入输出流概述与总结

总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入流),或者抽象类Reader(字符输入流)的子类: 而所有输出流都是抽象类OutputStream(字节输出流)或者Writer(字符输出流)的子类. [首先需要明白的是:流是干什么的???(为了永久性的保存数据)   根据数据流向的不同分为输入流和输出流:   根据处理数据类型的不同分为字符流和字

java中io流浅析

1.java.io包下File类:java程序中的此类的一个对象,就对应着硬盘中的一个文件或网络中的一个资源.File file1 = new File("d:\\io\\helloworld.txt");File file2 = new File("d:\\io\\io1");>1.File既可以表示一个文件(.doc .xls .mp3 .avi .jpg .dat),也可以表示一个文件目录!>2.File类的对象是与平台无关的.>3.File

Java中IO流

* IO流用来处理设备之间的数据传输 * Java对数据的操作是通过流的方式 * Java用于操作流的类都在IO包中 * 流按流向分为两种:输入流,输出流. * 流按操作类型分为两种: * 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的 * 字符流 : 字符流只能操作纯字符数据,比较方便. 字节流 |--InputStream(字节输入流,字节流的抽象父类,抽象类不能直接创建对象,必须使用子类) |--FileInputStream(文件字节输入流,就是以字节的

Java中IO流的介绍

一.流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等.       一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL.        流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流.用户可以从输入流中读取信息,但不能写它.相反,对输出流,只能往输入流写,而不能读它.       实际上,流的源端和目

黑马程序员------Java中IO流学习总结

Java培训.Android培训.iOS培训..Net培训.期待您的交流 一.概念 流:流就是字节序列的抽象概念,能被连续读取数据的数据源和能被连续写入数据的接收端就是流 IO流:用于处理设备上的数据 常用设备:硬盘.内存.键盘录入等 IO流的分类: 1.根据处理的数据类型不同,可分为字节流和字符流. 字符流的由来:因为文件编码的不同,而有了对字符高效操作的字符流对象,原理是基于字节流读取字节时,去查了相关码表. 字符流和字节流的区别: **字节流读取时,读到一个字节就返回一个字节:而字符流是字

java中IO流小解

下面这张图列出了java中一些处理流: java中根据操作对象的不同可以分为:字节流和字符流. 首先我们先表示一下什么叫节点流和处理流: 节点流:可以从或向一个特定的地方(节点)读写数据.如FileReader  处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写.如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数. java字节流 InputStream和OutputStream是java字节流中输入输出流的祖先. FileInputStr

java中IO流相关知识点

package zdbIO; import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream; public class OutputStreamDemo1 { /**     * @throws IOException      * @throws IOException