JAVA IO流

IO流种类


一.字节流:字节流处理单元为8位的字节,字节流可以适用于任何类型的对象,包括文本和二进制,用于处理磁盘,内存,键盘等设备上的数据。字节流由InputStream和OutputStream两个抽象类组成。

InputStream子类图:

InputStream是所有子类的父类。 

InputStream主要子类功能
功能

ByteArrayInputStream

包含一个内部缓冲区,该缓冲区包含从流中读取的字节
PipedInputStream管道输入流连接管道输出流,并向管道输出流写入数据字节
FileInputStream从文件中获取字节
SequenceInputStream从第一个输入流到最后一个输入流依次读取
FilterInputStream拥有其他一些输入流,将这些流作用为其数据源

OutputStream子类图:

OutputStream是所有输出流的父类

OutputStream主要子类功能
功能
ByteArrayOutputSteam实现一个输出流,并将数据写入一个byte数组
FileOutStream将数据写入文件
PipeOutptStream管理输出流连接到管道输入流,传输数据
FilterOutputStream过滤输出流的父类

二.字符流:字符流处理单元为16位的unicode字符,字符流通常处理文本文件,由Reader处理输入字符和Writer处理输出字符两个抽象类组成

Reader抽象类:

Reader的主要子类
功能
BufferedReader从字符输入流中读取文本
InputStreamReader字节流通向字符流的桥梁,使用指定的charset读取字符并解码为字符
CharArrayReader实现一个可用作字符输入流的字符缓冲区
FileReader用来读取字符文件
FilterReader用于读取已经过滤的字符流的抽象类
RushbackReader允许将字符推回字符流reader
PipedReader从管道中读取字符
String一个字符串的字符流

 Writer抽象类:

Writer的主要子类
功能
BufferedWriter将文本写入字符输出流
CharArrayWriter实现一个可用于Writer的字符缓冲区
FilterWriter用于写入已经过滤的字符流的抽象类
OutputWriter字符流通向字节流的桥梁,可用指定的charset将要写入流中的字符编码为字节
PipedWriter向管道中写入字符
PrintWriter向文本输出流打印格式化对象
StringWriter一个字符流收集其在字符串缓冲区中的输出,然后建立一个字符串


标准输入输出流

标准输入输出流为java.lang.system包,主要分为三种:

(1)Systeam.in:字节输入流类InputStream的对象,代表标准输入,其中read()方法从键盘接受数据

(2)System.out:输出流OutputStream的对象,代表标准输出,有print()和println();两个方法

(3)System.err:标准错误信息输出流

注:标准输入输出还有java.util.Scanner,javaj.io.Console,java.utilFormatter类


采用System.in读取数据:

public class IOTest {
    public static void main(String[] args) throws IOException {
        System.out.println("请输入:");
        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
        String string;
        while(( string=in.readLine()).length()!=0){
            System.out.println(string);
            System.exit(0);
        }
    }
}

实现从键盘读取数据调用了System.in,InputStream,BufferedReader类:System.in标准输入,InputStream实现字节到字符的转换,最后BufferedReader将字符送进缓冲区


java.util.Scanner类:可以对字符串和基本数据类型进行分析,用于扫描输入文本信息,在使用Scanner前要使用该类创建一个对象:Scanner sc = new Scanner(System.in)

public class IOTest {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
        System.out.println("输入文本:");
        String string=sc.next();
       System.out.println(string);
    }
}

Scanner方法:

public boolean nextBoolean();    
public short nextShort();   
public int nextInt();
public double nextDouble();
public float nextFloat();
public String next();

io.Console类:适用与输入安全密码

Java.io.Console主要方法
方法说明
void flush()刷新控制台并强制立即写入所有缓冲的输出
Console formant(String fmt,Object...args)指定字符串格式和参数生成格式化的新字符串输出流
Console printf(String format,Object..args)使用指定字符串格式和参数将格式化字符串写入此控制台输出流
Reader read()获取与此控制台关联的唯一Reader对象

String reader()

从控制台获取单行文本
String reader(String fmt,Object...args)提供一个格式化提示,然后从控制台读取单行数据
char[] readPassword()从控制台读取密码,禁用回显
char[] readPassword(String fmt,Object...args)提供一个格式化提示,然后从控制台读取密码,禁用回显
PrintWriter writer()获取与控制台关联的唯一PrintWriter对象 

