Java入门系列(十)Java IO

总体而言,java的读写操作又分为两种:字符流和字节流。

什么是流?

流是一个抽象的概念。当Java程序需要从数据源读取数据时,会开启一个到数据源的流。数据源可以是文件,内存或者网络等。同样,当程序需要输出数据到目的地时也一样会开启一个流,数据目的地也可以是文件、内存或者网络等。流的创建是为了更方便地处理数据的输入输出。

那么字节流和字符流又有什么区别呢?

1.字节流也称为原始数据,需要用户读入后进行相应的编码转换。而字符流的实现是基于自动转换的,读取数据时会把数据按照JVM的默认编码自动转换成字符。

2.字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。

所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的。

3.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串,字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以;

基于以上的区别,那么什么情况下用字符流,什么情况下用字节流呢?

stream结尾都是字节流,reader和writer结尾都是字符流

两者的区别就是读写的时候一个是按字节读写,一个是按字符。实际使用通常差不多。

在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。

只是读写文件,和文件内容无关的,一般选择字节流。

如果是音频文件、图片、歌曲,就用字节流好点;如果是中文(文本)的,用字符流更好;

说了这么多,字节流和字符流处理文件到底怎么用呢?

稍安勿躁,让我们先来看看在java中,输入输出操作的步骤是什么?

1 使用File类打开一个文件

2 通过字节流或字符流的子类,指定输出的位置

3 进行读/写操作

4 关闭输入/输出

IO操作属于资源操作,一定要记得关闭

实战代码

读写文本文件

package cnki.common.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.junit.Test;

public class test {

    @Test
    public void function2() throws IOException {
        File file = new File("C:\\Users\\wangzl\\Desktop\\file\\file.txt");
        List<String> list = new ArrayList<String>();
        list.add("aaa1");
        list.add("bbb1");
        list.add("ccc1");
        // 写入by FileUtils(覆盖原有的文本)
        FileUtils.writeLines(file, "UTF-8", list);
        // 写入by IOUtils(覆盖原有的文本)
        IOUtils.writeLines(list, null, new FileOutputStream(file));
        // 追加
        OutputStream os = new FileOutputStream(file, true);// 第二个参数true表示追加
        IOUtils.writeLines(list, null, os, "UTF-8");
        // 读取by FileUtils
        List<String> lines_FileUtils = FileUtils.readLines(file, "UTF-8");
        // 读取by IOUtils
        List<String> lines_IOUtils = IOUtils.readLines(new FileInputStream(file), "UTF-8");
        // 遍历
        Iterator<String> it = lines_FileUtils.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }

