欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

字节流、字符流(IO流、字节流、字符流、异常处理、Properties)

程序员文章站 2022-07-10 18:43:13
一、IO流定义:数据的传输看作数据的流动,按照流动的方法,分为输入流和输出流,IO流操作是指使用java.io包下面内容,进行输入、输出,输入叫读取,输出叫写出数据分类:输入流和输出流(按数据的流向)输入流:将数据从硬盘中读到内存输出流:将数据从内存写到硬盘字节流和字符流(按格局数据)字节流:以字节为单位,读数据的流字符流:以字符为单位,读取数据的流流的*父类字节流字符流输入流字节输入流(InputStream)字符输入流(Reader)输出流字节输出...

一、IO流
定义:数据的传输看作数据的流动,按照流动的方法,分为输入流和输出流,IO流操作是指使用java.io包下面内容,进行输入、输出,输入叫读取,输出叫写出数据
分类:
输入流和输出流(按数据的流向)
输入流:将数据从硬盘中读到内存
输出流:将数据从内存写到硬盘
字节流和字符流(按格局数据)
字节流:以字节为单位,读数据的流
字符流:以字符为单位,读取数据的流

流的*父类

字节流 字符流
输入流 字节输入流(InputStream) 字符输入流(Reader)
输出流 字节输出流(OutputStream) 字符输出流(Writer)

字节流
一切数据文件(图片、视频、音频)在存储过程中,都是以二进制的文件形式存储的

字节输出流
java.io.OutputStream:表示字节输出流中的所有类的超类,将指定的字节信息写出到目的地,定义了输出流的基本共性的方法
close():关闭输出流并释放相关联的任何系统资源
flush();刷新
write(byte[] b): 读取b.length的长度的数据写入输出流中
write(byte[] b,int off, int len):从指定的字节数组中写入len字节,从偏移量off开始输出到输出流
write():指定的字节输出流

FIleOutputStream类
java.io.FileOutputStream文件输出流,用于写出文件

构造方法:
FileOutputStream(File file):创建文件输出流写入指定的File对象的表示的文件内
FileOutputStream(String name):创建文件输出流指定的名称的文件

数据追加续写:
FileOutputStream(File file,boolean append):创建文件输出流以指定的file对象的文件中
FileOutputStream(File file, Boolean append):创建文件输出流以指定的名称写出文件
boolean表示:true表示继续追加,false表示不继续追加,刷新重写
换行续写:\r\n–> windows /r–>unix /n–>mac

字节输入流(InputStream)
java.io.InputStream包表示字节输入流的超类,读取流中存储的信息,定义了输入流的基本共性的方法
close():关闭流,释放资源
read():从输入流读取数据的下一个字节

FIleInputStream文件输入流:从文件中读取字节
FileInputStream(File file):打开与实际文件的连接来创建一个FIleInputStream,该文件是有文件系统中的File对象的file命名
FileInputStream(String name):通过打开与实际文件的连接窗机一个FileInputStream,该文件是文件系统中的路径name命名
注:当创建了一个流对象之后,必须要有文件,否则报异常:FIleNotFoundException,
流的关闭原则:先开后关,后开先关

字符流
字符输入流(Reader)
表示读取的字符流的所有的超类,定义了基本共性的方法
close():关闭流,释放资源
read():从输入流中读取一个数据
read(char[] c):从输入流中读取一些字符,并存储到数组中

FileReader类:读取字符文件的便利类,构造时使用系统默认的字符编码和默认字节缓冲区
注:字符编码:字节和i字符的对应规则,windows系统的中文默认编码表时GBK编码表,idea时UTF-8
自己缓冲区:一个字节数组,用来临时存储字节数据

构造方法:
FileReader(FIle file):创建一个新的FileReader,给定要读取的file对象
FIleReader(String name):创建一个新的FileReader,给定要读取的文件的名称。当创建一个流对象时,必须要传入一个文件路径,类似于FileInputStream

字符流
当输入的是,汉字时,可能会出现乱码的情况,因为汉字是多个字节,不能一个个读取,所以出现了字符流类,用于读取文本文件用的,