Console类包含一个printf()方法,和C语言printf()方法用一样



文件输入输出流

文件输入输出流:书局存储在文件里,也可以从文件中获取,文件内容可以分为按字节读取,按字符读取和随机读取


字符输出流

字符输出流:将文本数据存储到文本文件中,对字符流的操作采用字符输出方式,应用到FileWriter和BufferedWriter两个类

1.FileWriter类:是Writer的子类OutputSteam下的子类,提供了一组writer()方法实现向文件输出输入字符串,字符数组,整型数据

FileWriter类的方法
方法说明
void close()关闭流,但要先刷新它
writer append()将指定字符添加到此writer

FileWriter(File file)

FileWriter(File file,boolean apped)

FileWriter(FileDescriptorr fd)

FileWriter(String fileName)

FileWriter(String file;Name,boolean append)

一组构造方法,根据指定的File

对象,文件名或文件描述符构

造一个FileWriter对象

void writer(char[] cbuf)写入字符串数组
void writer(char[] cbuf,int off,int len)写入字符数组的某一部分
void writer(int c)写入单个字符
void writer(String str)写入字符串
void writer(String str,int off,int len)写入字符串的某一部分

创建一个文件,并采用FileWriter向文件写入数据,最后要close文件才能向文件读取数据

public class IOTest {
    public static void main(String[] args) throws IOException {
      String filename="C:\\Users\\myun\\Desktop\\hello.txt";
        FileWriter writer=new FileWriter(filename);
        writer.write("hello world!hello time!");
        writer.close();
    }
}

2.BufferWriter类:如果输出的内容较多,可以采用更高效的缓冲器流类BufferedWriter来输出字符,方法和FileWriter一样,不过BufferedWriter添加了newLine()方法提供流换行功能

BufferedWriter类的方法
方法说明
void close()关闭流,但要先刷新它
writer append()将指定字符添加到此writer

BufferedWriter(File file)

BufferedWriter(File file,boolean apped)

BufferedWriter(FileDescriptorr fd)

BufferedWriter(String fileName)

BufferedWriter(String file;Name,boolean append)

一组构造方法,根据指定的File

对象,文件名或文件描述符构

造一个BufferedWriter对象

void writer(char[] cbuf)写入字符串数组
void writer(char[] cbuf,int off,int len)写入字符数组的某一部分
void writer(int c)写入单个字符
void writer(String str)写入字符串
void writer(String str,int off,int len)写入字符串的某一部分
void newLine()换行功能

创建一个文件,采用BufferedWriter向文件输出字符流

public class IOTest {
    public static void main(String[] args) throws IOException {
      String filename="C:\\Users\\myun\\Desktop\\hello.txt";
        BufferedWriter writer=new BufferedWriter(new FileWriter(filename));
        writer.write("hello world!");
        writer.newLine();
        writer.write("hello time!");
        writer.newLine();
        writer.close();
    }
}

字符输入流

字符输入流:从文本中读取数据时,采用字符输入方式,用于FileReader和BufferedReader两个类

1.FileReader类:继承Reader抽象类的子类InputStream,提供一组read()方法用于单个字符,字符串的读取

FileReader类的方法
方法说明
int read()读取单个数据
int read(char[] cbuf)将字符串读入数组
int read(char[] cbuf,int off,int len)将字符串一部分读入数组
int read(CharBuffer target)将字符读入指定字符缓冲区
boolean ready()判断是否读取此流
void close()关闭该流并释放与之关联的所有资源
FileReader(File file)在给定从中读取数据的File的情况下,创建一个新的FileReader
FileReader(FileDescriptor fd)在给定从中读取数据的FileDescriptor的情况下,创建一个新的FileReader
FileReader(String fileName)在给定从中读取的文件名的情况下,创建一个新的FileReader

使用FileReader从文件中读取字符流数据:

public class IOTest {
    public static void main(String[] args) throws IOException {
      String filename="C:\\Users\\myun\\Desktop\\hello.txt";
      char[] buff=new char[100];  //定义数组。用来保持每次读到的数据
        int n;   //每次读到的字符长度
    FileReader reader=new FileReader(filename);
    while((n=reader.read(buff))!=-1){
        for(int i=0;i<n;i++){
            System.out.print(buff[i]);
        }
    }
    reader.close();
    }
}

2.BufferedReader类:继承Readerl类,用于从字符输入流读取文本,缓冲字符,通过ReadLine()方法来鉴别换行符