    @Test
    public void function1() {
        try {
            File file = new File("C:\\Users\\wangzl\\Desktop\\file\\file.txt");
            List<String> list = FileUtils.readLines(file, "UTF-8");
            // 方法一:超级for循环遍历
            for (String item : list) {
                System.out.println(item);
            }
            // 方法二:对于ArrayList来说速度比较快, 用for循环, 以size为条件遍历:
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));
            }
            // 方法三:集合类的通用遍历方式, 从很早的版本就有, 用迭代器迭代
            Iterator<String> it = list.iterator();
            while (it.hasNext()) {
                System.out.println(it.next());
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

递归获取指定目录下的文件

    //递归获取指定目录下的文件
    public void GetAllFilesByRecursive(String path) {
        File file = new File(path);
        if (file.exists()) {
            File[] files = file.listFiles();
            if (files.length == 0) {
                System.out.println("文件夹是空的!");
                return;
            } else {
                for (File file2 : files) {
                    if (file2.isDirectory()) {
                        System.out.println("文件夹:" + file2.getAbsolutePath());
                        GetAllFilesByRecursive(file2.getAbsolutePath());
                    } else {
                        System.out.println("文件:" + file2.getAbsolutePath());
                    }
                }
            }
        } else {
            System.out.println("文件不存在!");
        }
    }

递归获取指定目录下的文件

https://www.cnblogs.com/zyp777/p/8906143.html

http://www.cnblogs.com/Java3y/p/9036728.html

原文地址:https://www.cnblogs.com/cnki/p/8711656.html

时间: 2024-08-29 10:48:04

Java入门系列(十)Java IO的相关文章

Java入门——深入理解Java三大特性

Java入门——深入理解Java三大特性 本Blog内容: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法(getter,setter),如果不想被外界方法,我们大可不必提供方法给外界访问. 封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码. 可以对成员变量进行更精确的控制.(在setter方法中进行实际意义的校验) 总结:控制属性访问权限,不是你想改就能改.容易修改属性类型.精确控制属性的取值范围. 继承 继承是使用已存在的类

【小白的java成长系列】——Java基础知识

今天来说说java的基础知识,个人感觉都不知道要说啥的,还是为后面的内容做一些铺垫吧~ 今天主要说的都是java面向对象之前的基础知识,比如数据类型呀,表达式运算符呀~等等一系列的知识,下节来说说面向对象.今天这节我就不用程序来说明,直接用文字说明.因为个人感觉真木有啥好说的,这些程序后续都会说到的,比较简单,写写就会了的..好吧~开始了... 1. Java数据类型划分: 基本数据类型:都是一个个具体的值 数值型:表示具体的数字,所有的整数默认情况下都是int,所有的小数都是double型的

【小白的java成长系列】——java关键字

准备出一个系列的内容啦,今天就从关键字开始说起吧~ 类型 关键字 说明 关键字 说明 访问控制权限 public 公共的,公开的, protected 受保护的,用来修饰属性或方法.只能符合有包内友好关系,或者是父子友好的类才能够访问,即:同层次包底下的可以访问:不能修饰类. private 私有的,用来修饰属性或方法,只能类的内部本身才能够访问,不能修饰类.   其实修饰符还有一种友好的类型 类.方法和变量修饰符 abstract 抽象;可以用来修饰类和方法,被修饰的类不能够实例化(即不能用n

Java多线程系列十——BlockingQueue类

参考资料:http://ifeve.com/java-synchronousqueue/http://www.cnblogs.com/jackyuj/archive/2010/11/24/1886553.htmlhttp://ifeve.com/java-blocking-queue/ BlockingQueue的几个API认识 方法 说明 add(E e) 添加元素,超出队列size上限后抛异常 offer(E e) 添加元素,超出队列size上限后抛异常,相比add官方更建议使用offer方

Java入门系列-20-异常

为什么要进行异常处理 下面这段代码能否正常执行 public class DemoCalc { public static void main(String[] args) { int a=0; int b=0; int c=a/b; System.out.println("运算结果为:"+c); } } 结果是我们在控制台中看到一段错误提示,那是因为除数不能为0.异常就是在程序运行过程中发生的不正常事件,会中断运行的程序. Java 使用了异常处理机制为程序提供了错误处理的能力,在程

Java入门系列-25-NIO(实现非阻塞网络通信)

还记得之前介绍NIO时对比传统IO的一大特点吗?就是NIO是非阻塞式的,这篇文章带大家来看一下非阻塞的网络操作. 补充:以数组的形式使用缓冲区 package testnio; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class TestBufferArray { pub

Java入门系列:处理Json格式数据

本节主要讲解: 1)json格式数据处理方法 2)第三方工具包的使用方法 3)java集合数据类型 [项目任务] 编写一个程序,显示未来的天气信息. [知识点解析] 为了方便后面代码的分析,先需要掌握几个相关的知识. 1.什么是json格式数据 从结构上看,我们所见到的所有的数据(data)最终都可以分解成三种类型: 第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词. 第二种类型是序列(sequence),也就是

Java入门系列-07-从控制台中接收输入

这篇文章帮你使用Scanner类从控制台接收输入 从控制台接收字符串 敲一敲: import java.util.Scanner; public class DemoScanner { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.println("请输入用户名:"); String name=input.next(); System.out.print

java se系列(十二)集合

1.     集合 1.1. 什么是集合 存储对象的容器,面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,存储对象,集合是存储对象最常用的一种方式. 集合的出现就是为了持有对象.集合中可以存储任意类型的对象, 而且长度可变.在程序中有可能无法预先知道需要多少个对象, 那么用数组来装对象的话, 长度不好定义, 而集合解决了这样的问题. 1.2. 集合和数组的区别 数组和集合类都是容器 数组长度是固定的,集合长度是可变的.数组中可以存储基本数据类型,集合只能存储对象数组中存储