java输入和输出处理(IO流)

java输入和输出处理(IO流),第1张

java输入和输出处理(IO流) File类:java.io.File包中! 文件是相关记录或放在一起的数据的集合 Java程序是通过File 类访问文件属性的, 使用File类可以 *** 作文件或目录

File file = new File( String pathname );

pathname 形式要写成"c:\test .txt"或者"c:/test .txt"!

使用Filel类创建文件:

1、如果父级目录可达,可以直接用createNewFile()创建文件

也可以用mkdir()来创建目录

2、如果父级目录不存在,需要先用getParentFile ()获取父级File对象

用父级对象.mkdirs()可以递归创建全部的父级目录

文件File的 *** 作:

增:createNewFile()、mkdir()、mkdirs()

删:delete()、deleteonExit();

改:renameTo()

查:getName ()、getPath() 、getAbsolutePath() 、getParentFile ()、

List()、ListFiles()

list()方法是返回某个目录下的所有文件和目录的文件名,返回的是String数组

listFiles()方法是返回某个目录下所有文件和目录的绝对路径,返回的是File数组

 下面一段代码是实现查看文件属性、创建和删除文件功能

public class Test {
    public static void main(String[] args) throws IOException {
        File f=new File("/myDoc/test.txt");
//        File f2=new File("/myDocs/test.txt");
//        File p2=f2.getParentFile();
//        p2.mkdirs();
//        f2.createNewFile();
        File f1=new File("zz.txt");
        f1.createNewFile();
        File p = f.getParentFile();
        if(!p.exists())
            p.mkdirs();
        if(!f.exists())
            f.createNewFile();
        System.out.println("名称:"+f.getName());
        System.out.println("相对路径:"+f.getPath());
        System.out.println("绝对路径:"+f.getAbsolutePath());
        System.out.println("文件大小:"+f.length()+"字节");
    }
}

IO流:
我们通过流来读写文件
流是一组有序的数据序列;以先进先出方式发送信息的通道

 Java流的分类

输入输出流是相对于计算机内存来说的

 

字节流是 8 位通用字节流,字符流是 16 位 Unicode 字符流

基础流:

文件字节流:FileInputStream、FileOutputStream

文件字符流:FileReader、FileWriter

转换流:InputStreamReader、OutputStreamWriter

高级流:

缓冲流:BufferReader、BufferWriter

二进制流:DataInputStream、DataOutputStream

对象流:ObjectInputStream、ObjectOutputStream

字节流常用方法介绍:

1 、lnputstream 字节输入流( 抽象类一基类) 一一读
int read () :
从输入流一个字节一个字节的读, 返回的是该字节的整数表示形式, 如果读到了输入流的末尾,返回-1
int read (byte [ ] b) :
从输入流读取若干字节, 把这些字节保存到数组b 中。返回的是读取到的字节数, 如果读到了输入流的末尾, 返回-1
int read (byte [ ] b , int off , int len) :
从输入流读取若干字节, 把这些字节保存到数组b 中。off 指的是字节数组中开始保存数据的起始下标。len 指读取的字节数目。返回的是实际读取到的字节数, 如果读到了输入流的末尾, 返回-1
close() : 关闭输入流
2 、0utputStream 字节输出流( 抽象类一基类) 一一写
write(int) : 往输出流中写入一个个的字节
write(byte[]) : 往输出流中写入一个字节数组
write(byte[] b , int off , int len) : 往输出流中写入一个字节数组, off 代表开始从字节数组的off 位置开始往外写, len 代表往外写len 长度的字节
close() : 关闭输出流
flush() : 强制把缓冲区中的数据全部写出到输出流中

FileInputStream常用的构造方法

 FileInputStream(File file)

FileInputStream(String name)

 

FileOutputStream常用的构造方法

FileOutputStream (File file)

FileOutputStream(String name) 

FileOutputStream(String name,boolean append)

1.前两种构造方法在向文件写数据时将覆盖文件中原有的内容

2.创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件

 下面是FileInputStream、FileOutputStream的三种用法

 //FileInputStream用法一:字节流每个字节逐个读取,读取的字节转换成字符型,存放到用StringBuilder建立的字符串数组中
    public static String readFile(String path) throws IOException {
        FileInputStream fis=new FileInputStream(path);
        StringBuilder sb=new StringBuilder();
        int tmp;
        while((tmp=fis.read())!=-1){
            sb.append((char)tmp);//每个字节逐个读取
        }
        fis.close();//关流
        return sb.toString();
    }
    //FileInputStream用法二:建立一个字节型数组,大小是数据流里的字节数,然后把字节流里的内容一次性读取到数组中
//    public static String readFileBytes(String path) throws IOException {
//        FileInputStream fis=new FileInputStream(path);
//        byte[] b=new byte[fis.available()];//available()在读写 *** 作前得知数据流里有多少个字节可以读取
//        fis.read(b);
//        fis.close();
//        return new String(b);
//    }
    //FileInputStream用法三:和方法二是一样的,只是他把异常用try-catch处理了,没有抛异常
