标签:soc pointer 节点 sage 文件 exception 字节 private 标记
java.io.OutputStream
最顶层的抽象类,定义了所有字节流的所有方法。
定义了子类共性的方法。 close(),flush(),write(**)*3
继承了 OutputStream
将内容写入到硬盘中
写入数据的原理:
由内存到硬盘: java程序 --> JVM --> OS --> 调用写数据的方法(OS) --> 写入文件
字节输出流写入步骤:
1. 创建一个对象(传递写入数据的路径)
2. 调用对象中的write 方法,写入到文件中
3. 释放资源 (提高程序的效率)
// 1. 创建一个对象(传递写入数据的路径) (相对路径)
FileOutputStream fos = new FileOutputStream("09\\a.txt");
//2. 调用对象中的write 方法,写入到文件中
fos.write(97); //十进制 -> 二进制 (1100001)
//3. 释放资源 (提高程序的效率)
fos.close();
写入:
public void write(int a):
记事本打开文件时查询编码表 字节 -> 字符
0 - 127 : ASCII 表
其他:系统默认编码表(中文系统GBK表)
public void write(byte[] b):
public void write(byte [] b,int off, int len):
追加/续写:
FileOutputStream(String name ,boolean append)
FileOutputStream(File file ,boolean append)
换行:
windows : \r\n
linux : \n
mac:: \r
也是抽象类,定义了输入流子类共性的方法。
read() * 2 , close()
java程序 -> JVM -> OS -> 读取方法 ->读取文件
FileInputStream fin = new FileInputStream("src/liu/a.txt");
int x;
//读取一个字节
x = fin.read();
System.out.println(x);
//文件结束 返回 -1
x = fin.read();
System.out.println(x);
/**
* 1. fin.read() : 读取一个字符
* 2. x = fin.read() 赋值
* 3. 判断 x 是否等于 -1
*/
while((x = fin.read()) != -1){
System.out.println((char)x);
}
fin.close();
多字节读取
/**
* 多字节读取
* byte 有时恰好汉字没有乱码
*/
byte [] b = new byte[4];
fin = new FileInputStream("src/liu/b.txt");
while ((x = fin.read(b))!= -1){
System.out.println(new String(b,0,x));
}
package liu;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author LiYang
* @Project Name: bilibili
* @Package Name: liu
* Created by MacBook Air on 2020/02/25.
* Copyright ? 2020 LiYang. All rights reserved.
* 字节流练习
*/
public class CopyFile {
public static void main(String[] args) {
try{
FileInputStream fin = new FileInputStream("src/liu/2.jpeg");
FileOutputStream fout = new FileOutputStream("src/1.jpeg",true);
byte [] b = new byte[1024];
while (fin.read(b) != -1){
fout.write(b);
}
fout.close();
fin.close();
} catch (IOException e){
System.out.println(e.getMessage());
}
}
}
java.io.Reader
解决中文读取可能乱码的问题
1个中文:
GBK: 占2个字节
UTF-8 :占3个字节
抽象类
共性成员的方法: close(),read()
层次:
Reader
FileReader FileInputStream 读取字节 -> FileReader转换成字符
InputStream:文件字符输入流
java.io.Writer;
flush ():刷新
所有字符输出流的顶层类,是一个抽象类
层次
java.io.FileWriter extends OutputStreamWriter extends Writer
FileWriter: 文件字符输出流
作用: 将内存中的内容输入到磁盘中
flush 与 close 的区别:
FileWriter(String filename , boolean append);
FileWriter(File file , boolean append);
java.lang.Object
是一个持久的属性集。Properties可以保存在流或从流中加载
是唯一一个与IO流相结合的集合
store() : 把集合中的临时数据,持久化写入到硬盘中存储
使用步骤
load(): 把硬盘中保存的键值对,读取到内存中
步骤
注意:
是双列结合,Key和Value默认都是字符串
BufferedOutputStream :字节缓冲输出流
构造方法:
参数:
作用:
步骤
BufferedInputStream : 字节缓冲输入流
构造方法:
参数
使用步骤
字符缓冲输出流
构造方法:
参数
方法
步骤
字符缓冲输入流
构造函数
参数
方法
分析:
/**
* 序列化标记型接口
*/
class Point implements Serializable{
private int x;
private static int y;
transient int z;
public Point(int x, int y,int z) {
this.x = x;
Point.y = y;
this.z = z;
}
public void print(){
System.out.println("(" +x+","+y+","+z+")");
}
}
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
ArrayListTest.java
ArrayListTest1.java
System.out.println("我是控制台输出!");
//PrintStream ps = new PrintStream("src/liu/c.txt");
PrintStream ps = new PrintStream(new FileOutputStream("src/liu/d.txt"));
//修改打印的位置
System.setOut(ps);
System.out.println("文件打印!");
FileOutputStream 会创建文件,但是依然需要抛出 FileNotFoundException
数据流是指应用程序与对象进行数据交换时的数据传输过程。
字节流是按照字节读/写二进制数据。
InputStream和OutputStream类是处理以8字节为基本单位的字节流,读写以字节为单位进行。
Object:InputStream、OutputStream(字节流);File(文件);Reader、Writer(字符流);RandomAccessFile(随机处理文件)
节点流是直接与特定数据源相连的流,提供了访问该数据源的基本操作。
1. 为了提高数据的处理速度
2. 能对如:int、double之类的数据直接进行操作
会联合使用被称为过滤器(Filter)流,提高留的处理效率。
过滤器流不能够单独使用,必须与相应的节点流进行一起使用。
当处理的数据为int等类型时,需要专门的数据输入输出流来处理。
DateInputStream 类和DateOutputStream类 能够直接读写Java基本类型的数据和Unicode编码格式的字符串。
- 打开一个输入文件,如果没有该文件会出现异常。
- FileNotFoundException 是一个非运行时错误。
- 打开一个输出文件,如果没有该文件会创建一个文件;否则源文件的内容将全部重写。
//目录
File file1 = new File("/user/test/");
//file2、3 指向同一个文件
File file2 - new File("/user/test/","a.txt");
File file3 = new File(file1,"a.txt");
try{
File pPath = new File(System.getProperty("user.dir")+"/流/src/");
File in = new File(pPath ,"FileInput.txt");
File out = new File(pPath,"FileOut.txt");
System.out.println(in);
FileInputStream fin = new FileInputStream(in);
FileOutputStream fout = new FileOutputStream(out);
int textNu;
while ((textNu = fin.read())!= -1) {
fout.write(textNu);
System.out.println(textNu);
}
fin.close();
fout.close();
} catch (FileNotFoundException e){
System.out.println("Error:"+e.getMessage());
}
InputStream 和OutStream 是字节流
Reader和Writer是字符流
BufferReader 和 BufferWriter类 能提高读写处理速度。
字节流放到字符流的处理器内,需要用到转换器。
InputStreamReader 是将输入的字节流转换成字符输入流。
OutStreamReader 是将输出的字节流转换成字符流输出。
RandomAccessFile
允许文件同时完成读和写操作,它直接继承Object类
并且实现了接口DataInput和DataOutput类
类似存储在文件系统的一个大型的byte数组
存在指向该隐含数组的光标或索引,成为文件指针。
提供了支持随机文件操作的方法:
- readXXX()或者 writeXXX():如 ReadInt(),ReadLine(),WriteChar(),WriteDouble()等
- int skipBytes(int n):将指针向下移动若干字节
- length():返回文件长度
- long getFilePointer():返回指针当前位置
- void seek(long pos):将指针调用所需位置
构造函数:
RandomAccessFile(File file,String mode)
RandomAccessFile(String name,String mode)
mode 的取值:
- r:只读,任何写操作都讲抛出 IOException
- rw:读写,文件不存在时会创建该文件,文件存在是,原文件内容不变,通过写操作改变文件内容。
- rws:打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
- rwd:打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。
Java 提供了Serializable的接口,只要实现了这一接口就可以使用ObjectInputStream和ObjectOutputStream 进行对象的输入输出。
Path path1 = Paths.get("/home/project/1.txt");
Path path2 = Paths.get("/home/project/2.txt");
Files.copy(path1,path2, StandardCopyOption.REPLACE_EXISTING);
StandardCopyOption 属性:
options 中指定了REPLACE_EXISTING属性。当该命令复制目录时,如果目录中已经有了文件,目录中的文件将不会被复制。CopyOption 参数支持以下 StandardCopyOption 和 LinkOption 枚举:
- REPLACE_EXISTING - 即使目标文件已存在,也执行复制。如果目标是符号链接,则复制链接本身(而不是链接的目标)。如果目标是非空目录,则复制将失败并显示 FileAlreadyExistsException 异常。
- COPY_ATTRIBUTES - 将与文件关联的文件属性复制到目标文件。支持的确切- 文件属性是文件系统和平台相关的,但 last-modified-time 跨平台支持并复制到目标文件。
- NOFOLLOW_LINKS - 表示不应遵循符号链接。如果要复制的文件是符号链接,则复制链接(而不是链接的目标)。
Files.move(Path,Path,StandardCopyOption);
- REPLACE_EXISTING - 即使目标文件已存在,也执行移动。如果目标是符号链接,则替换符号链接,但它指向的内容不受影响。
- ATOMIC_MOVE - 将移动作为原子文件操作执行。如果文件系统不支持原子移动,则抛出异常。使用,ATOMIC_MOVE 您可以将文件移动到目录中,并保证观察目录的任何进程都可以访问完整的文件。
标签:soc pointer 节点 sage 文件 exception 字节 private 标记
原文地址:https://www.cnblogs.com/KawYang/p/12882747.html