在Java中,文件的读取分为字节流和字符流(读取方式);
imput输入(读取)把硬盘中的数据读取到内存中使用
output输出(写入)把内存中的数据写道硬盘中保存
1字符=2字节;1字节=8个二进制
字节流:(一切皆为字节,可以读取任意文件)——不需要知道文件内容时
FileOutputStream:(把内存中的数据写到硬盘文件中)
1、创建一个FileOutputStream对象
2、会根据构造方法中传递的文件/文件路径 创建一个空的文件
3、会把FileOutputStream对象指向新创建的文件写入数据的原理(由内存写到硬盘)Java程序-》JVM(Java虚拟机)-》OS(操作系统)-》OS调用写数据的方法-》把数据写到文件中。
字节输出的使用步骤(重点):
1、创建一个FileOutputStream对象,构造方法中传递写入数据的目的地
2、使用FileOutputStream对象中的write方法,把数据写到文件中(写的时候回把十进制转换成二进制)
3、释放资源(防止占用内存空间)
注:
当要写入的文件不存在时,会new出写入;
当文件存在时,会覆盖原来的内容;
当写入字符超出范围时,会写入一个未知的字符如果要追加续写换行:(将后面的append开关改为true(默认false会覆盖),就会在最后继续加字符串而不覆盖)
public FileOutputStream(File file, boolean append) : 创建文件输出流以写入由指定的 File对象表示的 文件。
public FileOutputStream(String name, boolean append) : 创建文件输出流以指定的名称写入文件。
boolean append 是一个追加写开关,ture时不会覆盖原文件,只在末尾追加写;flase时创建一个新的文件,覆盖原文件
换行符:windows:。\r\n Linux:/n Mac:/r
InputStream:(字节输入流)FileInputStream类(把硬盘中的数据读取到内存中使用
读取数据的原理:Javacheng’xu-》JVM-》OS-》OS读取数据的方法-》
读取文件字节输入流的使用步骤(重点):
1、创建FileInputStream类对象,构造方法中绑定要读取的数据流
2、使用FileInputStream类中的read方法,读取文件(编码方式要一样)——当用read方法时,如果要定义一次读出的字节数(byte=byte[]),则应用偶数(因为一个中文两个字节)
3、释放资源
读取数据:(可以使用whlie循环)read(byte[] b) ,
注*:
当使用一次读取多个字节的方法时,由于一次只读取byte个字节(此处设置为2),所以每一次都会将上一次的覆盖
如,当读取ABCDE时 应输出的是 AB CD ED(因为D没有被覆盖掉)【起到了缓冲作用】
处理流:间接操作文件,借助于节点流把内容读出来,然后放在缓存中。
读处理流:BufferedInputStream 借助于节点流把内容读出来,然后放在缓存中(不指定size时默认8M)
写处理流:BufferedOUTputStream 一次性写满8M (默认)ps:当没有写满默认大小的时候,就必须要用flush或close,才能写入成功。
tips.
mark(int readlimit)在标记位置变为无效之前可以读取字节的最大限制。方法表示标记当前位置,并保证在mark以后最多可以读取readlimit字节数据,mark标记仍有效。如果在mark后读取超过readlimit字节数据,mark标记就会失效,调用reset()方法会有异常。 但实际的运行情况却和JAVA文档中的描述并不完全相符。
有时候在BufferedInputStream类中调用mark(int readlimit)方法后,即使读取超过readlimit字节的数据,mark标记仍有效,仍然能正确调用reset方法重置。
事实上,mark在JAVA中的实现是和缓冲区相关的。只要缓冲区够大,mark后读取的数据没有超出缓冲区的大小,mark标记就不会失效。如果不够大,mark后又读取了大量的数据,导致缓冲区更新,原来标记的位置自然找不到了。
因此,mark后读取多少字节才失效,并不完全由readlimit参数确定,也和BufferedInputStream类的缓冲区大小有关。 如果BufferedInputStream类的缓冲区大小大于readlimit,在mark以后只有读取超过缓冲区大小的数据,mark标记才会失效。
字符流(以两个字节为单位对数据进行传输)——需要知道文件内容时:
乱码问题:在字符流内部包含一个字节到字符转换过程(UTF-8编码形式)字符输出流的使用步骤(重点):1、创建FileWiter对象,构造方法中要绑定写入数据的目的地;2、使用FileWiter中的方法write,把数据写到内存缓冲区(字符转换为字节的过程);3、使用FileWiter中的方法flash,把内存缓冲区的数据刷新到文件中;
4、释放资源(会把内存缓冲区的数据刷新到文件中)
close方法和flash方法的区别:
flash:刷新内存缓冲区,流对象可以继续使用;
close:先刷新缓冲区,然后通知系统释放资源,流对象不可以再使用了;
其实这里在Java中主要还是应用为主,不用死记硬背,那么多种方法掌握常用的就可以