1:计算机的存储单位
位 bit 表示0-1 计算机的最小存储单位是字节Byte 由8位组成 我们存储数据的二进制流的单位就是字节
由8位组成 0-255
KB MB GB TB 进制都是1024
char 基本数据类型 字符型数据 占用两个字节。 a c 3 4 汉字 他都是分配两个字节 比较耗费资源
比如 :文件的读取 不是汉子 这个时候字母数据 一个字节就可以表示 但是汉字必须用两个字节表示
如果字节读取就会导致乱码,因为汉字需要两个字节来识别自己 按字节读取会导致字符信息丢失
一般图片视频都是字节读取 但是文本读取(自读读起来比较慢)
2:File类就是存储介质中的文件和目录 存储介质 硬盘 U盘 光盘
File类定义了一系列操作文件和目录的方法, 目录创建 删除
File file1 = new File(path8, "bbb11"); 该api只是创建了一个File对象,他不会直接在介质中 需要调用相关api才可以
createNewFile 创建文件 mkdir创建文件夹
file1.exists() 判断文件对象是否在介质中已经存在 所以我们在创建目录或者文件的时候 一定要先判断其是否已经在介质
上存在,
file1.lastModified() 获取文件最后的修改事件 就是所谓的时间戳
file1.length() 最小单位就是Byte 字节 多少个字节
String[] strs=file1.list(); 返回的就是File的名称的集合
File[] files=file1.listFiles(); 返回的就是File对象的集合
File.separator 在windows系统为\\ 在linux系统是/ 实现跨平台所以用它
file1.delete() 注意File在删除的时候,文件可以直接删除 但是目录 务必注意必须是空目录才可以直接删除
所以我们在做删除操作的时候,务必要迭代判断目录是否为空 然后执行删除操作。
FilenameFilter 文件过滤器,过滤得到我们想要的File
3:流详解
上面讲了file文件 就类似于水池子 就是一个容器,流就是工具,进水有进水管 出水有出水管
进水管和出水管还分很多种 用瓢 盆
数据流的方向分为 输入流 输出流。
按传输单位分为字节流 字符流。
InputStream OutputStream Reader Writer
1:流概念
https://blog.csdn.net/Yue_Chen/article/details/72772445
流分类:,输入流 输出流 字节 字符
InputStream Reader OutputStream Writer
Reader 作用就是读文件
Writer作用就是写文件
字符流只可以处理字符 但是处理字符比较快
字节流 可以处理所有以bit为单位存储的文件,但是在处理字符上速度比不上字符流
FileInputStream FileOutputStream
总体详解:
字符编码里面融合了编码表,系统一般使用GBK
字符流一般处理文本数据,字节流处理多媒体数据。
字符流读写注意事项:
1:写入文件后必须要flush()刷新操作
2:用完后流记得要关闭
3:使用流对象要抛io异常
4:创建文件的时候,如果已经存在同名文件将会被覆盖 所以一般要判断是否存在同名文件
5:在读取一个文件的时候要保证该文件是存在的。
字节流:
1:字节流可以不用刷新流操作,
2:InputStream 特有方法,available 返回文件中的字节个数
细节:
1:一般视频音频图片都用字节流
2:一个字节是8位
3:FileInputStream read()(默认读取一个字节) read(byte[])(读取多个字节)
read(byte[],int off,int length) 读取多个字节,off表示指定字节数组开始保存数据的起始下标,len表示读取字节数目。
close()释放资源 注意io操作会很消耗资源
inputStream和OutputStream是抽象类
4:FileOutputStream(String fileName,boolean append) 第二个参数是控制我们在写入数据的时候是否将已经存在的数 据给清空
5:注意 为了保证流被关闭 我们一般将流关闭操作放在finally代码块里面
6:注意 字符流输入流读取 read返回的是一个int类型的值,如果想获取字符就应该进行强制类型转换。
7:注意 进行流转换时只可以针对文本文件的字节流进行转换,如果字节流操作的是一张图片,此时转换为
字符流就会导致数据丢失。
常用操作字符字节的对象如下:
FileInputStream FileOutputStream FileReader FileWriter
BufferReader BufferWriter (带缓冲区的字符流) 提高效率。
BufferedInputStream BufferedOutputStream
实例化缓冲流对象:是将流对象传递进去
BufferInputStream bin=new BufferInputStream(new FileInputStream(“demo.txt”));
InputStreamReader OutputStreamWriter
相关api如下:
FileInputStream fileInputStream = null;
try {
//一个个字节的读取文件 到结尾返回值为-1
fileInputStream.read();
//多字节读取文件 返回值就是我们读取了几个字节的数据
byte[]a=new byte[1024];
fileInputStream.read(a);
fileInputStream.read(byte b[], int off, int len);
//关闭流和释放一些资源
fileInputStream.close();
//跳过流中n个字节的数据
fileInputStream.skip(long n);
} catch (IOException e) {
e.printStackTrace();
}
FileOutputStream fileOutputStream;
//逐字节写入数据
fileOutputStream.write(int b);
//字节数组的方式写入数据
fileOutputStream.write(byte b[]);
//取字节数组中若干位字节写入
fileOutputStream.write(byte b[], int off, int len);
//关闭流和释放一些资源
fileOutputStream.close();
//一般在写入文件结束调用刷新操作
fileOutputStream.flush();
注意 我们这地方读取到的是字节 如果需要转化为字符串 还需要借助
String str=new String(); 将byte转化为字符串。
FileReader和FileWriter
FileReader fileReader=new FileReader(String fileName);
FileReader fileReader=new FileReader(File file);
//逐个字符读取 返回的就是对应的字符
fileReader.read();
//注意 这个是字符数组
fileReader.read(char cbuf[], int offset, int length);
fileReader.getEncoding();
fileReader.skip(long a)
fileReader.close();
FileWriter fileWriter=new FileWriter(String filename);
FileWriter fileWriter=new FileWriter(String filename,boolean isadd);
FileWriter fileWriter=new FileWriter(File file);
FileWriter fileWriter=new FileWriter(File file,boolean isadd);
fileWriter.write();
fileWriter.append(CharSequence csq);
fileWriter.getEncoding();
fileWriter.append(char c);
fileWriter.flush();
class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
//创建一个字符读取流流对象,和文件关联
FileReader rw = new FileReader("buf.txt");
//只要将需要被提高效率的流作为参数传递给缓冲区的构造函数即可
BufferedReader brw = new BufferedReader(rw);
for(;;) {
String s = brw.readLine();
if(s==null) break;
System.out.println(s);
}
brw.close();//关闭输入流对象
}
}
class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
//创建一个字符写入流对象
FileWriter fw = new FileWriter("buf.txt");
//为了提高字符写入效率,加入了缓冲技术。
//只要将需要被提高效率的流作为参数传递给缓冲区的构造函数即可
BufferedWriter bfw = new BufferedWriter(fw);
//bfw.write("abc\r\nde");
//bfw.newLine(); 这行代码等价于bfw.write("\r\n"),相当于一个跨平台的换行符
//用到缓冲区就必须要刷新
for(int x = 1; x < 5; x++) {
bfw.write("abc");
bfw.newLine(); //java提供了一个跨平台的换行符newLine();
bfw.flush();
}
bfw.flush(); //刷新缓冲区
bfw.close(); //关闭缓冲区,但是必须要先刷新
//注意,关闭缓冲区就是在关闭缓冲中的流对象
fw.close(); //关闭输入流对象
}
}
简单demo:
1:文件的复制:
public static void main(String[] args) throws IOException {
File fil1 = new File("D:/111.pdf");
File fil2 = new File("D:/222.pdf");
try (FileInputStream fi = new FileInputStream(fil1);
//一个叫输入流的桶,装满了一桶叫做D:/111.pdf文件的水
FileOutputStream fs = new FileOutputStream(fil2);
//一个叫输出流的空桶,但想装满叫做"D:/222.pdf"文件的水
) {
byte[] buf = new byte[521];
//叫做buf的水瓢
int len = -1;
//用来测量每次水瓢装了多少水
while((len = fi.read(buf)) != -1){
//一次次的用水瓢在输入流的桶里舀水,并用len测了舀了多少水,当len等于-1意味着水舀光了,该结束舀水了。
fs.write(buf, 0, len);
//一次次把水瓢里的水放到了输出流的桶里
}
fs.flush();
} catch (Exception e) {
}
}
2:字节流的形式读物文件 转化为字符串
File file = new File("D:/123.txt");
FileInputStream fis = new FileInputStream(file);
//同样是叫做输入流的桶
StringBuffer sb = new StringBuffer();
//把输出流的桶换成了StringBuffer用来储存字符串
//其实也可以直接用String,但是StringBuffer速度更快。
byte[] buf = new byte[256];
//水瓢没变
int len = -1;
//测水瓢舀了多少水没变
while ((len = fis.read(buf)) != -1){
sb.append(new String(buf, 0, buf.length));
//和上面的原理基本一样,只不过换了个水瓢而已
//new String(buf, 0, buf.length)是将buf里面的内容转换为字符串
}
System.out.println(sb.toString());
3:文本的读取(注意 这个时候应该借助于字符流 而不是字节流)
使用场景:(就是读取本地的字符串文件 )
public static void main(String[] args) throws Exception {
File file = new File("D:/123.txt");
//复制源文件
File file2 = new File("D:/456.txt");
//复制结果文件
StringBuffer sb = new StringBuffer();
//用于输出到控制台
if(!file2.exists()){
file2.createNewFile();
}
//检测结果文件是否存在如果不存在便创建一个
FileReader fr = new FileReader(file);
//设置字符读入流用于向文件(file)中读数据
FileWriter fw = new FileWriter(file2);
//设置字符读出流用于向文件(file2)中写数据
char[] ch = new char[256];
//每次读和写的容器,或者说是传送的媒介
int len = -1;
while((len = fr.read(ch)) != -1){
fw.write(ch, 0, ch.length);
//将容器里的东西写入到新文件中
sb.append(new String(ch, 0, ch.length));
//将容器里的东西添加到strngBuffer中,用于输出
}
fw.flush();
fw.close();
fr.close();
System.out.println(sb.toString());
//输出文本文件
}
- 对对象进行序列化及反序列化
使用工具:ObjectOutputStream,ObjectInputStream
介绍:将对象以文件的形式保存在硬盘中,使之能更方便的传输。
条件:必须实现Serializable接口(实现了这个接口,但并不需要重写任何方法)
2:File类的作用:创建 删除 重命名文件等操作。
file文档详解:
file代表文件或者目录, 文件或者目录的存储路径一般由路径分隔符和字符串组成 unix系统是 / windows是 \
上面的分隔符获取方式是:File.seperator,
路径分为相对路径和绝对路径,相对路径获取父目录路径可以通过file.getParent获取到。
windows绝对路径如下 :C:\Apps
unix路径如下/
file的构造函数:
File(String pathname)
Creates a new File
instance by converting the given pathname string into an abstract pathname.
File(String parent, String child) Creates a new |
File(File parent, String child) Creates a new |
File(URI uri) Creates a new File instance by converting the given file: URI into an abstract pathname. |
注意File类 包括file和directory 文件和目录
构造函数详解
File file =new File("d:/1.txt");
pathName 就是文件的存储路径
File file =new File("D:/doc","letter.txt");
parent 父路径字符串 子路径字符串 其实就是文件名称外加文件类型
File file=new File(“D:/doc”);
File file1=new File(file,“”“letter.txt”)
file就是一个目录
File操作分为文件操作和文件夹操作:
经常看源代码:经api详细实现。
File.separator