java InputStream和OutputStream

InputStream Reader 是所有输入流的基类。

本节内容:

目录

InputStream

OutputStream

分割符的问题:

jdk7的改进写法


InputStream

InputStream输入流,以它的子类FileInputStream来讲解

绝对路径和相对路径,

绝对路径是值在硬盘上存储的真正路径

相对路径 是指相对于某个文件的路径,

java读取文件时,系统默认从项目的根目录开始读取

InputStream抽象类中的常用方法:

  • int available() 返回可被读取的字节的长度
  •  close() 关闭流通道
  • int read() 从文件中读取一字节内容,如果读到内容,返回该字节对应的ascii码,可以通过转成char类型打印该字节的内容,中文的话会乱码  ,如果读不到内容,返回-1,读完后指针移动到下个位置
  • int read(byte[] b) 每次从文件中读取一定数量的字节放入byte数组中,返回其读到的字节数目,如果没有读到内容,返回-1,读到最后可能读不满,那么最后一次读取不会完全覆盖之前的byte数组,byte数组中存放的是ascii码可使用new String(byte[] b,int offset,int length)根据指定长度将byte数组转成字符串,
  • int read(byte[] b, int off, int len)将指定长度的内容读到byte数组中,读不到内容返回-1


 

import java.io.*;

public class IoTest01 {
      public static void main(String[] args){
          FileInputStream fi = null;
          try {
              //绝对路径,加转义字符防止路径不正确
              fi=new FileInputStream("E:\\workspace\\javaIo\\test\\test1.txt");
                //相对路径
               fi=new FileInputStream("./test/test1.txt");
               /*
              System.out.println(fi.read());//fi.read()每次读取一字节,然后游标会移动到下一个
              System.out.println(fi.read());
              char c=(char)fi.read();//强转为char类型,保证读出来的不是ascii码
              System.out.println(c);
              */
              //定义byte数组每次读取三个字节提高效率
             /*  byte[] bytes=new byte[4];
               while (fi.read(bytes)!=-1){
                   System.out.println( new String(bytes));
               }*/
             byte[] bytes=new byte[4];
             int temp;
             while ((temp=fi.read(bytes))!=-1){
                 //new String (byte[],offset,len)将byte数组按指定索引转换成字符串
               System.out.println(new String(bytes,0,temp) );
             }


          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }finally {
              try {
                  fi.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }

      }
}
out:
we m
ust 
stud
y ha
rd!

注意:程序中打开的文件 IO 资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件 IO 资源

OutputStream

OutputStream输出流,它的常用子类如下

OutputStream抽象类中常用方法

  • void close()关闭输出流,释放系统资源
  • void flush()刷新输出流,保证缓存中内容全部写出去
  • void write(byte[] b) 一个bytes数组通过输出流写入到输出流
  • void write(byte[] b, int off, int len) 将指定起始位置和长度的byte数组写入到输出流
  • Writes len bytes from the specified byte array starting at offset off to this output stream.
  • abstract void write(int b)写一个byte到输出流,int值的高24位(如果有)被忽略,将int的低8位转换成ascii码写入

OutputStream的子类中常用的有FileOutputStream,它的构造方法有5个,常用的有

FileOutputStream(File file) 创建一个文件输出流,参数可以是文件,也可以是字符串形式的文件地址
FileOutputStream(String name)
FileOutputStream(File file, boolean append)  创建一个文件输出流,第一个参数是文件名,可以是字符串,第2个参数是否覆盖文件内容,如果为true在文件内容的后面直接写(要注意写入换行符),不覆盖原有内容,为false则覆盖

FileOutputStream继承自OutputStream,它的常用方法是重写自父类的方法

注意如果该路径文件不存在,则自动创建该路径下文件

示例:

package io01;

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

public class IoTest02 {
    public static void main(String[] args){
        FileOutputStream fo=null;
        try {
            fo=new FileOutputStream("test/test1.txt",true);
            fo.write(100);

            String msg="hello world";
            //调用字符串的getBytes方法,将字符串转换为byte数组
            fo.write(msg.getBytes());//write方法不会自动换行
            fo.write(msg.getBytes());//再写一遍
            fo.write("\n".getBytes());//将换行符转换成byte数组,写入到文件中
            fo.write("javase".getBytes());
            //   刷新以保证写入
            fo.flush();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fo.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

分割符的问题:

在windows下路径的分割符是\ ,还要防止转义字符,出现转义字符要多加一个\, 在linux下路径分割符是/ ,为了保证代码的跨平台运行,分割符可以使用File.separator来替代文件路径的分隔符,

fo=new FileOutputStream("test/test1.txt",true);
变成下面这种格式
fo=new FileOutputStream("test"+File.separator+"test1.txt",true);

io操作需要捕获异常.因为不确定文件到底是否存在,在try-catch-finally语句中,try语句块声明的变量不能在finally语句块访问,所以定义输入输出流时在try外部声明,比如FileInputStream f=null

jdk7的改进写法

jdk7之后,InputStream和OutputStream,Reader和Writer实现了Closeable接口,Closeable接口继承自AutoCloseable接口,看下AutoCloseable接口的源码:

public interface AutoCloseable {
//AutoCloseable接口只有一个close抽象方法,
    void close() throws Exception;
}
从jdk7之后不需要手动关闭io流了,因为io流都实现了close方法,创建io流对象后,会自动调用这个方法,写法变成了将输出流的初始化放到try后面的小括号中,不需要在finally语句块中调用流对象的close方法

示例

//将test/test.txt文件中的内容打印出来
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class File7 {
    public static void main(String[] args){
        try (
                FileInputStream fis=new FileInputStream("test"+ File.separator+"test.txt");
                                                                                          ){
            int temp;
            while((temp=fis.read())!=-1){
                System.out.println( (char)temp);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

参考: http://www.monkey1024.com/javase/602

猜你喜欢

转载自blog.csdn.net/sinat_41132860/article/details/84326955