精华内容
下载资源
问答
  • java输入输出流

    2021-03-13 07:19:03
    java输入输出流java IO综述在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable。Java I/O主要包括如下几个层次,包含三个...

    java输入输出流

    java IO综述

    在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable。

    Java I/O主要包括如下几个层次,包含三个部分:

    1.流式部分――IO的主体部分;

    2.非流式部分――主要包含一些辅助流式部分的类,如:File类、RandomAccessFile类和FileDescriptor等类;

    3.其他类--文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。

    类的具体描述如下:

    1. File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。

    2. InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。

    3. OutputStream(二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。

    Java中字符是采用Unicode标准,一个字符是16位,即一个字符使用两个字节来表示。为此,JAVA中引入了处理字符的流。

    4. Reader(文件格式操作):抽象类,基于字符的输入操作。

    5. Writer(文件格式操作):抽象类,基于字符的输出操作。

    6. RandomAccessFile(随机文件操作):它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作。

    Java中IO流的体系结构如图:

    dd2d5b4143aed7a3bf366aef115a2131.png

    非流式文件类--File类

    在Java语言的java.io包中,由File类提供了描述文件和目录的操作与管理方法。但File类不是InputStream、OutputStream或Reader、Writer的子类,因为它不负责数据的输入输出,而专门用来管理磁盘文件与目录。

    File类主要用于命名文件、查询文件属性和处理文件目录。

    File类共提供了三个不同的构造函数,以不同的参数形式灵活地接收文件和目录名信息。构造函数:

    1)File (String   pathname)

    例:File  f1=new File("FileTest1.txt"); //创建文件对象f1,f1所指的文件是在当前目录下创建的FileTest1.txt,注意此时实际文件并没有被创建。直到程序执行f1. createNewFile()时,才创建文件实体。

    2)File (String  parent , String child)

    例:File f2=new  File(“D:\\dir1","FileTest2.txt") ;//  注意:D:\\dir1目录事先必须存在,否则异常。在parent目录下创建文件对象。

    3)File (File parent , String child)

    例:File  f4=new File("\\dir3");

    File  f5=new File(f4,"FileTest5.txt");  //在如果 \\dir3目录不存在使用f4.mkdir()先创建

    一个对应于某磁盘文件或目录的File对象一经创建, 就可以通过调用它的方法来获得文件或目录的属性。

    常用方法:通过file对象.方法的形式调用

    369934bd6158ee3e9cd47597301b9ed7.png

    File类中还定义了一些对文件或目录进行管理、操作的方法,常用的方法有:

    1) public boolean renameTo( File newFile );重命名文件

    2) public void delete( );   删除文件

    3)  public boolean mkdir( ); 创建目录

    4)  public boolean createNewFile ( );创建文件实体

    说明:File类的方法:

    (1) exists()测试磁盘中指定的文件或目录是否存在

    (2) mkdir()创建文件对象指定的目录(单层目录)

    (3) createNewFile()创建文件对象指定的文件

    (4) list()返回目录中所有文件名字符串

    Java.IO流类库

    io流的四个基本类

    java.io包中包含了流式I/O所需要的所有类。在java.io包中有四个基本类:InputStream、OutputStream及Reader、Writer类,它们分别处理字节流和字符流:

    有时候我们需要将字节流转换成字符流,并且将字节流中读取到的字节按照指定字符集转换成字符并输入显示,或者将要写入的字符按照指定字符集转换成字节输出存储。这个时候就需要用到转换流。JavaSE API提供了两个转换流:InputStreamReader和OutputStreamWriter。前者用于字节输入流的转换,后者用于字节输出流的转换。

    dffdf9412f4522e77b190551dea9b100.png

    输入/输出字节流

    字符流

    输入流InputstreamReader

    输出流OutputStreamWriter

    8b60a31e1ae01b0751e2afe633eaf194.png

    io流的具体分类

    一、按I/O类型来总体分类:

    1. Memory   1)从/向内存数组读写数据: CharArrayReader、 CharArrayWriter,ByteArrayInputStream、ByteArrayOutputStream。2)从/向内存字符串读写数据 StringReader、StringWriter、StringBufferInputStream

    2.Pipe管道  实现管道的输入和输出(进程间通信): PipedReader、PipedWriter、PipedInputStream、PipedOutputStream

    3.File 文件流。对文件进行读、写操作 :FileReader、FileWriter、FileInputStream、FileOutputStream

    4. ObjectSerialization 对象输入、输出 :ObjectInputStream、ObjectOutputStream

    5.DataConversion数据流 按基本数据类型读、写(处理的数据是Java的基本类型(如布尔型,字节,整数和浮点数)):DataInputStream、DataOutputStream

    6.Printing 包含方便的打印方法 :PrintWriter、PrintStream

    7.Buffering缓冲  在读入或写出时,对数据进行缓存,以减少I/O的次数:BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream

    8.Filtering 滤流,在数据进行读或写时进行过滤:FilterReader、FilterWriter、FilterInputStream、FilterOutputStream过

    9.Concatenation合并输入 把多个输入流连接成一个输入流 :SequenceInputStream

    10.Counting计数  在读入数据时对行记数 :LineNumberReader、LineNumberInputStream

    11.Peeking Ahead 通过缓存机制,进行预读 :PushbackReader、PushbackInputStream

    12.Converting between Bytes and Characters 按照一定的编码/解码标准将字节流转换为字符流,或进行反向转换(Stream到Reader,Writer的转换类):InputStreamReader、OutputStreamWriter

    二、按数据来源(去向)分类:

    1、File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter

    2、byte[]:ByteArrayInputStream, ByteArrayOutputStream

    3、Char[]: CharArrayReader, CharArrayWriter

    4、String: StringBufferInputStream, StringReader, StringWriter

    5、网络数据流:InputStream, OutputStream, Reader, Writer

    13c3e169eb5616ebaa3a793af99acb2b.png

    05584f59fcbc86a1c70136216fd97e23.png

    InputStream/OutputStream

    1.InputStream抽象类

    InputStream 为字节输入流,它本身为一个抽象类,必须依靠其子类实现各种功能,此抽象类是表示字节输入流的所有类的超类。 继承自InputStream  的流都是向程序中输入数据的,且数据单位为字节(8bit);

    InputStream是输入字节数据用的类,所以InputStream类提供了3种重载的read方法.Inputstream类中的常用方法:

    (1) public abstract int read( ):读取一个byte的数据,返回值是高位补0的int类型值。若返回值=-1说明没有读取到任何字节读取工作结束。

    (2) public int read(byte b[ ]):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的

    (3) public int read(byte b[ ], int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。

    (4) public int available( ):返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用,

    (5) public long skip(long n):忽略输入流中的n个字节,返回值是实际忽略的字节数, 跳过一些字节来读取

    (6) public int close( ) :我们在使用完后,必须对我们打开的流进行关闭.

    主要的子类:

    1) FileInputStream把一个文件作为InputStream,实现对文件的读取操作

    2) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用

    3) StringBufferInputStream:把一个String对象作为InputStream

    4) PipedInputStream:实现了pipe的概念,主要在线程中使用

    5) SequenceInputStream:把多个InputStream合并为一个InputStream

    2.OutputStream抽象类

    OutputStream提供了3个write方法来做数据的输出,这个是和InputStream是相对应的。

    1. public void write(byte b[ ]):将参数b中的字节写到输出流。

    2. public void write(byte b[ ], int off, int len) :将参数b的从偏移量off开始的len个字节写到输出流。

    3. public abstract void write(int b) :先将int转换为byte类型,把低字节写入到输出流中。

    4. public void flush( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。

    5. public void close( ) : 关闭输出流并释放与流相关的系统资源。

    主要的子类:

    1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中

    2) FileOutputStream:把信息存入文件中

    3) PipedOutputStream:实现了pipe的概念,主要在线程中使用

    4) SequenceOutputStream:把多个OutStream合并为一个OutStream

    流结束的判断:方法read()的返回值为-1时;readLine()的返回值为null时。

    文件输入流: FileInputStream

    FileInputStream可以使用read()方法一次读入一个字节,并以int类型返回,或者是使用read()方法时读入至一个byte数组,byte数组的元素有多少个,就读入多少个字节。在将整个文件读取完成或写入完毕的过程中,这么一个byte数组通常被当作缓冲区,因为这么一个byte数组通常扮演承接数据的中间角色。

    作用:以文件作为数据输入源的数据流。或者说是打开文件,从文件读数据到内存的类。

    使用方法(1)

    File  fin=new File("d:/abc.txt");

    FileInputStream in=new FileInputStream( fin);

    使用方法(2)

    FileInputStream  in=new  FileInputStream(“d: /abc.txt”);

    文件输出流:FileOutputStream类

    作用:用来处理以文件作为数据输出目的数据流;或者说是从内存区读数据入文件FileOutputStream类用来处理以文件作为数据输出目的数据流;一个表示文件名的字符串,也可以是File或FileDescriptor对象。

    创建一个文件流对象有两种方法:

    方式1:

    File   f=new  File (“d:/myjava/write.txt ");

    FileOutputStream  out= new FileOutputStream (f);

    方式2:

    FileOutputStream out=new FileOutputStream(“d:/myjava/write.txt ");

    方式3:构造函数将 FileDescriptor()对象作为其参数。

    FileDescriptor() fd=new FileDescriptor();

    FileOutputStream f2=new FileOutputStream(fd);

    方式4:构造函数将文件名作为其第一参数,将布尔值作为第二参数。

    FileOutputStream f=new FileOutputStream("d:/abc.txt",true);

    注意: (1)文件中写数据时,若文件已经存在,则覆盖存在的文件;(2)的读/写操作结束时,应调用close方法关闭流。

    带缓存区的输入输出

    计算机访问外部设备非常耗时。访问外存的频率越高,造成CPU闲置的概率就越大。为了减少访问外存的次数,应该在一次对外设的访问中,读写更多的数据。为此,除了程序和流节点间交换数据必需的读写机制外,还应该增加缓冲机制。缓冲流就是每一个数据流分配一个缓冲区,一个缓冲区就是一个临时存储数据的内存。这样可以减少访问硬盘的次数,提高传输效率。

    BufferedInputStream:当向缓冲流写入数据时候,数据先写到缓冲区,待缓冲区写满后,系统一次性将数据发送给输出设备。

    BufferedOutputStream :当从向缓冲流读取数据时候,系统先从缓冲区读出数据,待缓冲区为空时,系统再从输入设备读取数据到缓冲区。

    1)将文件读入内存:

    将BufferedInputStream与FileInputStream相接

    FileInputStream in=new  FileInputStream( “file1.txt ” );

    BufferedInputStream bin=new  BufferedInputStream( in);

    2)将内存写入文件:

    将BufferedOutputStream与 FileOutputStream相接

    FileOutputStreamout=new FileOutputStream(“file1.txt”);

    BufferedOutputStream  bin=new BufferedInputStream(out);

    3)键盘输入流读到内存

    将BufferedReader与标准的数据流相接

    InputStreamReader sin=new InputStreamReader (System.in) ;

    BufferedReader bin=new  BufferedReader(sin);

    字符流Writer/Reader

    Java中字符是采用Unicode标准,一个字符是16位,即一个字符使用两个字节来表示。为此,JAVA中引入了处理字符的流。

    1. Reader抽象类

    用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。

    1)FileReader :

    与FileInputStream对应,主要用来读取字符文件,使用缺省的字符编码,有三种构造函数:

    (1)将文件名作为字符串 :FileReader f=new FileReader(“c:/temp.txt”);

    (2)构造函数将File对象作为其参数。

    File f=new file(“c:/temp.txt”);

    FileReader f1=new FileReader(f);

    (3)  构造函数将FileDescriptor对象作为参数

    FileDescriptor() fd=new FileDescriptor()

    FileReader f2=new FileReader(fd);

    参数类型:

    1) 用指定字符数组作为参数:CharArrayReader(char[])

    2) 将字符数组作为输入流:CharArrayReader(char[], int, int)

    读取字符串,构造函数如下: public StringReader(String s);

    3) StringReader : 与StringBufferInputStream对应

    4) InputStreamReader  从输入流读取字节,在将它们转换成字符:Public inputstreamReader(inputstream is);

    5) FilterReader: 允许过滤字符流  protected filterReader(Reader r);

    6) BufferReader :接受Reader对象作为参数,并对其添加字符缓冲器,使用readline()方法可以读取一行。 Public BufferReader(Reader r);

    主要方法:

    (1)  public int read() throws IOException; //读取一个字符,返回值为读取的字符

    (2)  public int read(char cbuf[]) throws IOException; /*读取一系列字符到数组cbuf[]中,返回值为实际读取的字符的数量*/

    (3)  public abstract int read(char cbuf[],int off,int len) throws IOException; /*读取len个字符,从数组cbuf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现*/

    Writer抽象类

    写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。 其子类如下:

    1) FileWrite: 与FileOutputStream对应

    将字符类型数据写入文件,使用缺省字符编码和缓冲器大小。

    Public FileWrite(file f);

    2)  chararrayWrite:与ByteArrayOutputStream对应 ,将字符缓冲器用作输出。

    Public CharArrayWrite();

    3) PrintWrite:生成格式化输出

    public PrintWriter(outputstream os);

    4) filterWriter:用于写入过滤字符流

    protected FilterWriter(Writer w);

    5) PipedWriter:与PipedOutputStream对应

    6) StringWriter:无与之对应的以字节为导向的stream

    主要方法:

    (1)  public void write(int c) throws IOException; //将整型值c的低16位写入输出流

    (2)  public void write(char cbuf[]) throws IOException; //将字符数组cbuf[]写入输出流

    (3)  public abstract void write(char cbuf[],int off,int len) throws IOException; //将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流

    (4)  public void write(String str) throws IOException; //将字符串str中的字符写入输出流

    (5)  public void write(String str,int off,int len) throws IOException; //将字符串str 中从索引off开始处的len个字符写入输出流

    (6)  flush( ) //刷空输出流,并输出所有被缓存的字节。

    (7)close()关闭流 public abstract void close() throws IOException

    InputStream与Reader差别 OutputStream与Writer差别

    InputStream和OutputStream类处理的是字节流,数据流中的最小单位是字节(8个bit)

    Reader与Writer处理的是字符流,在处理字符流时涉及了字符编码的转换问题

    Reader类能够将输入流中采用其他编码类型的字符转换为Unicode字符,然后在内存中为其分配内存

    Writer类能够将内存中的Unicode字符转换为其他编码类型的字符,再写到输出流中。

    FileWriter类(字符输出流类)

    构造方法:FileWriter fw = new FileWriter(String fileName);//创建字符输出流类对象和已存在的文件相关联。文件不存在的话,并创建。

    如: FileWriter fw = new FileWriter("C:\\1.txt");

    FileWriter fw = new FileWriter(String fileName,boolean append);//创建字符输出流类对象和已存在的文件相关联,并设置该该流对文件的操作是否为续写。

    如:FileWriter fw = new FileWriter("C:\\1.txt",ture); //表示在fw对文件再次写入时,会在该文件的结尾续写,并不会覆盖掉。

    主要方法:

    void write(String str)   //写入字符串。当执行完此方法后,字符数据还并没有写入到目的文件中去。此时字符数据会保存在缓冲区中。此时在使用刷新方法就可以使数据保存到目的文件中去。

    viod flush()//刷新该流中的缓冲。将缓冲区中的字符数据保存到目的文件中去。

    viod close()   //关闭此流。在关闭前会先刷新此流的缓冲区。在关闭后,再写入或者刷新的话,会抛IOException异常。

    如何选择IO流

    1)确定是数据源和数据目的(输入还是输出)

    源:输入流 InputStream Reader

    目的:输出流 OutputStream Writer

    2)明确操作的数据对象是否是纯文本

    是:字符流Reader,Writer

    否:字节流InputStream,OutputStream

    3)明确具体的设备。

    是硬盘文件:File++:

    读取:FileInputStream,, FileReader,

    写入:FileOutputStream,FileWriter

    是内存用数组

    byte[]:ByteArrayInputStream, ByteArrayOutputStream

    是char[]:CharArrayReader, CharArrayWriter

    是String:StringBufferInputStream(已过时,因为其只能用于String的每个字符都是8位的字符串), StringReader, StringWriter

    是网络用Socket流

    是键盘:用System.in(是一个InputStream对象)读取,用System.out(是一个OutoutStream对象)打印

    3)是否需要转换流

    是,就使用转换流,从Stream转化为Reader,Writer:InputStreamReader,OutputStreamWriter

    4)是否需要缓冲提高效率

    是就加上Buffered:BufferedInputStream, BufferedOuputStream, BuffereaReader, BufferedWriter

    5)是否需要格式化输出

    例:将一个文本文件中数据存储到另一个文件中。

    1)数据源和数据目的:读取流,InputStream Reader  输出:OutputStream Writer

    2)是否纯文本:是!这时就可以选择Reader Writer。

    3)设备:是硬盘文件。Reader体系中可以操作文件的对象是 FileReader FileWriter。

    FileReader fr = new FileReader("a.txt");

    FileWriter fw = new FileWriter("b.txt");

    4)是否需要提高效率:是,加Buffer

    BufferedReader bfr = new BufferedReader(new FileReader("a.txt"););

    BufferedWriter bfw = new BufferedWriter(new FileWriter("b.txt"););

    IOException异常类的子类

    1.public classEOFException :

    非正常到达文件尾或输入流尾时,抛出这种类型的异常。

    2.public class FileNotFoundException:

    当文件找不到时,抛出的异常。

    3.public class InterruptedIOException:

    当I/O操作被中断时,抛出这种类型的异常。

    数据流

    FileInputStream和FileOutputStream只能读写字节,如果我们要读写int、double或者字符串类型就要使用数据流进行包装。

    数据流用DataInputStream和DataOutputStream类,不能独立读写,必须对字节流进行包装后才能读写数据。数据流也是一种字节流。

    DataInputStream类构造方法

    DataInputStream(InputStream in)

    成员方法

    boolean readBoolean()//从输入流读取一个布尔值。

    byte readByte()//从输入流读取一个byte值。

    char readChar()//从输入流读取一个char值。

    double readDouble()//从输入流读取一个double值。

    float readFloat()//从输入流读取一个float值。

    int readInt()//从输入流中读取一个int值。

    String readUTF()//将输入流放回UTF字符串。

    5ccf8b1952102563fa0628fcce4aaf5b.png

    参考文献:

    http://blog.csdn.net/hguisu/article/details/7418161

    展开全文
  • Java输入输出流

    2021-02-28 15:08:13
    1) Java流操作有关的类或接口:Java流类图结构:1. InputStream/OutputStream字节的抽象类。2. Reader/Writer字符的抽象类。3. FileInputStream/FileOutputStream节点:以字节为单位直接操作“文件”。4. ...

    1) Java流操作有关的类或接口:

    Java流类图结构:

    1. InputStream/OutputStream

    字节流的抽象类。

    2. Reader/Writer

    字符流的抽象类。

    3. FileInputStream/FileOutputStream

    节点流:以字节为单位直接操作“文件”。

    4. ByteArrayInputStream/ByteArrayOutputStream

    节点流:以字节为单位直接操作“字节数组对象”。

    5. ObjectInputStream/ObjectOutputStream

    处理流:以字节为单位直接操作“对象”。

    6. DataInputStream/DataOutputStream

    处理流:以字节为单位直接操作“基本数据类型与字符串类型”。

    7. FileReader/FileWriter

    节点流:以字符为单位直接操作“文本文件”(注意:只能读写文本文件)。

    8. BufferedReader/BufferedWriter

    处理流:将Reader/Writer对象进行包装,增加缓存功能,提高读写效率。

    9. BufferedInputStream/BufferedOutputStream

    处理流:将InputStream/OutputStream对象进行包装,增加缓存功能,提高 读写效率。

    10. InputStreamReader/OutputStreamWriter

    处理流:将字节流对象转化成字符流对象。

    11. PrintStream

    处理流:将OutputStream进行包装,可以方便地输出字符,更加灵活。

    2)流的概念和作用

    流是一个抽象、动态的概念,是一连串连续动态的数据集合。

    对于输入流而言,数据源就像水箱,流(stream)就像水管中流动着的水流,程序就是我们最终的用户。我们通过流(A Stream)将数据源(Source)中的数据(information)输送到程序(Program)中。

    对于输出流而言,目标数据源就是目的地(dest),我们通过流(A Stream)将程序(Program)中的数据(information)输送到目的数据源(dest)中。

    输入/输出流的划分是相对程序而言的,并不是相对数据源。

    IO流的分类

    1.按流的方向分类:

    1. 输入流:数据流向是数据源到程序(以InputStream、Reader结尾的流)。

    2. 输出流:数据流向是程序到目的地(以OutPutStream、Writer结尾的流)。

    2.按处理的数据单元分类:

    1. 字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流,如FileInputStream、FileOutputStream。

    2. 字符流:以字符为单位获取数据,命名上以Reader/Writer结尾的流一般是字符流,如FileReader、FileWriter。

    3.按处理对象不同分类:

    1. 节点流:可以直接从数据源或目的地读写数据,如FileInputStream、FileReader、DataInputStream等。

    2. 处理流:不直接连接到数据源或目的地,是”处理流的流”。通过对其他流的处理提高程序的性能,如BufferedInputStream、BufferedReader等。处理流也叫包装流。

    节点流处于IO操作的第一线,所有操作必须通过它们进行;处理流可以对节点流进行包装,提高性能或提高程序的灵活性

    3.File类

    File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。

    3.1File 类的概述和构造方法:

    要想实现IO的操作,就必须知道硬盘上文件的表现形式,而java中就提供了一个File类。

    构造方法:

    public File(String pathname):根据一个路径得到一个File对象

    File(String parent, String child) : 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

    File(File parent, String child) : 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

    方式一:File file1 = new File(“e:\\demo\\test.txt”);

    方式二:File file2 = new File(“e:\\demo”,”test.txt”);

    方式三:File file3 = new File(“e:\\demo”);

    File file4 = new File(file3,”test.txt”);

    注意:以上三种方式其实效果一样

    3.2File 类的创建功能

    创建功能: boolean mkdir():创建文件夹,如果存在此文件夹,则不创建,返回结果为false;

    boolean createNewFile():创建文件,如果此文件存在,则不创建,返回结果为false;

    注意:如果需要在某个文件夹下创建文件,则此文件依赖的文件夹必须存在,否则会出现IO异常,系统找不到指定路径。

    如果创建文件或文件夹时忘记写盘符路径,默认在项目路径下。

    boolean mkdirs():用于创建文件夹,如果父文件夹不存在时,其可以自动创建父文件夹,即用于创建多级文件的。

    例如:

    File file = new File(“e:\\test\\test.txt”);

    System.out.println(“mkdir:”+file.mkdirs());

    以上两行代码执行正确。

    3.3File类的删除功能:

    public boolean delete();此方法可以删除文件或文件夹。

    注意:java中的删除不走回收站;

    被删除文件夹中不能包含子文件或文件夹

    3.4File类的判断功能:

    public boolean isDirectory();判断是否是目录

    public boolean isFile();判断是否是文件

    public boolean exists();判断是否存在

    public boolean canWrite();判断是否可写

    public boolean canRead();判断是否可读

    public boolean isHidden();判断是否隐藏

    3.5File类的重命名功能:

    public boolean renameTo(File file);

    如果路径名相同,改名,如果路径名不同,相当于改名并剪切

    注意:路径以盘符开始:绝对路径

    路径不以盘符开始:相对路径

    需求:使用程序修改某个文件的名称。

    File file = new File(“xxx.txt”);

    File newFile = new File(“test.txt”);

    System.out.println(“renameTo:”+ file.renameTo(newFile));

    File file2 = new File(“xxx.txt”);

    File newFile2 = new File(“e:\\test.txt”);

    System.out.println(“renameTo:”+ file2.renameTo(newFile2));

    3.6File 类的基本获取功能

    获取功能:

    public String getAbsolutePath();获取绝对路径

    public String getPath();获取相对路径

    public String getName();获取名称

    public long length();获取长度,字节数

    public long lastModified();获取最后一次的修改时间,毫秒值

    3.7File类的高级获取功能:

    public String[] list():获取指定目录下的所有文件或者文件夹的名称数组

    public file[] listFiles(): 获取指定目录下的所有文件或者文件夹的File数组

    4)Java IO流对象

    1.输入字节流InputStreamio 中输入字节流的继承图可见上图,可以看出:InputStream 是所有的输入字节流的父类,它是一个抽象类。

    ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。

    ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)。

    为了保证出现异常后流的正常关闭,通常要将流的关闭语句要放到finally语句块中,并且要判断流是不是null。

    5)输出字节流OutputStream

    http://2.IO 中输出字节流的继承图可见上图,可以看出:OutputStream 是所有的输出字节流的父类,它是一个抽象类。

    ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据,

    ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。

    3.字节流的输入与输出的对应

    3.1.字节流的输入流(InputStream)

    构造方法:

    FileInputStream​(File file)

    FileInputStream​(String name)

    成员方法:

    int read​()从该输入流读取一个字节的数据。

    int read​(byte[]b)从该输入流读取最多b.length个字节的数据到一个字节数组。

    int read​(byte[]b,intoff,intlen)从该输入流读取最多len个字节的数据到字节数组。

    //需求:使用字节输入流将文件中的内容读取并在控制台输出 //目标文件对象 File file = new File("d:\\test.txt");

    // //创建输入流对象 FileInputStream fis=new FileInputStream(file);

    FileInputStream fis =new FileInputStream("d:\\test.txt"); byte [] b =new byte[(int)file.length()];

    //读取内容 System.out.println( fis.read(b));

    for (int i=0;i

    System.out.print((char)b[i]);

    }

    //释放资源 fis.close();

    }

    3.2字节流的输出流(OutputStream)

    FileOutputStream 的构造方法

    public FileOutputSteam(File file);

    public FileOutputSteam(String name);

    public FileOutputSteam(String name,boolean append);

    成员方法:

    void write​(byte[] b) 将 b.length字节从指定的字节数组写入此输出流。

    void write​(byte[] b, int off, int len) 从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。

    void write​(int b) 将指定的字节写入此输出流。

    void close​() 关闭此输出流并释放与此流相关联的任何系统资源。

    //指定输出内容的文件

    // File file = new File("d:\\test.txt");

    //创建输出流的对象

    // OutputStream os=new FileOutputStream(file);

    /**

    * A;创建File对象

    * B:新建文件

    * C:写出内容

    */

    OutputStream os =new FileOutputStream("d:\\test.txt");

    //准备输出的内容

    String str = "Hello io";

    //将输出内容按字节方式进行输出

    // os.write(str.getBytes());

    os.write(str.getBytes(),0,4);//0表示起始

    os.close();

    6.字符输入流Reader在上面的继承关系图中可以看出:

    Reader 是所有的输入字符流的父类,它是一个抽象类。

    CharReader、StringReader 是两种基本的介质流,它们分别将Char 数组、String中读取数据。PipedReader 是从与其它线程共用的管道中读取数据。

    BufferedReader 很明显就是一个装饰器,它和其子类负责装饰其它Reader 对象。

    FilterReader 是所有自定义具体装饰流的父类,其子类PushbackReader 对Reader 对象进行装饰,会增加一个行号。

    InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader 可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。我们可以从这个类中得到一定的技巧。Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。后面会有Reader 与InputStream 的对应关系。

    基类:Reader 抽象类

    子类:InputStreamReder

    构造方法:

    按系统默认字符集进行文件内容的读取

    InputStreamReader​(InputStream in) 创建一个使用默认字符集的InputStreamReader。

    按指定字符集进行文件内容的读取

    InputStreamReader​(InputStream in, String charsetName) 创建一个使用命名字符集的

    File file =new File("d:\\\\test.txt");

    //构造InputStream对象

    InputStream is = new FileInputStream("d:\\\\test.txt");

    //创建字符输入流对象

    InputStreamReader isr= new InputStreamReader(is);

    //读取内容

    // int b = -1;

    // while ((b=isr.read())!=-1){

    // System.out.print((char)b);

    // }

    //创建存储的缓冲区

    char [] chs = new char [(int)file.length()];

    //将文件内容读取到缓冲区chs

    isr.read(chs);

    for (char c:chs

    ) {

    System.out.print(c);

    }

    //释放资源

    isr.close();

    is.close();

    字符输入流的便捷类:FileReder 注意:不能指定特定编码格式,其按照系统默认的编码格式进行文件读取

    构造方法:

    FileReader​(File file) 创建一个新的 FileReader ,给出 File读取。

    FileReader​(String fileName) 创建一个新的 FileReader ,给定要读取的文件的名称。

    FileReader fr = new FileReader("d:\\test.txt");

    int b =-1;

    while (( b=fr.read() )!=-1){

    System.out.print((char)b);

    }

    fr.close();

    7.字符输出流Writer

    在上面的关系图中可以看出:Writer 是所有的输出字符流的父类,它是一个抽象类。

    CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向Char 数组、String 中写入数据。PipedWriter 是向与其它线程共用的管道中写入数据,

    BufferedWriter 是一个装饰器为Writer 提供缓冲功能。

    PrintWriter 和PrintStream 极其类似,功能和使用也非常相似。

    OutputStreamWriter 是OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类(具体可以研究一SourceCode)。功能和使用和OutputStream 极其类似,后面会有它们的对应图。

    字符输出流:Writer抽象类

    子类:OutputStreamWriter

    构造方法

    OutputStreamWriter​(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。

    OutputStreamWriter​(OutputStream out, String charsetName) 创建一个使用命名字符集的OutputStreamWriter。

    成员方法:

    void write​(char[] cbuf, int off, int len) 写入字符数组的一部分。

    void write​(int c) 写一个字符

    void write​(String str, int off, int len) 写一个字符串的一部分

    //创建字符输出流对象,并指定转储文件

    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\\\pet.template"),"utf-8");

    String info = "您好,我的名字是{name},我是一只{type},我的主人{master}";

    //写出操作

    osw.write(info);

    osw.close();

    FileWriter:字符输出流的便捷类,也是OutputStreamWriter的子类

    构造方法:

    FileWriter​(File file) 给一个File对象构造一个FileWriter对象。

    FileWriter​(File file, boolean append) 给一个File对象构造一个FileWriter对象。

    FileWriter​(String fileName) 构造一个给定文件名的FileWriter对象。

    FileWriter​(String fileName, boolean append) 构造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据。

    成员方法:

    public void flush();

    public void close();

    void write​(char[] cbuf, int off, int len) 写入字符数组的一部分。

    void write​(int c) 写一个字符

    void write​(String str, int off, int len) 写一个字符串的一部分

    9.字符流与字节流转换

    转换流的特点:其是字符流和字节流之间的桥梁

    可对读取到的字节数据经过指定编码转换成字符

    可对读取到的字符数据经过指定编码转换成字节

    何时使用转换流?当字节和字符之间有转换动作时;

    流操作的数据需要编码或解码时。

    具体的对象体现:InputStreamReader:字节到字符的桥梁

    OutputStreamWriter:字符到字节的桥梁

    这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。

    10.RandomAccessFile类

    该对象并不是流体系中的一员,其封装了字节流,同时还封装了一个缓冲区(字符数组),通过内部的指针来操作字符数组中的数据。 该对象特点:该对象只能操作文件,所以构造函数接收两种类型的参数:a.字符串文件路径;b.File对象。

    该对象既可以对文件进行读操作,也能进行写操作,在进行对象实例化时可指定操作模式(r,rw)

    注意:该对象在实例化时,如果要操作的文件不存在,会自动创建;如果文件存在,写数据未指定位置,会从头开始写,即覆盖原有的内容。 可以用于多线程下载或多个线程同时写数据到文件。

    经典代码:

    1.使用流读取文件内容(经典代码,一定要掌握)

    import java.io.*;

    public class TestIO2 {

    public static void main(String[] args) {

    FileInputStream fis = null;

    try {

    fis = new FileInputStream("d:/a.txt"); // 内容是:abc

    StringBuilder sb = new StringBuilder();

    int temp = 0;

    //当temp等于-1时,表示已经到了文件结尾,停止读取

    while ((temp = fis.read()) != -1) {

    sb.append((char) temp);

    }

    System.out.println(sb);

    } catch (Exception e) {

    e.printStackTrace();

    } finally {

    try {

    //这种写法,保证了即使遇到异常情况,也会关闭流对象。

    if (fis != null) {

    fis.close();

    }

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    }

    为了保证出现异常后流的正常关闭,通常要将流的关闭语句要放到finally语句块中,并且要判断流是不是null。

    2.利用文件流实现文件的复制

    package d804_2;

    import java.io.*;

    public class IoDemo2 {

    public static void main(String[] args) {

    copyFile("d:\\p.txt","d:\\u2.txt");

    }

    static void copyFile(String src, String dec) {

    FileInputStream fis = null;

    FileOutputStream fos = null;

    //为了提高效率,设置缓存数组!(读取的字节数据会暂存放到该字节数组)

    byte[] buffer = new byte[1024];

    int temp = 0;

    try {

    fis = new FileInputStream(src);

    fos = new FileOutputStream(dec);

    //边读边写

    //temp指的是本次读取的真实长度,temp等于-1时表示读取结束

    while ((temp = fis.read(buffer)) != -1) {

    /*将缓存数组中的数据写入文件中,注意:写入的是读取的真实长度;

    *如果使用fos.write(buffer)方法,那么写入的长度将会是1024,即缓存

    *数组的长度*/

    fos.write(buffer,0,temp);

    }

    } catch (FileNotFoundException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    } finally {

    try {

    if (fos != null) {

    fos.close();

    }

    } catch (IOException e) {

    e.printStackTrace();

    }

    try {

    if (fis != null) {

    fis.close();

    }

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    }

    展开全文
  • Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据,字符串流,对象,zip文件....本文的目的是为大家做一个简要的介绍。是一个很形象的概念,当程序...

    Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象。在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流....本文的目的是为大家做一个简要的介绍。

    流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样,如下图:

    42133.gif

    Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的:

    42134.gif

    42135.gif

    42136.gif

    42137.gif

    在这其中InputStream和OutputStream在早期的Java版本中就已经存在了,它们是基于字节流的,而基于字符流的Reader和Writer是后来加入作为补充的。以上的层次图是Java类库中的一个基本的层次体系。

    在这四个抽象类中,InputStream和Reader定义了完全相同的接口:

    int read()

    int read(char cbuf[])

    int read(char cbuf[], int offset, int length)

    而OutputStream和Writer也是如此:

    int write(int c)

    int write(char cbuf[])

    int write(char cbuf[], int offset, int length)

    这六个方法都是最基本的,read()和write()通过方法的重载来读写一个字节,或者一个字节数组。

    更多灵活多变的功能是由它们的子类来扩充完成的。知道了Java输入输出的基本层次结构以后,本文在这里想给大家一些以后可以反复应用例子,对于所有子类的细节及其功能并不详细讨论。

    import java.io.*;

    public class IOStreamDemo {

    public void samples() throws IOException {

    //1. 这是从键盘读入一行数据,返回的是一个字符串 BufferedReader stdin =new BufferedReader(new InputStreamReader(System.in));

    System.out.print("Enter a line:");

    System.out.println(stdin.readLine());

    //2. 这是从文件中逐行读入数据

    BufferedReader in = new BufferedReader(new FileReader("IOStreamDemo.java"));

    String s, s2 = new String();

    while((s = in.readLine())!= null)

    s2 += s + "\n";

    in.close();

    //3. 这是从一个字符串中逐个读入字节 StringReader in1 = new StringReader(s2);

    int c;

    while((c = in1.read()) != -1)

    System.out.print((char)c);

    //4. 这是将一个字符串写入文件 try {

    BufferedReader in2 = new BufferedReader(new StringReader(s2));

    PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));

    int lineCount = 1;

    while((s = in2.readLine()) != null )

    out1.println(lineCount++ + ": " + s);

    out1.close();

    } catch(EOFException e) {

    System.err.println("End of stream");

    }

    }

    }

    对于上面的例子,需要说明的有以下几点:

    1.BufferedReader是Reader的一个子类,它具有缓冲的作用,避免了频繁的从物理设备中读取信息。它有以下两个构造函数:

    BufferedReader(Reader in)

    BufferedReader(Reader in, int sz)

    这里的sz是指定缓冲区的大小。

    它的基本方法:

    void close() //关闭流

    void mark(int readAheadLimit) //标记当前位置

    boolean markSupported() //是否支持标记

    int read() //继承自Reader的基本方法

    int read(char[] cbuf, int off, int len) //继承自Reader的基本方法

    String readLine() //读取一行内容并以字符串形式返回

    boolean ready() //判断流是否已经做好读入的准备

    void reset() //重设到最近的一个标记

    long skip(long n) //跳过指定个数的字符读取

    void close() //关闭流

    void mark(int readAheadLimit) //标记当前位置

    boolean markSupported() //是否支持标记

    int read() //继承自Reader的基本方法

    int read(char[] cbuf, int off, int len) //继承自Reader的基本方法

    String readLine() //读取一行内容并以字符串形式返回

    boolean ready() //判断流是否已经做好读入的准备

    void reset() //重设到最近的一个标记

    long skip(long n) //跳过指定个数的字符读取

    2. InputStreamReader是InputStream和Reader之间的桥梁,由于System.in是字节流,需要用它来包装之后变为字符流供给BufferedReader使用。

    3. PrintWriter out1 = new PrintWriter(new BufferedWriter(newFileWriter("IODemo.out")));

    这句话体现了Java输入输出系统的一个特点,为了达到某个目的,需要包装好几层。首先,输出目的地是文件IODemo.out,所以最内层包装的是FileWriter,建立一个输出文件流,接下来,我们希望这个流是缓冲的,所以用BufferedWriter来包装它以达到目的,最后,我们需要格式化输出结果,于是将PrintWriter包在最外层。

    Java提供了这样一个功能,将标准的输入输出流转向,也就是说,我们可以将某个其他的流设为标准输入或输出流,看下面这个例子:

    import java.io.*;

    public class Redirecting {

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

    PrintStream console = System.out;

    BufferedInputStream in = new BufferedInputStream( new FileInputStream( "Redirecting.java"));

    PrintStream out = new PrintStream( new BufferedOutputStream( new FileOutputStream("test.out")));

    System.setIn(in);

    System.setOut(out);

    BufferedReader br = new BufferedReader( new InputStreamReader(System.in));

    String s;

    while((s = br.readLine()) != null)

    System.out.println(s);

    out.close();

    System.setOut(console);

    }

    }

    在这里java.lang.System的静态方法:

    static void setIn(InputStream in)

    static void setOut(PrintStream out)

    提供了重新定义标准输入输出流的方法,这样做是很方便的,比如一个程序的结果有很多,有时候甚至要翻页显示,这样不便于观看结果,这是你就可以将标准输出流定义为一个文件流,程序运行完之后打开相应的文件观看结果,就直观了许多。

    Java流有着另一个重要的用途,那就是利用对象流对对象进行序列化。下面将开始介绍这方面的问题。

    在一个程序运行的时候,其中的变量数据是保存在内存中的,一旦程序结束这些数据将不会被保存,一种解决的办法是将数据写入文件,而Java中提供了一种机制,它可以将程序中的对象写入文件,之后再从文件中把对象读出来重新建立。这就是所谓的对象序列化Java中引入它主要是为了RMI(Remote Method Invocation)和Java Bean所用,不过在平时应用中,它也是很有用的一种技术。

    所有需要实现对象序列化的对象必须首先实现Serializable接口。下面看一个例子:

    import java.io.*;

    import java.util.*;

    public class Logon implements Serializable {

    private Date date = new Date();

    private String username;

    private transient String password;

    Logon(String name, String pwd) {

    username = name;

    password = pwd;

    }

    public String toString() {

    String pwd = (password == null) ? "(n/a)" : password;

    return "logon info: \n " + "username: " + username + "\n date: " + date + "\n password: " + pwd;

    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {

    Logon a = new Logon("Morgan", "morgan83");

    System.out.println( "logon a = " + a);

    ObjectOutputStream o = new ObjectOutputStream( new FileOutputStream("Logon.out"));

    o.writeObject(a);

    o.close();

    int seconds = 5;

    long t = System.currentTimeMillis() + seconds * 1000;

    while(System.currentTimeMillis() < t) ;

    ObjectInputStream in = new ObjectInputStream( new FileInputStream("Logon.out"));

    System.out.println( "Recovering object at " + new Date());

    a = (Logon)in.readObject();

    System.out.println("logon a = " + a);

    }

    }

    类Logon是一个记录登录信息的类,包括用户名和密码。首先它实现了接口Serializable,这就标志着它可以被序列化。之后再main方法里ObjectOutputStream o = newObjectOutputStream( new FileOutputStream("Logon.out"));新建一个对象输出流包装一个文件流,表示对象序列化的目的地是文件Logon.out。然后用方法writeObject开始写入。想要还原的时候也很简单ObjectInputStreamin = new ObjectInputStream( newFileInputStream("Logon.out"));新建一个对象输入流以文件流Logon.out为参数,之后调用readObject方法就可以了。

    需要说明一点,对象序列化有一个神奇之处就是,它建立了一张对象网,将当前要序列化的对象中所持有的引用指向的对象都包含起来一起写入到文件,更为奇妙的是,如果你一次序列化了好几个对象,它们中相同的内容将会被共享写入。这的确是一个非常好的机制。它可以用来实现深层拷贝。

    关键字transient在这里表示当前内容将不被序列化,比如例子中的密码,需要保密,所以没有被写入文件。

    对Java的输入输出功能,就浅浅的介绍到这里,本文的目的只是开一个好头,希望能让大家对Java输入输出流有个基本的认识。

    展开全文
  • 理解JAVA输入输出流

    2021-03-11 17:02:18
    一、IO流作用IO流就是用来处理设备上的数据,包括文件,磁盘,网络等二、分类按处理的数据类型不同:字符流、字节流按流向不同:JAVA 中流的处理是单向的,分为输入流和输出流三、抽象类1...我们以文件输入输出流进...

    一、IO流作用

    IO流就是用来处理设备上的数据,包括文件,磁盘,网络等

    二、分类

    按处理的数据类型不同:字符流、字节流

    按流向不同:JAVA 中流的处理是单向的,分为输入流和输出流

    三、抽象类

    1、字节流抽象类

    InputStream 输入流

    OutputStream输出流

    2、字符流抽象类

    Reader 输入字符流

    Writer 输出字符流

    四、JAVA中流体系架构

    6c715683f7d7f82e58e6d7b3b28fab36.png

    有一些对流进行操作的基本的方法,我们以文件输入输出流进行说明:

    1、InputStream是所有的输入字节流的父类,它是一个抽象类

    fcd309b632393c4dd09ff157b5c0bc73.png

    假如有个文件a.log 里面存放的数据是

    f31db110b9c4bdd9707ee0c684d9d0c7.png

    (1)read() 从输入流中读取数据的下一个字节,返回0到255范围内的int字节值

    通常的用法是

    2f76ec740e2e82b82747b9ce67a5fd63.png

    返回值

    fddf0356a9fc488a80d17161d30f17ec.png

    (2)read(byte[]) 从输入流中读取的一定数量字节数并将它们存储到缓冲区数组中

    通常的用法是:

    0450c76fbdb3730a6d27f5e12b40ade8.png

    返回值为:

    aaa

    2、OutputStream是所有输出字节流的子类,他也是一个抽象类

    1cf556f8c7e68a5dd5861d484e3c5310.png

    (1)write(int) 写入一个0-255范围的int字节到输出流

    362e7c95561ce59d27d77a72b4b28159.png

    然后我们发现b.log里的内容为a:

    e7116fb976d46d937b12861fdcac1a68.png

    (2)write(byte[]) 写入byte数组中的数据到输出流

    d2268067d7514f36a1f284c9cd5445bb.png

    然后我们发现b.log文件中的数据为123

    d94bddcf4075a358e47cab3861035d01.png

    3、Reader是所有的输入字符流的父类,它是一个抽象类

    简单使用方式同InputStream,例子如下

    0c16fcafdd6248e212a0e71c8ddf34e7.png

    4、Writer是所有的输出字符流的父类,它是一个抽象类

    简单使用方式同OutputStream,例子如下

    5cec8ce6b8d1d7ff018291813f32816d.png

    写入到b.txt文件的数据

    c497c6c8df5e5a3f7a271aeea0fc0310.png

    五、IO流中的设计模式

    JAVA中的IO流有很多种,但是都会按照需要继承InputStream,OutputStream,Reader,Writer的一种,同时为了更好的扩展这些类,采用了装饰者模式。

    1、首先举一个简单的例子

    0f18e054315dcaa8d3816642dbb0d0a7.png

    比如上面这个文件输入流,会读取文件中的字节,然后打印出来,如果我们要增强这个类,比如要使用缓冲区怎么办,我们可以使用BufferedInputStream

    12920d51a54c3c04f857b48438e6d8d3.png

    我们查看一下BufferedInputStream的构造函数

    eaa78ff4bbc53c01e1652224c85d8f40.png

    发现这个函数实例化的时候需要传一个InputStream,然后在我们的例子中fileInputStream是继承了InputStream的类,所以我们可以交给BufferedInputStream使用,同时BufferedInputStream也会继承

    InputStream的抽象类,那么就一定会实现抽象类的所有方法,进而实现了类的增强,其他的类同理

    六、使用规律总结

    (1)明确要操作的数据是数据源还是数据目的(要读还是要写)?

    源:InputStream  Reader

    目的:OutputStream  Writer

    (2)明确要操作的设备上的数据是字节还是文本?

    字节:InputStream

    文本:Reader

    字节:OutputStream

    文本:Writer

    (3)明确数据所在的具体设备?

    硬盘:文件 File开头

    内存:数组,字符串

    键盘:System.in

    网络:Socket

    (4)明确是否需要额外功能?

    需要转换—转换流 InputStreamReader OutputStreamWriter

    需要高效—缓冲流 Bufferedxxx

    多个源—序列流 SequenceInputStream

    对象序列化—ObjectInputStream,ObjectOutputStream

    保证数据的输出形式—打印流PrintStream Printwriter

    操作基本数据,保证字节原样性—DataOutputStream,DataInputStream

    80a18ece01427e9d40bbb2d30172bb8b.png

    展开全文
  • Java输入输出流总结

    2021-02-26 12:51:29
    它们是各大输入输出流的父类。输入流:是要从数据源(键盘,文件,磁盘等)传到(这里我们叫做read)计算机内存、程序的一种流(为什么传到内存?因为要进行数据处理啊!数据处理当然要将数据传到计算机内存进行处理),...
  • JAVA输入输出流实验报告单吉林大学应用技术学院实验(训)报告单(电子版)实验编号08实验班级540972实验名称输入输出流实验任务书编号08实验组别27实验组成员陈静报告人陈静指导教师罗凡实 验 报 告1 读取文本文件内容...
  • java输入输出流又是什么呢?下面的文章要给大家介绍的就是这个方面的内容,一起来了解一下吧。Java当中,所有的数据都是使用流读写的,流是一组有序的数据序列,将数据从一个地方带到另一个地方,根据数据流向的不同...
  • 浅谈java输入输出流

    2021-03-15 21:17:05
    1.BufferedReader是Reader的一个子类,它具有缓冲的作用,避免了频繁的从物理设备中读取信息。它有以下两个构造函数:...它的基本方法:voidclose() //关闭voidmark(int readAheadLimit)//标记当前位置b...
  • Java所有的I/O机制都是基于数据进行输入输出,这些数据表示了字符或者字节数据的流动序列。任何Java中表示数据源的对象都会提供以数据的方式读写它的数据的方法。Java.io是大多数面向数据的输入/输出类的...
  • Java 输入输出流

    2021-02-28 18:33:39
    1.什么是IOJava中I/O操作主要是指使用Java进行输入,输出操作.Java所有的I/O机制都是基于数据进行输入输出,这些数据表示了字符或者字节数据的流动序列。Java的I/O提供了读写数据的标准方法。任何Java中表示...
  • 1.什么是IOJava中I/O操作主要是指使用Java进行输入,输出操作.Java所有的I/O机制都是基于数据进行输入输出,这些数据表示了字符或者字节数据的流动序列。Java的I/O提供了读写数据的标准方法。任何Java中表示...
  • 学会Java输入输出流,看这一篇就够了,建议收藏!

    千次阅读 多人点赞 2021-10-13 20:42:30
    一起回顾一下java流的使用。
  • 网络程序的很大一部分是简单的输入输出,即从一个系统向另一个系统移动字节。字节就是字节,在很大程度上,读服务器发送的数据与读取文件没什么不同;向客户传送数据与写入一个文件也没有什么区别。 Java中输入和...
  • JAVA输入输出流实验报告单》由会员分享,可在线阅读,更多相关《JAVA输入输出流实验报告单(8页珍藏版)》请在人人文库网上搜索。1、吉林大学应用技术学院实验(训)报告单(电子版)实验编号08实验班级540972实验名称...
  • 正文 ZooKeeper 很流行,有个基本的疑问: ZooKeeper 是用来做什么的? 之前没有ZK,为什么会诞生 ZK? OK,解答一下上面的疑问:(下面是凭直觉说的) ZooKeeper 是用于简化分布式应用开发的,对开发者屏蔽一些...
  • importjava.io.*;publicclassfuji{publicstaticvoidmain(String...//记录是否输入输出完成byteru[]=newbyte[2000];//存放读取的内容bytechu[]=newbyte[2000];//读...import java.io.*;public class fuji{public st...
  • 缓冲输入输出流输入输出流的结合使用代码如下: 新建一个空文件score.txt 缓冲流的使用,将输入输出流对象作为参数传入: 数据的写操作: public class BufferedDemo { public static void main(String[] args) {...
  • 输入/输出(I/O)是指程序与外部设备或其他计算机进行交互的操作。 流(stream)的概念最早...流的方向是重要的,根据流的方向,流可以大致分成两类:输入流和输出流。 当程序需要读取数据时,就会开启一个通向数据源
  • 原文:...在java.io包中有四个基本类:InputStream、OutputStream及Reader、Writer类,它们分别处理字节流和字符流:基本数据流的I/O输入/输出字节流字符流输入流InputstreamReader输出流OutputStre...
  • 转 ...Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象。在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域...
  • 今天我想实现的功能是基本的文件操作,从输入in文件里读取数据,然后程序处理之后输出到out输出文件中,以助于ACM中的"对拍"。先测试了一下BufferedReader的readLine()方法,这个方法是一次直接读取一行,失败返回...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 343,815
精华内容 137,526
关键字:

java输入输出流

java 订阅