public static String readFileBytes(String path) {
    FileInputStream fis = null;
    byte[] b = null;
    try {
        fis = new FileInputStream(path);
        b = new byte[fis.available()];
        fis.read(b);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return new String(b);
}
    //FileOutputStream用法一:把字符串每个字符逐个写出来
    public static void writeFile(String path,String s)throws IOException{
        FileOutputStream fos=new FileOutputStream(path);
        for (int i = 0; i < s.length(); i++) {
            char c=s.charAt(i);//charAt() 方法用于返回指定下标处的字符。
            fos.write(c);

        }
        fos.close();

    }
    //FileOutputStream用法二:把字符串转化为一个字节数组,在一次性全部写入
//    public static void writeFileBytes(String path,String s)throws IOException{
//        FileOutputStream fos=new FileOutputStream(path);
//        byte[] b=s.getBytes();//把字符串转化为一个字节数组
//        fos.write(b);
//        fos.close();
//    }
    //FileOutputStream用法三:和方法二是一样的,只是他把异常用try-catch处理了,没有抛异常
public static void writeFileBytes(String path,String s){
    FileOutputStream fos=null;
    byte[] b=s.getBytes();
    try {
        fos=new FileOutputStream(path,true);//TRUE表示每次吸入的内容不会覆盖,会被保存
        fos.write(b);
    } catch (IOException e) {
        e.printStackTrace();
    }finally{
        try {
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
       
 //FileReader的用法:

   public static String readChar(String path)throws IOException{
       File f=new File(path);
       FileReader fr =new FileReader(f);
//       int tmp;
//       StringBuilder sb=new StringBuilder();//建立一个字符串,用于存储要要读的内容;每个字节逐个读到字符串里的
//       while((tmp=fr.read())!=-1){
//           sb.append((char)tmp);
//       }
       char[] c=new char[(int)f.length()];//建立一个字符型数组,用于存储要要读的内容;
       // 在读中文时,length()不够精确,容易出现空格溢出;
       // 在main里调用方法时可以用trim()去除空格: writeChar("c.txt","start:"+s.trim()+"abc",false);//*****trim()去除空格
       fr.read(c);//
       fr.close();
       return new String(c);
//       return sb.toString();
   }

           // FileWriter的用法:
   public  static  void writeChar(String path,String s,boolean isAppend)throws IOException{
       FileWriter fw=new FileWriter(path,isAppend);//如果isAppend=false,则相当于没有
       char[] cc=s.toCharArray();
//       for (int i = 0; i < cc.length; i++) {
//           fw.write(cc[i]);//逐个字节写入
//       }
       fw.write(s);//直接全部写入
       fw.close();
   }
演示BufferReader和BufferWrite
public class TestBuffered {
    public static void main(String[] args) throws IOException {
        FileReader fr=new FileReader("a.txt");
        BufferedReader br=new BufferedReader(fr);
        StringBuffer sb=new StringBuffer();
        String tmp;
        while((tmp=br.readLine())!=null){
            sb.append(tmp+"n");
//            System.out.println(tmp);
        }
        System.out.println(sb.toString());
        FileWriter fw=new FileWriter("d.txt");
        BufferedWriter bw=new BufferedWriter(fw);
        bw.write(sb.toString());
        bw.close();
        fw.close();
        br.close();
        fr.close();
    }
}
演示InputStreamReader、OutputStreamWriter
public class TestTransfer {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("a.txt" );
        InputStreamReader isr=new InputStreamReader(fis);
        char[] c=new char[fis.available()];
        isr.read(c);
        FileOutputStream fos=new FileOutputStream("b.txt",true);
        OutputStreamWriter osw=new OutputStreamWriter(fos);
        osw.write(new String(c).trim());//*****trim()去除空格
        osw.close();
        fos.close();
        isr.close();
        fis.close();
    }
}
二进制流:DataInputStream、DataOutputStream
public class TestData {
    public static void copy(String from,String to, boolean isAppend)throws IOException {
        FileInputStream fis=new FileInputStream(from);
        FileOutputStream fos=new FileOutputStream(to);
        DataInputStream  dis=new DataInputStream(fis);
        DataOutputStream dos=new DataOutputStream(fos);
        byte[] b=new byte[fis.available()];
        fis.read(b);
        fos.write(b);
        dis.read(b);
        dos.write(b);
        dos.close();
        dis.close();
        fos.close();
        fis.close();
    }
    public static void main(String[] args)throws IOException {
        //C:UsersPicturesSaved Pictures微信图片_20211019001509
        copy("C:\Users\Pictures\Saved Pictures\微信图片_20211019001509.jpg",
                "ok.jpg",false);
    }
}
演示对象流:ObjectInputStream、ObjectOutputStream
public class TsetOBJ {
    public static void main(String[] args)throws Exception {
        Student s=new Student(1,"张三",16,180);
        s.setId(6);
        s.setName("穷奇");
        s.setAge(18);
        s.setHeight(120);
        System.out.println(s);
        FileOutputStream fos=new FileOutputStream("e.txt");
        ObjectOutputStream oos=new ObjectOutputStream(fos);
        oos.writeObject(s);
        FileInputStream fis=new FileInputStream("e.txt");
        ObjectInputStream ois=new ObjectInputStream(fis);
        Object o=ois.readObject();
        System.out.println(o);
        if(o instanceof Student){
            Student stu=(Student) o;
            System.out.println(stu.getName());
        }
        ois.close();fis.close();oos.close();fos.close();
    }
}

什么叫序列化和反序列化,代码如何实现

序列化是将对象的状态写入到特定的流中的过程

FileOutputStream fos=new FileOutputStream("临时文件路径");

ObjectOutputStream oos=new ObjectOutputStream(fos);

oos.writeObject(对象);--对象的类必须实现Serializable接口(可序列号)

反序列化则是从特定的流中获取数据重新构建对象的过程

FileInputStream fis=new FileInputStream("临时文件路径");

ObjectInputStream ois=new ObjectInputStream(fis);

Object o=ois.readObject();

今天的IO流就到这里来,再见!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5523194.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存