字符输入流:Reader
close():关闭流,释放资源
read():从输入流中读取一个字符
read(char[] chars):从输入流中读取多个字符,存储到chars里面

FileReader类
读取文本文件的便利类,构造时使用系统默认的字符编码和牧人字节缓冲区
注:字符编码:自己二和字符的对应规则,windows系统的默认中文编码是GBK,idea是utf-8
字节缓冲区:一个字节数组,临时存储字节数据的
构造方法
FileReader(File file):创建一个新的FIleReader对象,给定要读取的file对象
FIleReader(String filename):创建一个新的FIleReader,给定要读取的文件的名称,当你创建一个流对象时,必须传入一个我文件路径,蕾仕于FIleInputStream

字符输出流:Writer
表示用于写出字符流内的所有类的超类,将指定的字符信息写道目的地,定义了输出流的基本共性的方法;
write(int c):写入单个字符
write(char[] chars):写入字符数组
abstract void write(char chars,int off,int len):雪茹字符串某一部分,off表示数组起始索引,len表示结束索引
funch():刷新该流的缓冲
close():关闭流,释放资源
FileWriter类:写出字符到文件的便利类,构造时使用系统默认的字符编码和字符缓冲区

构造方法:
FIleWriter(File file):创建一个新的FIleWriter,给定读取的file对象
FileWriter(String fileName):创建一个新的FileWriter给定读取文件的名称,当创建一个文件流对象时,必须传入一个路径,和FIleOutputStream类似注:关闭和刷新:因为内置缓冲区的原因,不关闭输出流,无法写处字符到文件中,但是关闭流对象,无法继续写出数据,如果想边读边写,就需要flush方法。flush:刷新缓冲区;流对象继续使用
colse:先刷新缓冲区,通知系统释放资源,流对象不在使用

注:字符流只能操作文本文档,不能操作图片、视频等费文本文件,当我们单纯读取或者写文本文件时,使用字符流,其他使用字节流

属性集(Properties)
java.util包下的一个类,继承与hashtable,表示一个持久的属性集,每个键和对应的值都是一个字符串,Properties保存在流中火从流中加载,Properties集合是一个唯一一个和IO流有关的集合,Properties中store方法把集合中临时存储的数据,持久化写入到硬盘存储,Properties集合中的load方法,把硬盘中存储的文件(键值对),读取到集合中使用,
注意:是一个双列集合,k、v值都是String类型
存储键值对的文件中,键与值默认的廉基夫可以使用=、空格、(其他字符)
可以使用#进行注释,被注释的键值对不读取,键与值默认都是字符串,不需要加引号。

昨日习题解答
1.描述:创建两个文件对象,分别使用相对路径和绝对路径创建。
public static void main(String[] args) {
File f1 = new File(“d:/aaa/a.txt”);
File f2 = new File(“a.txt”);
}

2.描述:检查D盘下是否存在文件a.txt,如果不存在则创建该文件。
package Review.Demo;

import java.io.File;
import java.io.IOException;

public class demo2 {
public static void main(String[] args) throws IOException {
File file = new File(“E:\StudyJava\Day14\Day14DM\src\Review\Demo\a.txt”);
if (!file.exists()){
file.createNewFile();
}else {
System.out.println(“有的”);
}
}
}
注:文件路径可能不一样,但大同小异,写的时候需要注意路径,
3.描述:在D盘下创建一个名为bbb的文件夹。
package Review.Demo;

import java.io.File;
public class demo3 {
public static void main(String[] args) {
File file = new File(“E:\StudyJava\Day14\Day14DM\src\Review\Demo\bbb”);
file.mkdir();
}
}

4.描述:在D盘下创建一个名为ccc的文件夹,要求如下:
ccc文件夹中要求包含bbb子文件夹
bbb子文件夹要求包含aaa文件夹
package Review.Demo;

import java.io.File;

public class demo4 {
public static void main(String[] args) {
File file = new File(“E:\StudyJava\Day14\Day14DM\src\Review\Demo\ccc\bbb\aaa”);
file.mkdirs();
}
}