方法说明
int read()读取单个数据
int read(char[] cbuf)将字符串读入数组
int read(char[] cbuf,int off,int len)将字符串一部分读入数组
int read(CharBuffer target)将字符读入指定字符缓冲区
boolean ready()判断是否读取此流
void close()关闭该流并释放与之关联的所有资源
FileReader(File file)在给定从中读取数据的File的情况下,创建一个新的FileReader
FileReader(FileDescriptor fd)在给定从中读取数据的FileDescriptor的情况下,创建一个新的FileReader
FileReader(String fileName)在给定从中读取的文件名的情况下,创建一个新的FileReader
readLine()鉴别换行符

使用BufferedReader从文件中逐行读取数据:

public class IOTest {
    public static void main(String[] args) throws IOException {
      String filename="C:\\Users\\myun\\Desktop\\hello.txt";
     String line;
     BufferedReader in=new BufferedReader(new FileReader(filename));
     line=in.readLine();
      while (line!=null){
         System.out.println(line);
         line=in.readLine();
     }
    in.close();
    }
}

字节输出流

字符输出流:如果把非文本数据存储到一个文件中,这些数据可以是文本格式和其他非字符信息格式,图像,音频,视频等,这时可以采用字节的方式将数据输出到文件中,纯文本数据也可以采用字节输出方式。相关类有FileOutputStream,DataOutputStream,BufferedOutputStream


1.FileOutputStream类:继 承抽象类OutputStream,将数据输出到File对象或FileDescriptor文件描述符中

FileOutputStream类常用方法
方法说明
void close()关闭文件输出流并释放与此流的所有系统资源
void finalize()清理到文件的连接
FileChannel getChannel()返回与从文件流有关的FileChannel对象,FileChannel属于NIO
FIleDescriptor getFD()返回与当前输出流有关的文件描述
void write(byte[] b)将b.length个字节从指定byte数组写到此文件的输出流
void write(byte[] b,int off,int len)

将指定的byte数组从偏移量off开始的len字节写到文件输出流

void write(int b)将字节写到文件输出流
FileOutputStream(File file)构造方法,创建一个向指定File对象的file文件中写入数据的文件输出流
FileOutputStream(String name)构造方法,创建一个向名称为name的文件中写入数据的文件流

2.DataOutputStream类:继承于FileOutputStream类,是数据输出流。允许程序将基本Java数据类型写入输出流

DataOutputStream类常用方法
方法说明
void flush()清空此数据输出流
int size()写入此输出流的字节数
void write(byte[] b,int off,int len)将指定byte数组从偏移量off开始的len个字节写入输出流
void write(int b)将指定字节写入输出流
void writeBoolean(boolean v)将一个boolean值以1-byte值形式写入输出流
void writeByte(int v)将一个byte值以1-byte值形式写入输出流
void write(String s)将字符串按字节顺序写入输出流
void writeChar(int v)将一个char值以2-byte值形式写入输出流,先写高字节
void writeDouble(double v)将使用Double类的方法doubleToLongBits方法将double参数转换为一个long值,再将long值以8-byte的形式写入输出流
void writeFloat(float v)使用Float类的floatToLongBits方法将float参数转换为int,再将int值以4-byte值的形式输出流
void writeInt(int v)将int值以4-byte值形式写入输出流
void writeLong(long v)

将long值以8-byte值形式写入输出流

void writeShort(int v)将一个short值以2-byte值形式写入输出流
void writeChars(String s)将字符串按字符顺序写入输出流
void writeUTF(String str)以与机器无关方式使用UTF-8编码将一个字符串写入输出流
DataOutputStream(OutputStream out)创建一个新的输出流,将数据写入指定的输出流

3.BufferedOutputStream类:实现缓冲的输出流

BufferedOutputStream类常用方法
方法说明
void flush()刷新缓冲的输出流
void write(byte[] b,int off,int len)将byte数组从偏移量off开始的len个字节写入到此输出流
void write(int b)将字节b写入缓冲的输出流
BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,将数据写入指定的底层输出流
BufferedOutputStream(OutputStream out,int size)创建一个缓冲输出流,将具有指定缓冲区大小的数据写入指定的底层输出流

使用BufferedOutputStream将不同数据写入文件:

