IO流
一.IO流的概述
IO流,简单来说就是存储和读取数据的解决方案。而IO流与File又息息相关,因此在正式学习IO流之前先来简单的认识一下File。
File
它表示系统中文件或者文件夹的路径,这个路径可以是存在的,也可以是不存在的。File类只能对文件本身进行操作,不能读写文件里面存储的数据。在File类中有三种构造方法
public File(String pathname) //把字符串表示的路径编程File对象
public File(String pathname,String child) //把父级路径和子级路径进行拼接
public File(File path,String child) //把父级路径和子级路径进行拼接
File中有一些常见方法需要我们知道:
public class File文件 {
public static void main(String[] args){
/*
public boolean isDiectory() 判断路径名表示的File是否为文件夹
public boolean isFile() 判断路径名表示的File是否为文件
public boolean exists() 判断路径名表示的File是否存在
*/
//判断的方法
//1.对一个文件的路径进行判断
File f1=new File("C:\\Users\\Administrator\\Desktop\\game\\崩坏:星穹铁道.lnk");
System.out.println(f1.isFile());
System.out.println(f1.isDirectory());
//2.对一个文件夹的路径进行判断
File f2=new File("C:\\Users\\Administrator\\Desktop\\game");
System.out.println(f2.isFile());
System.out.println(f2.isDirectory());
//3.对一个不存在的路径进行判断
File f3=new File("D:\\Users\\Administrator\\Desktop\\game");
System.out.println(f3.exists());
//获取的方法
/*
public long length() 返回文件的大小(字节数量)
public String getAbsolutePath() 返回文件的绝对路径
public String getPath() 返回定义文件时使用的路径
public String getName() 返回文件的名称,带后缀
public long lastModified() 返回文件的最后修改时间(时间毫秒值)
*/
//1.length
//细节1:该方法返回的是文件的字节大小,如果要转换位M,G,需要一直除以1024
System.out.println(f1.length());
//细节2:该方法不能够返回文件夹的大小,得到的值是错误的,如果要获得文件夹的大小,需要将文件夹里的文件大小累加起来
System.out.println(f2.length());
//2.getAbsolutePath
File f4=new File("lnk");
System.out.println(f4.getAbsolutePath());
System.out.println(f2.getAbsolutePath());
//3.getPath()
System.out.println(f1.getPath());
//4.获取名字
//细节:如果说调用者是文件,则会返回其文件名和后缀名;如果是文件夹,则返回文件夹的名字
System.out.println(f1.getName());
System.out.println(f2.getName());
//5.lastModified 返回文件的最后修改时间(时间毫秒值)
System.out.println(f1.lastModified());
}
}
public class File2 {
public static void main(String[] args) throws IOException {
/*
public boolean creatNewFile() 创建一个新的空的文件夹
public boolean mkdir() 创建单级文件夹
public boolean mkdirs() 创建多级文件夹
public boolean delete() 删除文件,空文件夹
*/
//1.creatNewFile 创建一个新的空的文件夹
//细节:1.如果当前路径表示的文件是不存在的,则创建成功,方法返回true,否则创建失败,返回false
// 2.如果父级路径不存在,那么方法会有异常IOEXception
// 3.creatNewFile方法创建的一定是文件,如果路径中不包含后缀名,则创建一个没有后缀的文件
File f1=new File("D:\\1\\aaa.txt");
System.out.println(f1.createNewFile());
//2.mkdir make Director 文件夹(目录)
//细节:1.windows当中路径是唯一的,如果当前路径已经存在,则创建失败,返回false
// 2.mkdir方法只能创建单级文件夹,无法创建多级文件夹
File f2=new File("D:\\1\\bbb");
System.out.println(f2.mkdir());
//3.mkdirs 创建多级文件夹
//细节:既可以创建多级,也可以创建单级
File f3=new File("D:\\1\\ccc\\ddd\\eee");
File f4=new File("D:\\1\\eee");
System.out.println(f3.mkdirs());
System.out.println(f4.mkdirs());
//4.delete 删除文件,直接永久删除,不经过回收站
//如果删除的是有内容的文件夹,则删除失败
File f5=new File("D:\\1\\ccc");
System.out.println(f1.delete());
System.out.println(f2.delete());
System.out.println(f3.delete());
System.out.println(f4.delete());
System.out.println(f5.delete());
}
}
File中常见的方法大致就这些了。
因为File类只能对文件本身进行操作,不能读写文件里面存储的数据,因此,要想对本地,网络文件中的数据进行读写,只能够通过IO流来解决
IO流的分类
IO流有两种分类方式,一种是按照流向来分,一种是按照操作文件的类型来分。
按照流向,可以将IO流分为输入流和输出流
按照操作文件的类型可以分为字节流(可以操作所有类型的文件)和字符流(只能操作纯文本文件)
接下来我们将来一次学习IO流中的各个组成部分。
二.字节流
一.字节输出流
FileOutStream:操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。
其书写的步骤分为三步:1.创建数字输出流对象 2.写数据 3.释放空间 。举个例子
public class FileOutputStream测试 {
public static void main(String[] args) throws IOException {
//创建对象(参数是字符串表示的路径或者是File对象都是可以的;如果文件不存在会创建一个新的文件,弹药保证腹肌路径是存在的;若文件已经存在,则会覆盖原来的文件)
FileOutputStream f=new FileOutputStream("D:\\JAVAproject\\untitled\\a.txt");
// byte[] bytes={97,98,99,100,101};
// f.write(bytes);
// f.close();
byte[] bytes={97,98,99,100,101};
//从0索引开始,写3个字节到文件中
f.write(bytes,0,3);
f.close();
}
}
二.字节输入流
FileInput:操作本地文件的字节输入流,可以把本地文件中的数据读到程序中来
其书写的步骤分为三步:1.创建数字输出流对象 2.写数据 3.释放空间。举个例子:
public class FileInputStream测试 {
public static void main(String[] args) throws IOException {
//创建对象(如果文件不存在,就直接报错)
FileInputStream f=new FileInputStream("D:\\JAVAproject\\untitled\\src\\a.txt");
//read的底层原理就是迭代器,读到文件末尾的时候,方法返回-1
while(f.read()!=-1){
System.out.println((char)f.read());
}
//释放资源
f.close();
}
}
三.字符流
一.字符集详解
在计算机中,任意数据都是以二进制的形式来存储的,计算机中最小的存储单元是一个字节(8个比特位)。在ASCII字符集中,一个英文占一个字节。而在简体中文版Windows系统中,默认使用的是GBK字符集。GBK字符集完全兼容ASCII字符集,并且一个英文占一个字节,二进制第一位是0;一个中文占两个字节,二进制高位字节的第一位是1。
但鉴于全球有多种文字,为了统一标准,由美国牵头,创建了Unicode(万国码)。我们需要知道的是Unicode字符集的UTF-8编码格式:
一个英文占一个字节,二进制第一位是0,转成十进制 是正数;
一个中文占三个字节,二进制第一位是1,第一个字节 转成十进制是负数
对于乱码出现的原因,我们可以总结为两点:1.读取数据时未读完整个汉字 2.编码和解码的方式不一样
二.字符输入流
字符输入流(Character Input Stream)是一种用于读取字符数据的输入流。它是Java中java.io.Reader
类的子类,用于处理以字符为单位的数据。
使用字符输入流,你可以逐个字符地读取文本文件中的内容,并将其转换为相应的字符数据。它提供了各种读取字符的方法,包括按字符、按行等方式读取。
以下是使用字符输入流的基本步骤:
-
创建字符输入流对象:通过创建
Reader
的子类对象来建立字符输入流,可以使用FileReader
类来读取文件中的字符数据。Reader reader = new FileReader("filename.txt");
-
读取字符数据:通过调用字符输入流对象的读取方法来读取字符数据。常用的方法包括:
read()
:读取单个字符,并返回其对应的Unicode编码值。如果到达文件末尾,则返回-1。read(char[] cbuf)
:读取一定数量的字符,并存储到提供的字符数组中。返回实际读取的字符数,如果到达文件末尾,则返回-1。read(char[] cbuf, int off, int len)
:从指定的偏移位置开始读取一定数量的字符,并存储到提供的字符数组中。返回实际读取的字符数,如果到达文件末尾,则返回-1。
例如,使用
read()
方法按字符读取文件中的内容:int data; while ((data = reader.read()) != -1) { char c = (char) data; // 处理读取到的字符 }
-
关闭字符输入流:在使用完字符输入流后,应关闭它以释放系统资源。
reader.close();
需要注意的是,字符输入流使用的是默认字符集编码(如UTF-8),要指定特定的字符集编码,可以使用InputStreamReader
类来创建字符输入流对象。
以上就是使用字符输入流的基本操作,它可以帮助你读取并处理文本文件中的字符数据。
三.字符输出流
字符输出流(Character Output Stream)用于将字符数据写入到输出目标,通常是文本文件或字符数组。它是Java中java.io.Writer
类的子类,用于处理以字符为单位的输出操作。
使用字符输出流,你可以逐个字符或按字符数组的方式将字符数据写入到目标中。它提供了各种写入字符的方法,包括按字符、按字符串等方式写入。
以下是使用字符输出流的基本步骤:
-
创建字符输出流对象:通过创建
Writer
的子类对象来建立字符输出流,可以使用FileWriter
类来写入字符数据到文件中。Writer writer = new FileWriter("filename.txt");
-
写入字符数据:通过调用字符输出流对象的写入方法来写入字符数据。常用的方法包括:
write(int c)
:将指定的字符写入输出流。write(char[] cbuf)
:将字符数组中的全部字符写入输出流。write(char[] cbuf, int off, int len)
:将字符数组中指定范围内的字符写入输出流。write(String str)
:将字符串中的全部字符写入输出流。write(String str, int off, int len)
:将字符串中指定范围内的字符写入输出流。flush()
:将缓冲区内的字符立即写入到目标中。
例如,使用
write()
方法按字符写入数据到文件中:writer.write('A'); writer.write("Hello, World!");
-
关闭字符输出流:在使用完字符输出流后,应关闭它以释放系统资源,并确保数据被完全写入目标。
writer.close();
需要注意的是,字符输出流使用的是默认字符集编码(如UTF-8),要指定特定的字符集编码,可以使用OutputStreamWriter
类来创建字符输出流对象。
以上就是使用字符输出流的基本操作,它可以帮助你将字符数据写入到输出目标中。