5.描述:
将D盘下a.txt文件删除
将D盘下aaa文件夹删除,要求文件夹aaa是一个空文件夹。
package Review.Demo;

import java.io.File;
public class demo5 {
public static void main(String[] args) {
File file = new File(“E:\StudyJava\Day14\Day14DM\src\Review\Demo\a.txt”);
file.delete();

    File file1 = new File("E:\\StudyJava\\Day14\\Day14DM\\src\\Review\\Demo\\ccc\\bbb\\aaa");
    file1.delete();
}

}

6.获取D盘aaa文件夹中b.txt文件的文件名,文件大小,文件的绝对路径和父路径等信息,并将信息输出在控制台。
package Review.Demo;

import java.io.File;

public class demo6 {
public static void main(String[] args) {
File file = new File(“E:\StudyJava\Day14\Day14DM\src\Review\Demo\aaa\”,“b.txt”);
file.mkdirs();
String path = file.getAbsolutePath();
System.out.println(path);
long length = file.length();
System.out.println(length);
String parent = file.getParent();
System.out.println(parent);
}
}

7.描述:
判断File对象是否文件,是文件则输出:xxx是一个文件,否则输出:xxx是不是一个文件。
判断File对象是否文件夹,是文件夹则输出:xxx是一个文件夹,否则输出:xxx是不是一个文件夹。(xxx是文件名或文件夹名)
package Review.Demo;

import java.io.File;

public class demo7 {
public static void main(String[] args) {
File file = new File(“E:\StudyJava\Day14\Day14DM\src\Review\Demo”);
if (file.isFile()){
System.out.println(“是文件”);
}else {
System.out.println(“不是文件”);
}
if (!file.exists()){
System.out.println(“是文本”);
}else {
System.out.println(“不是文本”);
}
if (file.isDirectory()){
System.out.println(“是文件夹”);
}else {
System.out.println(“不是文件夹”);
}
}
}
8.获取指定文件夹下所有的文件,并将所有文件的名字输出到控制台。
注意:不包含子文件夹下的文件
package Review.Demo;

import java.io.File;

public class demo8 {
public static void main(String[] args) {
File file = new File(“E:\StudyJava\Day14\Day14DM\src\”);
File[] files = file.listFiles();
for (File file1 : files) {
System.out.println(file1);
}
}
}
9.描述:
键盘录入一个文件路径,根据文件路径创建文件对象,判断是文件还是文件夹
如果是文件,则输出文件的大小
如果是文件夹,则计算该文件夹下所有文件大小之和并输出(不包含子文件夹)。
package Review.Demo;

import java.io.File;
import java.util.Scanner;

public class demo9 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println(“请输入一个文件路径:”);
String str = scanner.next();

    File file = new File(str);
    if (file.isFile()){
        System.out.println(file.length());
    }else {
        long length=0;
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isFile()){
                length+=f.length();
            }
        }
        System.out.println(length);
    }
}

}

10.用递归实现不死神兔
故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。
在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,
再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,没有发生死亡,
问:现有一对刚出生的兔子2年后(24个月)会有多少对兔子?
package Review.Demo;

public class demo10 {
public static void main(String[] args) {
System.out.println(method(24));;
}

private static int method(int n) {
    if (n == 1 || n == 2){
        return 1;
    }else {
        return  method(n-1)+method(n-2);
    }
}

}
11.描述:猴子吃桃子问题,猴子第一天摘下若干个桃子,当即吃了快一半,还不过瘾,又多吃了一个。第二天又将仅剩下的桃子吃掉了一半,又多吃了一个。以后每天都吃了前一天剩下的一半多一个。到第十天,只剩下一个桃子。试求第一天共摘了多少桃子?
此题用逆向思维法:
第十天 S10=1,
第九天 S9=2*S10+2
第八天 S8=2S9+2

Sn=2S(n+1)+2

package Review.Demo;
/*
Sn=2S(n+1)+2

  • */
    public class demo11 {
    public static void main(String[] args) {
    System.out.println(S(1));;
    }

    private static int S(int day) {
    if (day == 10){
    return 1;
    }else {
    return 2*S(day+1)+2;
    }
    }
    }

