I/O编程

I/O编程
title: 2017-3-28JavaDay13
tags: 新建,模板,小书匠

grammar_cjkRuby: true

I/O编程

  • java.io.file
  • File对象代表磁盘上的一个文件和目录

文件过滤器 File类

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

        File f=new File("F:\\1.txt"); //绝对路径
        FIle f1=new File("F:\\","1.txt");

        File dir=new File("F:\\");
        File f3=new File(dir,"1.txt");

        f.creatNewFile();  // 创建新文件
        f.makedir(); //创建新目录
        f.delect();  //删除文件
        f.exists();  // 文件对象所代表的文件或目录是否存在
        f.isDirectory();  //判断文件对象所代表的时文件还是目录


        file  f=new File("F:\\corejava");


        FileFilrer f1=new MyFilter();  //可用匿名内部类
        File[] fs=dir.listFile();  //遍历目录中的文件数组 即实现ls功能

        for(File.f:fs)
        {
            if(f.isFile())System.out.println("wenjian"+f.GetName());
            if(f.isFile()System.out.println("dir"+f.GetName()));
        }


        //利用匿名内部类创建一个对象实现接口

        File[] fs=dir.listFiles(new FileFilter()
        {
            public booleab accept(File f)
            {
                String name=f.getName();
                if(name.endsWith()"zip")
                return ture;
            }
            else
                return false;
        });

        //  使用匿名内部类实现接口
        }

        class MyFilter implements FileFilter{
            public boolean accept(File f)  // f该目录中的每一个文件或子目录
            {
                //接口回调 
                return false;  //全部过滤掉

                if(f.isDirectory())return false;
                String name=f.getName();
                if(name.endsWith("zip"))return ture;  // 典型的接口回调
                else
                   return false;
                //打印目录中的zip文件  
                // 利用一个类创建接口,匿名内部类实现
            }
        }

请打印出该目录下所有的.java文件, 无层次限制
使用递归方法解决上题

fite f=new file("F:\\corejava");
File[] fs=dir.listFIle(new FIleFilter()
{
    public boolean accept(FIle f)
    {
        String name=f.getName();
        if(name.endsWith("java"))
        return ture;
        else return false;
    }
        return false;
});
 for(FIle f:fs)
 {
    if( f.isFIle())System.out.println(f.getAbsolutPath);
    else
        printjavaFiles(); //printJavaFiles为打印java文件
 }

 返回a的阶乘

 int m(int a)
 if(a==0)reuturn 1;
 else return a*m(a-1);


 //  递归思想

