Java IO操作

文件操作相关

列出某个目录中的所有文件

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.ylfeiu.io;
 
import java.io.File;
 
public class ShowFileInfo {
 
    public static void main(String[] args) {
 
        File f = new File("d:" + File.separator + "txt");
        show(f);
    }
 
    private static void show(File f) {
        if (f.isDirectory()) {
            File[] res = f.listFiles();
            if (res != null) {
                for (int i = 0; i < res.length; i++) {
                    show(res[i]);
                }
 
            }
        }
        System.err.println(f);
 
    }
 
}

创建带目录的文件

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.ylfeiu.io;
 
import java.io.File;
import java.io.IOException;
 
public class CreateDirectorFile {
 
    public static void main(String[] args) {
        File f = new File("d:" + File.separator + "test" + File.separator
                + "hello.txt");
 
        if (!f.getParentFile().exists()) {
            f.getParentFile().mkdirs();
        } else {
            try {
                f.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
 
    }
 
}

字节流与字符流

输入输出流,分为字节流(InputStream,OutPutStream),字符流(Writer,Reader),它们4个都是抽象类,实例化靠其子类对象;传输中用字节流.字符流在操作时用到了缓冲区,若在使用字符流操作后,不关闭输出流操作,那么该缓冲区的内容不会被输出,这个时候得去调用flush()强制清空缓冲区的内容进行输出.字节流这不存在该情况

java.lang.Object

         |-java.io.InputStream

                   |-java.io.FileInputStream

java.lang.Object

         |-java.io.Reader

                   |-java.io.InputStreamReader

                            |-java.io.FileReader

通过以上继承关系可以看出,所有字符数据都是需要转换的,依靠转换流操作,真正保存或传输的数据是以字节流来完成的

转换操作流

字节流与字符流的转换采用:OutputStreamWriter,InputStreamReader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.ylfeiu.io;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
 
public class CreateDirectorFile {
 
    public static void main(String[] args) throws Exception {
        File f = new File("d:" + File.separator + "test" + File.separator
                + "hello.txt");
        if (!f.getParentFile().exists()) {
            f.getParentFile().mkdirs();
        } else {
            f.createNewFile();
        }
        OutputStream out = new FileOutputStream(f);
 
        Writer w = new OutputStreamWriter(out);
        w.write("你好啊");
        w.flush();
    }
 
}

内存操作流

构造:输入流构造需要传参(操作对象),输出流构造函数中没有操作对象

public ByteArrayInputStream(byte buf[])

 

使用ByteArrayInputStream,ByteArrayOutputStream对内存进行输入输出操作

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.ylfeiu.io;
 
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
 
public class ByteArrayIO {
 
    public static void main(String[] args) throws Exception {
 
        String str = "hello";
        InputStream in = new ByteArrayInputStream(str.getBytes());
        OutputStream w = new ByteArrayOutputStream();
 
        int tmp = 0;
        while ((tmp = in.read()) != -1) {
            w.write((char)Character.toUpperCase(tmp));
        }
         
        w.close();
        in.close();
 
        String newStr = w.toString();
        System.err.println(newStr);
    }
 
}

字节打印流与字符打印流

PrintStream,PrintWriter

构造public PrintStream (OutputStream out)

这里虽然传参的是OutputStream型的对象,但是打印流使用的是打印流的方法,并不是使用OutputStream的子类的实际对象的方法

System类的err,out,in这三个常量都是PrintStream的实例(该3个常量在JDK早期出现,所以并不是大写的)

System.out本身就属于PrintStream的对象,而它又是OutputStream的子类,所以有了下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.ylfeiu.io;
 
import java.io.OutputStream;
 
public class SysIn {
 
    public static void main(String[] args) throws Exception {
        OutputStream out = System.out;
        String info = "你好啊  world";
        out.write(info.getBytes());
    }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
打印流例子
package com.ylfeiu.io;
 
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
 
public class PrintIO {
 
    public static void main(String[] args) throws Exception {
        String str = "hello world!";
 
        InputStream in = new ByteArrayInputStream(str.getBytes());
        OutputStream out = new ByteArrayOutputStream();
        PrintStream echo = new PrintStream(out);
        int tmp = 0;
        while ((tmp = in.read()) != -1) {
            echo.print((char)Character.toUpperCase(tmp));
        }
 
        String newStr = out.toString();
        out.close();
        in.close();
        System.err.println(newStr);
    }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
中文乱码的产生
package com.ylfeiu.io;
 
import java.io.InputStream;
 
/**
 *
 * @author Administrator 本程序演示中文乱码的产生
 */
public class MessyCode {
 
    public static void main(String[] args) throws Exception {
        InputStream in = System.in;
        StringBuffer buf = new StringBuffer();
        System.out.println("请输入数据");
        int tmp = 0;
        while ((tmp = in.read()) != -1) {
            if (tmp == ‘\n‘) {
                break;
            }
            buf.append((char) tmp);
        }
 
        System.err.println("输入的内容是:" + buf);
 
    }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
BufferedReader缓冲区操作
从缓冲区读取数据
 
解决中文输入产生的乱码
package com.ylfeiu.io;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
public class BufRead {
 
    public static void main(String[] args) throws Exception {
        BufferedReader buf = new BufferedReader(
                new InputStreamReader(System.in));
        System.out.println("请输入数据");
        String info = buf.readLine();
        System.err.println("输入地 数据是:" + info);
 
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Scanner(放在java.utils包中)
Jdk1.5之后推出的,方便进行输入操作,在程序开发过程中,如果通过程序输出,则采用PrintStream打印流,若存在中文,推荐使用PrintWriter,而对于程序输入数据,建议使用Scanner
例子
package com.ylfeiu.io;
 
import java.util.Scanner;
 
public class ScannerInput {
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.err.println("请输入数据");
        if (in.hasNext()) {
            String info = in.next();
            System.err.println("输入的数据是:" + info);
        }
 
    }
 
}

对象输入/出流

采用ObjectInputStream,ObjectOutputStream进行对象的输入与输出,这两个类与打印流的设计相似,都是需要接收父类的实例化对象

例子

 

对象序列化

对象序列化可以将内存中的对象转换成2进制数据(必须实现Serializable接口),如果不想某个对象的属性被序列化,则采用transient关键字

例子

把对象信息写入到文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.ylfeiu.io;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
 
public class ObjInputIO {
 
    public static void main(String[] args) throws Exception {
        Person p = new Person(20, "ylfeiu");
        File f = new File("d:" + File.separator + "p.ser");
 
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
        out.writeObject(p);
        out.close();
 
    }
 
}
 
class Person implements Serializable {
    transient int age;
    String name;
 
    Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
从二进制文件中读取数据
package com.ylfeiu.io;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
 
public class ObjReadIO {
 
    public static void main(String[] args) throws Exception {
        File f = new File("d:" + File.separator + "p.ser");
 
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));
        Person p = (Person) in.readObject();
        in.close();
 
        System.err.println(p.name);// 若给age字段添加private属性,则编译不通过
        System.err.println(p.age);
    }
 
}

字符编码

GBK/GB2312:表示国际中文编码,其中GBK包含简体与繁体中文,而GB2312只包含简体中文ISO 8859-1:一种国际通用编码,可以表示任何文字?查一下

Unicode:一种16进制编码,可以便是任何语言文字?

UTF-8:部分编码使用了Unicode,而另一些则采用了ISO-8859-1,它适合网络传输,在项目开发过程中推荐采用此编码?(为什么)

产生乱码的原因:编码与解码不统一

  

  

  

  

  

  

  

  

  

 

Java IO操作,布布扣,bubuko.com

Java IO操作

上一篇:Linux Netfilter框架分析


下一篇:C++程序设计随笔(一)