12.获得指定文件夹下所有的java文件(不考虑子文件夹的)并输出到控制台

package Review.Demo;

import java.io.File;

public class demo12 {
public static void main(String[] args) {
File file = new File(“E:\StudyJava\Day14\Day14DM\src\Review\Demo”);
File[] files = file.listFiles();
for (File file1 : files) {
if (file1.getName().endsWith(".java")){
System.out.println(file1.getAbsolutePath());
}
}
}
}

13.键盘录入一个文件夹路径,删除该文件夹以及文件夹路径下的所有文件。
要求:录入的文件夹里面要有多个文件,不能包含有子文件夹。
提示:如果文件夹里面有文件,则需要先将文件删除才能删除文件夹。
package Review.Demo;

import java.io.File;
import java.util.Scanner;

public class demo13 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(“请输入一个文件路径:”);
String filePath = sc.next();

    File file = new File(filePath);
    File[] files = file.listFiles();
    for (File file1 : files) {
        file1.delete();
    }
    System.out.println(file.delete()?"删除成功":"删除失败");
}

}
14.描述:从键盘接收一个文件夹路径,获得该文件夹大小并输出到控制台。
package Review.Demo;

import java.io.File;
import java.util.Scanner;

public class demo14 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println(“请输入一个文件路径:”);
String filePath = scanner.next();
File dir = new File(filePath);
long length = Cal(dir);
System.out.println(length);
}

private static long Cal(File dir) {
    long length = 0;
    File[] ff = dir.listFiles();
    for (File file : ff) {
        if (file.isFile()){
            length+=file.length();
        }else {
            length+=Cal(file);
        }
    }
    return length;
}

}

今日题库
1.描述:利用字节输出流一次写一个字节的方式,向D盘的a.txt文件输出字符‘a’。
2.描述:利用字节输出流一次写一个字节数组的方式向D盘的b.txt文件输出内容:“i love java”。
3.描述:在D盘下,有一c.txt 文件中内容为:HelloWorld
在c.txt文件原内容基础上,添加五句 I love java,而且要实现一句一行操作(注:原文不可覆盖)。
利用字节输出流对象往C盘下c.txt文件输出5句:”i love java”
4.描述:利用字节输入流读取D盘文件a.txt的内容,文件内容确定都为纯ASCII字符
,使用循环读取,一次读取一个字节,直到读取到文件末尾。将读取的字节输出到控制台
5.描述:利用字节输入流读取D盘文件b.txt的内容,文件内容确定都为纯ASCII字符
,使用循环读取,一次读取一个字节数组,直到读取到文件末尾,将读取到的字节数组转换成字符串输出到控制台。
6.描述:利用字节流将E盘下的a.png图片复制到D盘下(文件名保存一致)
要求:
一次读写一个字节的方式
7.练习七:字符输出流写出字符数据
项目需求:请用户从控制台输入信息,程序将信息存储到文件Info.txt中。可以输入多条信息,每条信息存储一行。当用户输入:”886”时,程序结束。
8.描述:
我有一个文本文件score.txt,我知道数据是键值对形式的,但是不知道内容是什么。
请写一个程序判断是否有"lisi"这样的键存在,如果有就改变其实为"100"
score.txt文件内容如下:
zhangsan = 90
lisi = 80
wangwu = 85
9.描述:
在D盘下有一个文本文件test.txt(里面的内容由数字和字母组成)
定义一个方法统计test.txt文件中’a’字符出现的次数。
比如a字符在文件中出现了10次则调用方法传入a后,方法内部输出:a出现10次
10.描述:
从控制台循环接收用户录入的学生信息,输入格式为:学号-学生名字
将学生信息保存到D盘下面的stu.txt文件中,一个学生信息占据一行数据。
当用户输入end时停止输入。
11.需求说明:从控制台接收3名学员的信息,每条信息存储到一个Student对象中,将多个Student对象存储到一个集合中。输入完毕后,将所有学员信息存储到文件Student.txt中。每名学员信息存储一行,多个属性值中间用逗号隔开。

本文地址:https://blog.csdn.net/weixin_44518089/article/details/107847552

相关标签: 面向对象 java