public class IOTest {
    public static void main(String[] args) throws IOException {
     String filename="C:\\Users\\myun\\Desktop\\bainary.dat";
     DataOutputStream dataOutputStream=new DataOutputStream(new BufferedOutputStream(new FileOutputStream(filename)));
     dataOutputStream.writeInt(0);
     System.out.println(dataOutputStream.size()+"已写入字节");
        dataOutputStream.writeDouble(39.3);
        System.out.println(dataOutputStream.size()+"已写入字节");
        dataOutputStream.writeBytes("hello world");
        System.out.println(dataOutputStream.size()+"已写入字节");
        dataOutputStream.close();
    }
}

字节输入流

字节输入流:提供FileInputStream,DataInputStream,BufferedInputStream以字节方式从文件系统中读取数据

1.FileInputStream类:继承于InputStream类,适用于从文件系统的文件读取字节,用于读取二进制的原始字节源

FileInputStream类常用方法
方法说明
int available()返回输入流中估计剩余的,实际可读取的字节数
void close()关闭此文件输入流并释放与此类有关的系统资源
void finalize()确保在不再引用文件输入流时调用其close方法
FileChannel getChannel()返回与此文件输入流有关的唯一FileChannel对象
FileDescriptor getFD()返回当前FileInputStream所连接文件的FileDescriptor对象
int read()从此输入流中读取一个数据字节
int read(byte[] b)从从输入流中将最多b.length字节的数据读入一个byte数组bzhong
int read(byte[] b,int off,int len)从此输入流中将最多len字节的数据读入一个byte数组中
long skip(long n)从输入流中跳过并丢弃n字节数据
FileInputStream(File file)通过打开与实际文件的连接来创建一个FileInputStream
FileInputStream(String name)通过打开一个与实际文件的连接来创建一个FileInputStream

2.DataInputStream类:继承FileInputStream类,允许程序从底层输入流中读取基本的Java数据类型

DataInputStream类常用方法
方法说明
int read(byte[] b)从包含的输入流中读取一定量的字节,并将它们存储到缓冲区数组b中
int read(byte[] b,int off,int len)从包含输入流中将最多len字节读入一个byte数组中
boolean readBoolean()从包含的输入流中读取Boolean类型的数据
byte readByte()从包含的输入流中读取Byte类型的数据
char readChar()从包含的输入流中读取char类型的数据
double readDouble()从包含的输入流中读取double类型的数据
float readFloat()从包含的输入流中读取float类型的数据
void readFully(byte[] b)将b.length字节从文件读入byte数组b中,并从当前文件指针开始
void readFully(byte[] b,int off,int len)将正好len字节从此文件读入byte数组,读取位置从当前文件指针跳过off字节开始
int readInt()从包含的输入流中读取Int类型数据
DataInputStream(InputStream in)构造方法,使用指定的底层InputStream创建一个DataInputStream

以字节流方式从文件读取数据:

public class IOTest {
    public static void main(String[] args){
   try{
       FileInputStream fileInputStream=new FileInputStream("C:\\Users\\myun\\Desktop\\bainary.dat");
      DataInputStream dataInputStream=new DataInputStream(fileInputStream);
      System.out.println("\t"+dataInputStream.readChar());
      System.out.println("\t"+dataInputStream.readInt());
       System.out.println("\t"+dataInputStream.readBoolean());
   }catch(IOException e){
    System.err.println(e);
   }
    }
}

3.BufferedInputStream类:继承FileInputStream类,实现了通过缓冲区高效读取数据

BufferedInputStream类常用方法
方法说明
BufferedInputSteam(InputStream in)创建一个BufferedInputStream并保持其参数
BufferedInputStream(InputStream in,size)创建具有指定缓冲区大小的BufferedInputStream并保持参数
int available()返回输入流中实际可读的字节数
int read()读出数据
int read(byte[] b,int off,int len)从此字节输入流中的给定偏移量处开始将各个字节读取到指定的byte数组b中
void close()关闭从输出并释放与该流关联的所有系统资源

所有BufferedInputStream以字节方式从文件中读取数据:

public class IOTest {
    public static void main(String[] args){
   String filename="C:\\Users\\myun\\Desktop\\bainary.dat";
int sum=0;
try{
    DataInputStream ins=new DataInputStream(new BufferedInputStream(new FileInputStream(filename)));
    System.out.println("\t"+ins.readBoolean());
    System.out.println("\t"+ins.readInt());
    System.out.println("\t"+ins.readChar());
    System.out.println("\t"+ins.readByte());
    ins.close();
}catch(IOException iox){
    System.out.println("problem reading"+filename);
}
    }
}