I/O流

  • I/O 流
  • 流:对象,用来在JVM和外部数据源之间传输数据 ( 管道)连接JVM和外部数据源之间传输的管道
    流对象的三种分类
  • 按数据方向分:输入流和输出流 大部分为单向流
  • 按数据的单位:字节流和字符流
  • 按流功能:节点流和过滤流
  • 节点流:实际传输数据的流
  • 过滤流: 给节点流增强功能 实际不是传输数据
  • 字节流:以字节为单位,可以处理一切数据
  • 字符流:以字符为单位,只能处理文本数据

    **InputStream/OutPutStream 字节流的父类
    FileInputstream/FileOutputStream文件字节流 节点流**

    “`makedown
    public static void main(Strimg[] args)throw Exception{
    OutputStream os=new FileOutputStream(“1.txt”,ture);//创建流
    //ture是否追加
    os.write(“A”); // write(int a)把字节A写入文件
    os.write(byte []bs); //把字节数据bs全部写出去
    write(byte []bs,int of, int len);//八字阶数组的一段写出去,由后面两个参数决定那段数组, int off数组下标,int len//数组长度

    String str=”Hello world”;
    OutputStream=new FileOutputStream(“1.txt”);
    byte[]bs=str.getByte();//把字符串转成数组
    os.write(bs);
    os.close();// 关闭流 释放资源
    //输出流

    public static void mian(String[] args)throw Exception{
    InputStream=new InputStream(“1.txt);
    //输入流中由三个读方法
    int read(); 从文件中杜伊个字节,返回-1结束。
    int read(byte[] bs);// 从文件中读多个字节,看字节数组的长度。读满bs,返回值为实际读到的字节数,以1为结束。
    int read(byte[] bs,int off,int len);// 从文件中读多个字节,放入bs中的一段,返回为实际读到的字节数,已-1为结束。
    //int read(byte[] bs)
    public static void main(String[] args)throw Expection{
    byte[]bs=new byte[6];
    while(ture)
    {
    int i=is.read(bs);
    if(i==-1)break;
    for(byte b:bs);
    {
    System.out.println((char)b+” “)
    }
    System .out.pritnln();
    }
    is.close();
    }

    //int read()
    while(ture)
    {
        int i=is.read();
        if(i==)break;//保证读一次打印一次
        else System.out.println((char)i);
    }
    System.out.pritnln();
    is.close();
    
    //输入流
    

    }

## 输出异常处理Exception
```makedown
public static void main(String[] args){
    String str="Hello world";
    OutputStream=null;
    try{
        os=new FileOutputStream("1.txt");
        byte[] bs=str.getByte();
        os.write(bs);

    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
    finally{
    try{
        if(os!=null)os.close();
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
    }
}




<div class="se-preview-section-delimiter"></div>

字节数组 过滤流

public static void main(String[] args)throw Exception{
    long l=1234567890123456789L;
    OutputSrtream os=new FileOutpurStream("1.dat");
    DataOutputStream out=new DataOutputStream(os);
    out.writeLong(l);
    out.close();


    //查看文件内数据

    InputStream is=new FileInputStream("1.dat");
    DataOutputStream in=new DataInputStream(is);
    long    l2=in.readLong();
    in.close();
    System.out.println(l2);//读出文件内荣

}

四个步骤
- 创建节点流
- 封装过滤流
- 读/写数据
- 关闭流
DataInputStream/DataOutputStram可直接读写八种基本类型和字符串,readUTF()/writeUTF()

BufferedInputStream/BufferedOutputStream
作用:缓冲 提高I/O的效率

###  字节数组   过滤流
```markdown?linenums
public static void main(String[] args)throw Exception{
    long l=1234567890123456789L;
    OutputSrtream os=new FileOutpurStream("1.dat");
    DataOutputStream out=new DataOutputStream(os);
    out.writeLong(l);
    out.close();


    //查看文件内数据

    InputStream is=new FileInputStream("1.dat");
    DataOutputStream in=new DataInputStream(is);
    long    l2=in.readLong();
    in.close();
    System.out.println(l2);//读出文件内荣

}




<div class="se-preview-section-delimiter"></div>

四个步骤
- 创建节点流
- 封装过滤流
- 读/写数据
- 关闭流
DataInputStream/DataOutputStram可直接读写八种基本类型和字符串,readUTF()/writeUTF()

BufferedInputStream/BufferedOutputStream
作用:缓冲 提高I/O的效率

public static void main(String[] args)throw Exception{
        FileOutputSrtream fos=new FileOutputStream("1.txt");
        BufferedOutputStream out=new BufferedOutputStream(fos); //缓冲区
        out.write('A');  
        out.flush();  // 清空缓冲区
}
四个步骤
 - 创建节点流 
 - 封装过滤流 
 - 读/写数据 
 - 关闭流
 **DataInputStream/DataOutputStram可直接读写八种基本类型和字符串,readUTF()/writeUTF()**

**BufferedInputStream/BufferedOutputStream**
作用:缓冲 提高I/O的效率
```makefile?linenums
public static void main(String[] args)throw Exception{
        FileOutputSrtream fos=new FileOutputStream("1.txt");
        BufferedOutputStream out=new BufferedOutputStream(fos); //缓冲区
        out.write('A');  
        out.flush();  // 清空缓冲区
}




<div class="se-preview-section-delimiter"></div>

**
过滤流:以节点流作为节点构造而出过滤流
printStream:过滤流、输出流 写8种基本类型并且缓冲(System.out,print)
PipedIuputStream/PipedOutputStream 节点流 管道流 用来在线程间交换数据
RandomAccessFile:随机访问文件 断点续传**

字符流

字符流:以字符为单位,只能处理处理文本数据,同样可处理字符的编解码问题。
字符的编解码:

  • 乱码:当字符的编码方式和解码方式不同时,可能会造成乱码(英语除外)。
  • ASIII码值解决英文编码,Unicode.UTF-8
String str="2017年";
byte[] bs1=str.getByte("GBK");
String srt2=new String(bs1,"Big5");
System.out.println(str);
System.out.println(str2);// 编码错误
//解决乱码错误   Big5-->GBK
byte[]bs2=new str2.getByte("BIg5");
String str3=new String(bs3,"GBK");
System.out.println("str3");




<div class="se-preview-section-delimiter"></div>
  • 字符流
  • Reader/Writer 字符流的父类
  • FileReader/File 文件字符流 节点流 少用
  • BufferReader/PrintWriter 缓冲流 过滤流
  • InPutStreamReader/OutPutStreamWriter 桥转换 在桥转换的时候指定编解码方式

  • 字节流转换字符流

严格按照四个步骤

FileOutPutStream fos=new FileOutPutStream(“poem.txt”);
Writer ow=new Out   PutStreamWiter(fos); //字节流转换字符流
PrintWriter out=new PrintWrite(ow);
out.println("....");
out.println("....");
out.println("....");
out.println("....");
out.close();
// 字符流的读和写
InPutStream fis=new FileInPutStream("poem.txt");
Reader fr=new InPutStreamReader(fr);
BufferedReader in=new BufferedReader(fr);
while(ture){
String str=in.readLIne();
if(str=null)break;
String str=in.readLine();// 读到换行符结束
System.out.println(str);
}
in.close();
}




<div class="se-preview-section-delimiter"></div>

对象序列化

对象序列化:将对象通过流传输
*ObjectOutPutStream/ObjectInputStream 只有实现了Serializable接口的对象才能序列化,不仅对象本身需要实现Seriallizabel接口 ,对象属性类型也需要实现该接口。
*
把对象拆开传输再组合。 可拆可装–可序列化

//把对象分割,并读对象
student s=new student("zs",18);
FileOutputStream fos=new FileOutputStream(obj.txt);
ObjectOUtputStram out=new ObjectOutputStream(fos);
out.writeObect(s);
out.flush();
out.close();

//回写被分割的对象
FileINputStream fis=new FileINputStram("obj.txt");
ObjectInputStream in =new ObjectINputStram(fis);
Student o1=(Student)in.readObject();
Student o2=(Student)in.readObject();
in.close();

class student implements **Serializable**{ //标准字
private String name;
**transient** int age;  //reansient修饰的属性为临时属性,不参与序列化
public stufent(){
            super();
}
public student(String anem,int age)
{
    super();
    this.name=name;
    this.age=age;
}
public String getName()
{
    return name;
}
public void setName(String name)
{
    this.name=name;
}
public int getAge()
{
    return age;
}
public void setAge(int age)
{
    this.age=age;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值