Java开发之IO流
一、IO流是什么?1、可以将数据从本地文件中读取出来。2、可以将数据从内存中保存到本地文件中去。二、File类1、File类是什么?(1)在读写数据时告诉虚拟机要操作的文件/文件夹在哪。(2)对文件/文件夹本身进行操作,包括创建、删除等。2、构造方法:File(String pathname):通过给定路径名字符串转化为抽象路径名来创建新的File实例。File(String path, Stri
目录
(2)通过调用FileOutputStream对象的write()方法写入数据
注意:传递一个整数时,那么实际写入文件的是该整数在码表中对应的字符
(3)通过调用FileOutputStream对象的close()方法释放资源:
(2)如何进行续写(即创建FileOutputStream对象的时候不清空文件):
(2)调用FileInputStream对象的read()方法进行读取
(3)调用FileInputStream对象的close()方法释放资源。
另一个比较简单的方法就是调用FileInputStream的read(byte[] b)方法:
原因:由于字节流一次只能读取一个字节,但中文不管是什么编码格式都是两个字节以上,所以如果利用字节流把文本文件中的中文读到内存中,或者把中文写到文本文件中,可能会出现乱码。
一、IO流是什么?
1、可以将数据从本地文件中读取出来。
2、可以将数据从内存中保存到本地文件中去。
二、File类
1、File类是什么?
(1)在读写数据时告诉虚拟机要操作的文件/文件夹在哪。
(2)对文件/文件夹本身进行操作,包括创建、删除等。
2、构造方法:
File(String pathname):通过给定路径名字符串转化为抽象路径名来创建新的File实例。
File(String path, String name):通过连接字符串path和name来充当充当抽象路径名来创建新的File实例。
File(File file,String name):也是将File实例和字符串name连接起来创建新的File实例。
3、绝相对路径对路径与
(1)绝对路径:从盘符开始
File file1 = new File("D:\\...."); //参数为绝对路径
(2)相对路径:相对当前项目文件夹下的路径
File file2 = new File("a.txt"); //在当前项目下创建文件a.txt的File实例
File file3 = new File("模块名\\a.txt"); //在当前项目的某个模块下创建a.txt的File实例
4、File类的常用功能
(1)File的创建功能
1)public boolean createNewFile(): 创建一个空的文件
注意:如果文件存在,那么创建失败,返回false,如果文件不存在,那么创建成功,返回true,不管文件名是什么,只能创建文件。
2)public boolean mkdir():创建一个单级文件夹
注意:只能创建单级文件夹,不能创建多级文件夹,不管文件夹名是什么,只能创建文件夹。
3)public boolean mkdirs():创建一个多级文件夹
注意:可以创建单级文件夹,也可创建多级文件夹,不管文件夹名是什么,只能创建文件夹。
(2)File的删除功能
public boolean delete():删除指定文件或空文件夹。
注意:删除的文件或文件夹不走回收站,如果删除的是文件就直接删除,如果删除的是文件夹,只能删除空文件夹。
(3)File的判断和获取方法
public boolean isDirectory() | 测试此抽象路径名表示的File是否为目录 |
public boolean isFile() | 测试此抽象路径名表示的File是否为文件 |
public boolean exists() | 测试此抽象路径名表示的File是否存在 |
public String getName() | 返回此抽象路径名表示的文件或目录名称 |
(4)File的高级获取功能
public File[] listFiles();
进入文件夹,获取这个文件夹里面所有的文件和文件夹的File对象,并把这些File对象都放在一个数组中返回,包括隐藏文件和隐藏文件夹都可以获取。
注意:1)当调用者是一个文件或有权限的文件夹时,该方法会返回空值null。
2)当调用者是一个空文件夹时,该方法会返回一个长度为0的空数组。
三、字节流(可以操作所有文件)
1、写数据的步骤
(1)创建字节输出流的对象:
格式:
FileOutputStream fos = new FileOutputStream(路径字符串或者File对象);
注意:1)如果文件不存在,则会帮我们自动创建该文件
2)如果文件存在,则会将该文件清空
(2)通过调用FileOutputStream对象的write()方法写入数据
格式:
fos.write(写入的内容);
注意:传递一个整数时,那么实际写入文件的是该整数在码表中对应的字符
(3)通过调用FileOutputStream对象的close()方法释放资源:
格式:
fos.close();
注意:每次使用完流必须要释放资源
2、字节流写数据的三种方式
public void write(int b) | 一次写一个数据 |
public void write(byte[] b) | 一次写一个字节数组的数据 |
public void write(byte[] b, int st, int len) | 一次写一个字节数组的部分数据(st下标开始的长度为len的字节数据) |
注意:写入字符串时可先调用字符串对象的getBytes()方法获得字节数组,再调用FileOutputStream对象的write方法进行写入。
3、字节流写数据可能遇到的问题:
(1)如何换行:
在需要换行的地方添加换行符的字节数组即可:
windows:换行为:\r\n
Linux:换行为:\r
可将换行符作为一个字符串调用其getBytes()方法获取换行符的字节数组,然后再调用write()方法写入即可。
(2)如何进行续写(即创建FileOutputStream对象的时候不清空文件):
在创建FileOuputStream对象时,设置其构造函数的append属性为true,即可对该文件进行续写。
FileOutputStream fos = new FileOutputStream(写入的文件路径,boolean append);
append属性默认为false,即不续写,若需要对文件进行续写操作就将append设为true即可。
注意:在字节流调用方法是采用try...catch...finally来进行异常的抛出,因为任何字节流对象最终都需要调用close()方法来释放资源。也就是说close()方法是必须执行的,所以close()方法需要在异常抛出中放在finally里面进行判断(判断fos是否为空)执行。
4、读数据步骤
(1)创建字节流读入对象
格式:
FileInputStream fis = new FileInputStream(要读的文件路径字符串或File对象);
注意:如果对应的文件不存在会报错!
(2)调用FileInputStream对象的read()方法进行读取
格式:
int rd = fis.read();
注意:一次只能读取一个字节,返回值就是本次读到的那个字节的数据,也就是字符在码表中对应的那个数字,如果我们想要看到字符数据,就需要对该整数进行强转为char类型。
(3)调用FileInputStream对象的close()方法释放资源。
格式:
fis.close();
注意:使用完文件必须进行资源释放!
5、一次性读取多个字节
思想:通过循环来进行实现,即循环取出文件中的每一个字节所对应的整形数据,并将其进行char类型的强制转换,最后将该字符存入字符数组中即可,注意:按字节从文件中读取字节数据时,读到-1表示文件结束。
//实现一次读多个字节数据
public class Main{
public static void main(String[] args){
FileInputStream fis = null;
char[] contents = new char[10000];
int id = 0; //存储读到字符数据的下标
try{
//创建FileInputStream对象
fis = new FileInputStream(文件路径);
//获取数据存入数组中
int k = fis.read();
while(k!=-1) {
contens[id++]=(char)k;
k=fis.read();
}
}catch(Exception e){
System.out.println(e);
}finally{
//释放资源
fis.clear();
}
}
}
另一个比较简单的方法就是调用FileInputStream的read(byte[] b)方法:
public int read(byte[] b)
从输入流中读取最多b.length个字节的数据,返回的是读入缓冲区的总字节数,也就是实际读取的字节个数。
6、文件复制
(1)对源文件创建FileInputStream对象,进行字节流文件读操作。
(2)对目的文件创建FileOutputStream对象,进行字节流文件写操作。
7、字节缓冲流
(1)BufferedOutputStream:字节缓冲输出流
格式:
BufferedOutputStream bos = new BufferedOutputStream(字节输出流对象);
(2)BufferedInputStream:字节缓冲输入流
格式:
BufferedInputStream bis = new BufferedInputStream(字节输入流对象);
注意:字节缓冲流仅仅只是提供了一个缓冲区而已,真正进行字节流读写操作的还是字节流对象,字节缓冲流只是为了提高读写效率而已。其读写方式和字节流的读写方式的一样。
四、字符流(只能操作文本文件.txt)
字符流实现原理:字符流=字节流+编码表
1、既然字节流可以操作所有文件,那么为什么要使用字符流?
原因:由于字节流一次只能读取一个字节,但中文不管是什么编码格式都是两个字节以上,所以如果利用字节流把文本文件中的中文读到内存中,或者把中文写到文本文件中,可能会出现乱码。
2、字符串(String)中的编码与解码方法
byte[] getBytes() | 利用idea默认的UTF-8格式将String字符串编码为一系列字节并存储与字节数组中 |
byte[] getBytes(String st) | 使用指定的编码格式st将String字符串编码为一系列字节并存储与字节数组中 |
String (byte[] bytes) | 利用idea默认的UTF-8格式将字节数组中的字节解码为字符串 |
String (byte[] bytes,String st) | 使用指定的编码格式st将字节数组中的字节解码为字符串 |
3、写数据的步骤
(1)创建字符输出流的对象
格式:
FileWriter fw = new FileWriter(文件路径字符串或File对象);
注意事项:在保证父级文件夹路径存在的情况下,若文件不存在,系统自动创建该文件,若文件存在,该文件会被清空
(2)调用写数据方法:
void write(int c) | 向文件写一个字符 |
void write(char[] st) | 向文件写一个字符数组 |
void write(char[] st, int off, int len) | 向文件写一个字符数组中的以下标off开始,长度为len的字符内容 |
void write(String str) | 向文件写一个字符串 |
void write(String str,int off,int len) | 向文件写一个字符串中的以下标off开始,长度为len的字符内容 |
注意事项:写int类型的整数,实际上写的是这个整数在码表中对应的字符,如果写的是字符串,会把字符串原样写出。
(3)释放资源
通过调用FileWriter对象的close()方法释放资源。
注意事项:每次使用完流必须进行释放资源。
4、flush()和close()方法的区别
flush()方法用于刷新流,还可以写入数据,但close()方法为关闭流,释放资源,但在关闭前会刷新流,一旦关闭就不能再写数据了。
5、读数据的步骤:
(1)创建字符输入流对象
格式:
FileReader fr = new FileReader(文件路径字符串或File对象);
(2)调用读数据方法
public int read() | 一次读取一个字符,返回的是该字符在码表中对应的整数值 |
public int read(char[] ch) | 一次读取多个字符存入字符数组ch中,并将读到的字符数目返回,若一个字符都没读到则返回-1 |
(3)释放资源
通过调用FileReader对象的close()方法释放资源。
6、字符缓冲流(用法和字节缓冲流相似)
(1)BufferedWriter:可以将数据高效的写出。
特有方法:void newLine()
写一行行分隔符,行分隔符字符串由系统属性定义。相当于换行符。
(2)BufferedReader:可以将数据高效的读取到内存。
特有方法:String readLine()
读一行文字,结果包含行的内容字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null
更多推荐
所有评论(0)