> Java > java지도 시간 > Java의 IO 스트림에 의한 파일 작업의 코드 예

Java의 IO 스트림에 의한 파일 작업의 코드 예

不言
풀어 주다: 2019-02-22 13:54:06
앞으로
2375명이 탐색했습니다.

本篇文章给大家带来的内容是关于java中IO流对文件操作的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

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

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

字节流的一些操作   

        //读文件

        FileInputStream fis = new FileInputStream("java.txt");

        int temp = fis.read()//一次读取一个字节

        System.out.println(temp); //打印的字母的码值  读取完返回-1

        System.out.println((char)temp);//打印字母

         

         

        byte[] arr = new byte[6]; //定义byte数组告诉系统一次读取几个字节,减少内存和硬盘之间的通信,可以提高效率

        int temp = bis.read(arr); //有参的read方法返回的int值是读取了几个字节

        System.out.println(new String(arr, 0, temp)); //

         

        //写文件

        FileOutputStream fos = new FileOutputStream("file" + File.separator + "1024.txt",true);

            //如果该文件不存在,则会自动创建

            //传入true会在文件内容的后面写入文字,而不会覆盖之前的内容

            //开发中文件分隔符最好不要直接写\  而是写 File.separator

             

         

        String msg = "Hello World";

        fos.write("\n".getBytes());//换行,并向文件写入  String.getBytes() 因为要以字节的形式传入

        fos.write(msg.getBytes());

         

         

        String msg = "好好学习";

        //一个汉字占2个字节,向里面一次传入3个字节会导致乱码

        fos.write(msg.getBytes(), 0, 3);

         

         

        byte[] arr = new byte[6];//一次性写这么多字节

        int temp = fis.read(arr);

        fos.write(arr, 0, temp);

 

        fos.flush();//刷新

         

         

        //新的jdk7写法是在try括号()里面写文件的链接, 这样最后就不用关闭了,会自动关闭

         

        //缓冲输入流底层默认创建一个大小是8192长度的byte数组

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("java.txt"));

        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("file" + File.separator + "good.txt"));

         

        int temp = bis.read();//temp依然为ascii玛  每次一个

로그인 후 복사

一些练习

利用BufferedInputStream 和 BufferedOutputStream 实现将一个文件copy到另一个文件

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

32

33

34

35

36

37

38

39

40

package com.wpbxx.stream;

 

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

 

public class BufferFileCopy {

 