File类

File类:将文件和目录封装为类,通过面向对象的方式来实现创建文件,删除文件,重命名文件,判断文件的读写文件等待

方法说明
boolean delete()输出此抽象路径名表示的文件或目录
boolean equals(Objectn obj)测试此抽象和给定的对象是否相等
boolean exists()测试此抽象路径表示的文件或目录是否存在
boolean isFile()测试此抽象路径名表示的文件是否是一个标准文件
boolean isDirectory()测试此抽象类路径名表示的文件是否是一个目录
long length()返回由此抽象路径名表示的文件的长度
String getName()f返回由此抽象路径名表示的文件或目录的名称
boolean renameTo(File name)以name重命名当前文件名字
static String separatorseparator和pathSeparator是两个常量,表示在不同的系统中斜杆的方向,在Windows中,斜杆是向右斜的\\,在Linux中,斜杆是向左斜的//
static String pathSeparator


随机文件的读写

随机文件读写RandomAccessFile类继承object类,实现文件的随机读写

RandomAccessFile常用类
方法说明
int readInt()从此文件中读取一个int型数据
float readfloat()从此文件读取一个float型数据
char readChar从此文件读取一个char型数据
double readDouble()从此文件读取一个double型数据
String readline()从此文件读取一行文本
String readUTF()从此文件读取一个string
void writeInt(int v)向文件中写入一个int型数据
void writefloat(float v)向文件中写入一个float型数据
void writeLong(Long v)向文件中写入一个long型数据
void writeChar(int v)向文件中写入一个char型数据
void writeChars(String v)向文件写入一个String
int skipBytes(int n)将指针向下移动若干个字节
long length()返回文件长度
long getFilePointer()返回指针当前位置
void seek(long pos)将指针调整到需要的位置
RandomAccessFile(File file,String mode)创建从中读取和向其中写入的随机访问文件流,该文件由File参数指定
RandomAccessFile(String name,String mode)创建从中读取和向其中写入的随机访问文件流,该文件由name参数指定

把一个整形数据写入文件中,然后从文件末把数据读出来:

public class IOTest {
    public static void main(String[] args){
   try{
       FileOutputStream fo=new FileOutputStream("C:\\Users\\myun\\Desktop\\file.ra");
       fo.close();
   }catch (Exception e){
    System.out.println("无法创建文件:"+e);
   }
   try{
       RandomAccessFile randf=new RandomAccessFile("C:\\Users\\myun\\Desktop\\file.ra","rw");
       int data[]={1,2,3,4,5,6,7,8,9,10};
       System.out.print("写入数据为:");
       for(int i=0;i<data.length;i++){
           System.out.print(data[i]+",");
           randf.writeInt(data[i]);
       }
       System.out.println("读取的数据为:");
       for(int i=data.length-1;i>=0;i--){
           randf.seek(i*4L);
           System.out.print(randf.readInt()+",");
       }
       System.out.println();
       randf.close();
   }catch(Exception e){
       System.out.println(e+"文件错误");
   }

    }
}


对象序列化

对象序列化:把Java对象转换为字节序列的过程

对象序列化:把字节序列转换为Java对象

ObjectOutputStream类通过一组writexxx方法实现向文件中写入对象

ObjectOutputStream部分方法
方法说明
Object replaceObject(Object obj)在序列化期间,此方法允许ObjectOutputStream的子类使用一个对象代替另一个对象
void reset()重置已写流中的所有对象的状态
void writeObject(Object obj)将对象obj写入ObjectOutputStream
void writeDouble(double val)写入一个64位的double型值
void writeChars(String str)以char序列形式写入一个String
void writeFloat(float val)写入一个32位的float型值
void writeInt(int val)写入一个32位的int型值
void writeLong(long val)写入一个32位的long型值
void writeUTF(String str)以UTF-8修改版本格式写入此String的基本数据

ObjectInputStreaml类实现了从文件读取对象:

方法说明
void readObject()从ObjectOutputStream中读取一个对象
void readChar()读取一个16位的char型值
void readDouble()读取一个64位的double型值
void readFloat()读取一个32位的float型值
void readInt()读取一个32位的int型值
void readLong()读取一个64位的long值
void readUTF()以UTF-8修改版本格式读取一个String

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前段被迫创业

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值