zoukankan      html  css  js  c++  java
  • JAVA IO

    Java IO 继承关系图

    IO流常用基类:

    (1)字节流

        输出字节流:OutputStream:字节写入流抽象类

            |--->FileOutputStream:

                      字节写入流
            |--->BufferedOutputStream:
                      字节写入流缓冲区
            

        输入字节流:InputStream:字节读取流抽象类

            |--->FileInputStream:
                      字节读取流
            |--->BufferedInputStream:
                      字节读取流缓冲区
            
    (2)字符流
        输出字符流:Writer:字符写入流的抽象
            |--->FileWriter:
                      字符写入流
            |--->BufferedWriter:
                      字符写入流缓冲区
            |--->OutputStreamWriter:
                      字符通向字节的转换流(涉及键盘录入时用)
           
        输入字符流:Reader: 字符读取流的抽象类
            |--->FileReader:
                      字符读取流
            |--->BufferedReader:
                      字符读取流缓冲区
            |--->InputStreamReader:
                      字节通向字符的转换流(涉及键盘录入时用)

     InputStreamReader

    常用的构造方法:

      public InputStreamReader(InputStream in)

      public InputStreamReader(InputStream in, String charsetName) 创建一个InputStreamReader,使用给定的名字的编码

    重要的属性:

      private final StreamDecoder sd; 表示一个解码器,说明读取的数据会被转成指定的编码,若没有指定,那么将使用平台默认的编码。

    重要的方法:

      int read(); 读取单个字符。

      int read(char[] cbuf) 从流中的0位置读取,读取cbuf长度的字符。

      int read(char[] cbuf, int offset, int length) offset表示从流中哪个位置开始储存字符,length表示最大的存储个数。

    public static void main(String[] args) throws IOException {
    InputStreamReader isr = new InputStreamReader(new FileInputStream("C:\Users\Desktop\1.txt"),"gbk");
    	char[] cbuf = new char[10];
    	int len = 0;
    	while((len = isr.read(cbuf))>0){
    		System.out.print(new String(cbuf,0,len));
    	}
    	isr.close();
    }
    

      

     OutputStreamWriter

    常用的构造方法:

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

      public OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。

    重要的属性:

      private final StreamEncoder se; 表示一个编码器,将内存中的字符流根据指定的编码表编码成为字节储存。

    重要方法:

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

      void write(int c) 写入单个字符

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

      void flash() 刷新该流的缓存

    public static void main(String[] args) throws IOException {
    	OutputStream os = new FileOutputStream("C:\Users\Desktop\1.txt"); 
    	OutputStreamWriter osw = new OutputStreamWriter(os);
    	String str = "你好吗?
    我很好!";
    	osw.write(str);
    	osw.close(); 
    }
    

     

     FileInputStream

    常用的构造函数:

      FileInputStream(File file)  创建“File对象”对应的“文件输入流”

      FileInputStream(FileDescriptor fd) 创建“文件描述符”对应的“文件输入流”

      FileInputStream(String path) 创建“文件(路径为path)”对应的“文件输入流”

    重要方法:

      int available()  返回“剩余的可读取的字节数”或者“skip的字节数”

      void close()  关闭“文件输入流”

      FileChannel getChannel()  返回FileChannel

      final FileDescriptor getFD()返回文件描述符 int read() 返回文件输入流的下一个字节

      int read(byte[] buffer, int off, int len)  读取“文件输入流”的数据并存在到buffer,从off开始存储,存储长度是len。

      long skip(long n)  跳过n个字节

      int read(); 读取单个字节。

      int read(byte[] b)从流中的0位置读取,读取b长度的字节。

      int read(byte[] b, int offset, int length) offset表示从流中哪个位置开始储存字节,length表示最大的存储个数。

     FileOutputStream

    常用的构造方法:

      FileOutputStream(File file) 创建“File对象”对应的“文件输入流”;默认“追加模式”是false,即“写到输出的流内容”不是以追加的方式添加到文件中。

      FileOutputStream(File file, boolean append) 建“File对象”对应的“文件输入流”;指定“追加模式”。

      FileOutputStream(FileDescriptor fd) 创建“文件描述符”对应的“文件输入流”;默认“追加模式”是false,即“写到输出的流内容”不是以追加的方式添加到文件中。

      FileOutputStream(String path) 创建“文件(路径为path)”对应的“文件输入流”;默认“追加模式”是false,即“写到输出的流内容”不是以追加的方式添加到文件中。

      FileOutputStream(String path, boolean append) 创建“文件(路径为path)”对应的“文件输入流”;指定“追加模式”。

    重要方法:

      FileChannel getChannel() 返回FileChannel

      final FileDescriptor getFD() 返回文件描述符

      void write(byte[] buffer, int off, int len) 将buffer写入到“文件输出流”中,从buffer的off开始写,写入长度是len。

      void write(int n) 写入字节n到“文件输出流”中

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

     FileReader

    是InputStreamReader的子类,内部一共三个方法:

    public FileReader(String fileName) throws FileNotFoundException {
            super(new FileInputStream(fileName));
    }
    
    public FileReader(File file) throws FileNotFoundException {
            super(new FileInputStream(file));
    }
    
    public FileReader(FileDescriptor fd) {
            super(new FileInputStream(fd));
    }
    

    都是通过其父类实现的,全部都是调用了父类(InputStreamReader)的方法。不能为其指定编码格式,使用平台默认的编码格式读取字符,在不要求转码的情况下,这是一个简便的写法,用于从文件中读取字符。

     BufferedReader

    常用的构造方法:

      BufferReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流。

      BufferReader(Reader in,int sz)创建一个使用指定大小的输入缓冲区的缓冲字符输入流。

    重要方法:

      String readLine()读取一个文本行,到达文件结尾返回null

      int read() 读取单个字符,到达文件结尾返回-1

      int read(char[] cbuf,int off,int len)将字符读入数组的某一部分

      boolean ready() 判断该流是否已经准备好被读取

      void reset()将流重置到最新的标记

      void mark(int readAheadLimit)标记流中的当前位置

      long skip(Long n)跳过n个字符

     BufferedWriter

    常用构造方法:

      BufferedWriter bf = new BufferedWriter(Writer out );  创建一个使用默认大小输出缓冲区的缓冲字符输出流。

    重要方法:

      void newLine() 写入一个行分隔符。

      void write (int c)写入单个字符

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

      void write (String s,int off,int len)写入字符串的某一部分

      void close()关闭此流,但是先刷新它

    实现文件的复制:

    public static void main(String[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new FileReader("C:\Users\Desktop\1.txt"));
    	BufferedWriter bw = new BufferedWriter(new FileWriter("C:\Users\Desktop\2.txt"));
    		
    	String str;
    	while((str = br.readLine())!=null){
    		bw.write(str);
    		bw.newLine();
    	}
    	br.close();
    	bw.close();
    }
    

    通过getEncoding()方法可以返回编码方式,默认是平台(eclipse)编码,txt文件是GBK编码,复制的文本会出现乱码,因为读取的时候是根据UTF-8读,写的时候是根据UTF-8写,这时候就不能使用FileReader的方式,要使用

    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\Users\Desktop\1.txt"),"gbk"));
    

    这里的缓冲区不是减少IO操作次数,而是减少编码转换器的操作次数。这要和BufferInputStream、BufferOutputStream区别开来。

     BufferInputStream

    常用构造函数:

      public BufferedInputStream(InputStream in); 创建一个内部缓冲区数组并将其存储在 buf 中,该buf的大小默认为8192。

      BufferedInputStream(InputStream in,int size); 指定内部缓冲区的大小

    重要属性:

    private static int defaultBufferSize = 8192;//内置缓存字节数组的大小 8KB
        
    protected volatile byte buf[];  //内置缓存字节数组
        
    protected int count;    //当前buf中的字节总数、注意不是底层字节输入流的源中字节总数
        
    protected int pos;      //当前buf中下一个被读取的字节下标
        
    protected int markpos = -1; //最后一次调用mark(int readLimit)方法记录的buf中下一个被读取的字节的位置
        
    protected int marklimit;    //调用mark后、在后续调用reset()方法失败之前云寻的从in中读取的最大数据量、用于限制被标记后buffer的最大值

    重要方法:

    int available();  //返回底层流对应的源中有效可供读取的字节数      
      
    void close();  //关闭此流、释放与此流有关的所有资源  
      
    boolean markSupport();  //查看此流是否支持mark
      
    void mark(int readLimit); //标记当前buf中读取下一个字节的下标  
      
    int read();  //读取buf中下一个字节  
      
    int read(byte[] b, int off, int len);  //读取buf中下一个字节  
      
    void reset();   //重置最后一次调用mark标记的buf中的位子  
      
    long skip(long n);  //跳过n个字节、 不仅仅是buf中的有效字节、也包括in的源中的字节 

    该类主要是提供给InputStream的没有缓冲功能的子类来使用的,经常看见有人把其和FileInputStram来一起使用,FileInputStram本身具有缓存,速度更快,直接调用底层 readBytes(byte b[], int off, int len)。

  • 相关阅读:
    DataTables合并单元格(rowspan)的实现思路(多分组分类的情况)
    DataTables固定表格宽度(设置横向滚动条)
    用图片替代cursor光标样式
    DataTables获取指定元素的行数据
    任意表格(table)实现拖动列(column)改变列大小
    鼠标拖动改变DIV等网页元素的大小的最佳实践
    DataTables实现rowspan思路
    DataTables添加额外的查询参数和删除columns等无用参数
    击穿(强推---神仙代码)
    java jvm 参数 -Xms -Xmx -Xmn -Xss 调优总结
  • 原文地址:https://www.cnblogs.com/liqing-weikeyuan/p/8032305.html
Copyright © 2011-2022 走看看