    public static void main(String[] args) {

        BufferedInputStream bis = null;

        BufferedOutputStream bos = null;

        try {

            bis = new BufferedInputStream(new FileInputStream("java.txt"));

            bos = new BufferedOutputStream(new FileOutputStream("file" + File.separator + "good.txt"));

            int temp;

            while((temp = bis.read()) != -1){

                bos.write(temp);

            }

            bos.flush();

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally{

            try {

                bis.close();

                bos.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

             

        }

         

    }

 

}

로그인 후 복사

文件的加密 将一个字节异或一个数字实现 在传输时进行文件的加密

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

package com.wpbxx.stream;

 

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

public class CodeFile {

 

    public static void main(String[] args) {

        //jdk7新写法

        try (

                BufferedInputStream bis = new BufferedInputStream(new FileInputStream("图片.png"));

                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("code.png"));

                ) {

             

            int temp;

            while((temp = bis.read()) != -1){

                bos.write(temp ^ 88);

            }

             

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

 

}

로그인 후 복사

文件解密

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.wpbxx.stream;

 

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

public class DecodeFile {

 

    public static void main(String[] args) {

        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("code.png"));

                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("decode.png"));) {

            int temp;

            while ((temp = bis.read()) != -1) {

                bos.write(temp ^ 88);

            }

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

 

}

로그인 후 복사

字符流的一些操作 可以解决乱码的问题

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

//读

        //注意:字符流不能读取非文本文件

        FileReader fr = new FileReader("java.txt");

        int temp;

        while ((temp = fr.read()) != -1) {

            System.out.println((char) temp); //一次一个字符

        }

        //使用缓冲字符流

        BufferedReader br = new BufferedReader(new FileReader("word.txt"));

        String msg;

        while((msg = br.readLine()) != null){  //一次可以读取一行

            System.out.println(msg);

        }

        //写

        FileWriter fw = new FileWriter("word.txt");

        fw.write("我喜欢学习java");

        fw.write(97);

         

        BufferedWriter bw = new BufferedWriter(new FileWriter("newbuffered.txt"));

        bw.write("你好");

        bw.newLine();//回车换行

        bw.write("java");

로그인 후 복사

同样是copy文件

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.wpbxx.chario;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

/**

 * 使用缓冲流拷贝文件

 * 注意:字符流不能读取非文本文件

 */

public class BufferFileCopy {

    public static void main(String[] args) {

        try (BufferedReader br = new BufferedReader(new FileReader("java.txt"));

            BufferedWriter bw = new BufferedWriter(new FileWriter("file" + File.separator + "hellojava.txt"));   

                ) {

            String msg;

            while((msg = br.readLine()) != null){

                bw.write(msg);

                bw.newLine();

            }

            bw.flush();

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e1) {

            e1.printStackTrace();

        }

    }

 

}

로그인 후 복사

通过java中的File类实现对文件的一些操作

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

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

File file1 = new File("D:\\hello.txt");

        //如果文件存在,就不创建了,返回false,如果不存在就会创建,返回true

        System.out.println(file1.createNewFile());

         

        File file2 = new File("D:\\new");

        //如果文件夹存在,就不创建了,返回false,如果不存在就会创建,返回true

        System.out.println(file2.mkdir());

         

        File file3 = new File("D:\\wpbxx\\1024");

        //可以创建多级目录,如果文件夹存在,就不创建了,返回false,如果不存在就会创建,返回true

        System.out.println(file3.mkdirs());

         

        File file4 = new File("D:\\wpbxx\\1024.txt");

        //只能创建文件夹

        System.out.println(file4.mkdirs());

         

        File file5 = new File("1026.txt");

        //如果不写盘符,会默认在项目的根目录里面创建

        System.out.println(file5.createNewFile());

        System.out.println(file5.exists());

         

        //旧名字

        File oldFile1 = new File("D:\\world.txt");

        //新名字

        File newFile1 = new File("D:\\wpbxx\\java.txt");

        //如果两个文件路径不一致,则会将旧文件剪切到新的文件路径中再重命名

        oldFile1.renameTo(newFile1);

         

         

        //不会将文件放到回收站中,而是直接删除

        File del = new File("D:\\wpbxx\\java.txt");

         

        File del1 = new File("D:\\wpbxx");

        //如果文件夹下有其他文件,则不会删除

        System.out.println(del1.delete());

         

                File file2 = new File("D:\\new.txt");

        //判断是否是文件夹

        System.out.println(file2.isDirectory());

        //判断是否是文件

        System.out.println(file2.isFile());

         

        //判断文件是否存在

        System.out.println(file2.exists());

         

        File file3 = new File("D:\\hidden");

        //判断文件是否隐藏

        System.out.println(file3.isHidden());

         

         

        File file1 = new File("1024.txt");

        //查看绝对路径

        System.out.println(file1.getAbsolutePath());

        //文件的大小,单位是字节

        System.out.println(file1.length());

        //最后修改时间

        Date date = new Date(file1.lastModified());

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        System.out.println(sdf.format(date));

         

        File file2 = new File("F:\\wpbxx\\代码\\code\\chapter-08");

        //获取目录下的同级文件或文件夹的名称

        String[] nameArray = file2.list();

        for(String name : nameArray){

            System.out.println(name);

        }

로그인 후 복사

几个小练习

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

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

package com.wpbxx.exercise;

 

import java.io.File;

import java.util.Scanner;

 

/**

 * 问题:从键盘接收一个路径,将这个路径下的所有文件和文件夹的名字按照层级打印。

 * 例如:

 *    wpbxx

 *              java

 *                  XXX.java

 *                  XXX.jpg

 *              php

 *                  XXX.php

 *              readme.txt

 *

 * 分析:获取路径File对象中的File数组

 *     遍历数组,取得File对象

 *     打印文件或文件夹的名字

 *     如果是一个文件夹的话,使用递归重复上面的操作

 */

public class FileNames {

     

    //用来记录缩进的次数

    private static int count = 0;

 

    public static void main(String[] args) {

         

        File file = getFile();

         

        getFileNames(file);

    }

     

    //每次调用该方法时,说明进入到一个新的文件夹的内部,需要增加一个缩进

    private static void getFileNames(File file) {

        //获取路径File对象中的File数组

        File[] fileArray = file.listFiles();

         

        //遍历数组,取得File对象

        for(int i=0; i<fileArray.length; i++){

             

            //通过遍历count来控制打印几个缩进

            for(int j=0; j<count; j++){

                System.out.print("\t");

            }

             

            //打印文件或文件夹的名字

            System.out.println(fileArray[i]);

             

             

             

            //如果是一个文件夹的话,使用递归重复上面的操作

            if(fileArray[i].isDirectory()){

                count++;

                getFileNames(fileArray[i]);//数组遍历完最后一个File对象时,说明当前文件夹已经遍历结束,需要做自减运算

                count--;

            }

             

        }

    }

     

    //获取用户输入路径的File对象

    private static File getFile() {

         

        System.out.println("请输入一个文件夹路径:");

         

        Scanner sc = new Scanner(System.in);

        //获取用户输入的路径,用户输入的路径有可能是错误的,需要进行判断

        while(true){

            String input = sc.nextLine();

            File file = new File(input);

            if(!file.exists()){

                System.out.println("您输入的文件路径有误,请重新输入文件路径:");

            }else if(file.isFile()){

                //如果用户输入的路径是一个文件

                System.out.println("您输入的路径是一个文件,请输入一个文件夹的路径");

            }else{

                return file;

            }

        }

    }

     

     

 

}

로그인 후 복사

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

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

package com.wpbxx.exercise;

 

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

 

/**

 * 问题:收费版软件有试用次数,利用IO流的知识,模拟一个可以试用3次的功能,打开3次之后提示用户购买正版软件

 *

 * 分析:将试用的次数做加密处理后写到txt文件中

 *     使用IO流相关的知识将txt文件中的内容读取到内存中

 *     如果读取的内容小于0时提示用户购买正版软件

 *     如果大于0小于等于3时,将试用次数做自减运算之后写出到txt文件中

 */

public class Trial {

 

    public static void main(String[] args) {

        //code();

        BufferedInputStream bis = null;

        BufferedOutputStream bos = null;

        try {

            bis = new BufferedInputStream(new FileInputStream("src" + File.separator + "com"

                    + File.separator + "monkey1024" + File.separator + "exercise" + File.separator + "config.txt"));

            int temp = bis.read();

            //解密处理

            int count = temp ^ 66;

            if(count > 0 && count <= 3){

                count--;

                System.out.println("您的试用次数还剩余" + count + "次");

                bos = new BufferedOutputStream(new FileOutputStream("src" + File.separator + "com"

                        + File.separator + "monkey1024" + File.separator + "exercise" + File.separator + "config.txt"));

                //做加密处理

                bos.write(count ^ 66);

                bos.flush();

            }else{

                System.out.println("您的试用次数已超出限制,请购买正版软件!");

            }

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally{

            try {

                //避免出现空指针

                if(bis != null){

                    bis.close();

                }

                if(bos != null){

                    bos.close();

                }

                 

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

     

    //试用次数加密处理

    private static void code() {

        BufferedOutputStream bos = null;

        try {

            bos = new BufferedOutputStream(new FileOutputStream("src" + File.separator + "com"

                    + File.separator + "monkey1024" + File.separator + "exercise" + File.separator + "config.txt"));

            //加密处理

            bos.write(3 ^ 66);

            bos.flush();

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally{

            try {

                //避免出现空指针异常

                if(bos != null){

                    bos.close();

                }

                 

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

 

 

}

로그인 후 복사

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

package com.wpbxx.exercise;

import java.io.File;

/**

 * 问题:统计项目根目录下以.txt结尾的文件数量,并将文件名打印出来

 * 分析:获取项目根目录下的文件名

 *     对文件名进行判断是否是以.txt结尾

 */

public class FindTxt {

    public static void main(String[] args) {

        File file = new File("F:\\wpbxx\\01-JavaSE\\代码\\code\\chapter-08");

        File[] fileArray = file.listFiles(); //返回一个File列表就是该目录下的File列表

         

        //统计出现次数

        int count = 0;

        for(File name : fileArray){

            String s = name.toString();

             

            //判断是否是以.txt文件结尾

            if(s.endsWith(".txt")){

                if(name.isFile()){

                    count++;

                    System.out.println(name);

                }

            }

        }

         

        System.out.println("以.txt文件结尾的数量是" + count + "个");

         

    }

}

로그인 후 복사

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.monkey1024.file;

 

import java.io.File;

import java.io.FilenameFilter;

 

/**

 * 问题:统计项目根目录下以.txt结尾的文件数量,并将文件名打印出来

 * 使用文件过滤器实现上述需求

 */

public class FilenameFilterTest01 {

 

    public static void main(String[] args) {

        File file = new File("F:\\monkey1024\\01-JavaSE\\代码\\code\\chapter-08");

        String[] nameArray = file.list(new FilenameFilter() {

            @Override

            public boolean accept(File dir, String name){

                //获取根目录下每个文件的File对象

                File file1 = new File(dir, name);

                //编写筛选条件

                return file1.isFile() && file1.getName().endsWith(".txt");

            }

        });

         

        System.out.println("以.txt结尾的文件个数是" + nameArray.length + "个");

         

        for(String name : nameArray){

            System.out.println(name);

        }

    }

 

}

로그인 후 복사

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.wpbxx.file;

import java.io.File;

import java.io.FilenameFilter;

/**

 * 问题:统计项目根目录下以.txt结尾的文件数量,并将文件名打印出来

 * 使用文件过滤器实现上述需求

 */

public class FilenameFilterTest01 {

    public static void main(String[] args) {

        File file = new File("F:\\wpbxx\\01-JavaSE\\代码\\code\\chapter-08");

        String[] nameArray = file.list(new FilenameFilter() {//重写accept方法 

            @Override

            public boolean accept(File dir, String name){//将过滤的规则写进来

                //获取根目录下每个文件的File对象

                File file1 = new File(dir, name);

                //编写筛选条件

                return file1.isFile() && file1.getName().endsWith(".txt");

            }

        });

        System.out.println("以.txt结尾的文件个数是" + nameArray.length + "个");

        for(String name : nameArray){

            System.out.println(name);

        }

    }

}

로그인 후 복사

对对象的读取

为啥要对对象读取?

平时我们在Java内存中的对象,是无 法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即 存储对象中的状态。一个Java对象的表示有各种各样的方式,Java本身也提供给了用户一种表示对象的方式,那就是序列化。换句话说,序列化只是表示对 象的一种方式而已。OK,有了序列化,那么必然有反序列化,我们先看一下序列化、反序列化是什么意思。

序列化:将一个对象转换成一串二进制表示的字节数组,通过保存或转移这些字节数据来达到持久化的目的。

反序列化:将字节数组重新构造成对象。

序列化只需要实现java.io.Serializable接口就可以了。序列化的时候有一个serialVersionUID参数,Java序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。 在进行反序列化,Java虚拟机会把传过来的字节流中的serialVersionUID和本地相应实体类的serialVersionUID进行比较, 如果相同就认为是一致的实体类,可以进行反序列化,否则Java虚拟机会拒绝对这个实体类进行反序列化并抛出异常。serialVersionUID有两 种生成方式:

如果一个类的对象支持序列化和反序列化,需要实现Serializable,Serializable中没有任何方法,只是相当于一个标记

有一个类

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

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

package com.monkey1024.serializable;

 

import java.io.Serializable;

 

/**

 * 如果一个类的对象支持序列化和反序列化,需要实现Serializable

 * Serializable中没有任何方法

 */

public class Student implements Serializable{

     

     

    /**

     * 自动生成序列化版本号

     */

    private static final long serialVersionUID = -716323668524282676L;

 

    private String name;

     

    //添加属性后,使用反序列化时会报出InvalidClassException

    //transient修饰的变量不会被序列化

    transient private int age;

     

    private boolean sex;

     

    public boolean isSex() {

        return sex;

    }

 

    public void setSex(boolean sex) {

        this.sex = sex;

    }

 

    public int getAge() {

        return age;

    }

 

    public void setAge(int age) {

        this.age = age;

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

     

}

로그인 후 복사

然后我们对这个类进行序列化和反序列化

1

2

3

4

5

6

7

8

9

10

11

12

13

Student zhangsan = new Student();

        zhangsan.setName("张三");

        zhangsan.setAge(20);

        //写

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("zhangsan"));

        oos.writeObject(zhangsan);

        oos.flush();

         

        //读

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("zhangsan"));

        Student s = (Student)ois.readObject();

        System.out.println(s.getName());

        System.out.println(s.getAge());

로그인 후 복사

위 내용은 Java의 IO 스트림에 의한 파일 작업의 코드 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:cnblogs.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