首页 > 其他 > 详细

10.IO流

时间:2021-09-08 18:55:52      阅读:25      评论:0      收藏:0      [点我收藏+]

IO流

10.1 File:

File概述,文件和目录路径名的抽象表示

构造方法:

  • File(String path),将给定的路径名字符串转换为抽象路径名来创造新的File实例
  • File(String parent,String child),从父路径名和子路径名创建File实例
  • File(File parent,String child),从父抽象路径名和子路径名创建File实例

File类创建功能:

  • createNewFile,当该文件不存在时,创建一个由抽象路径名命名的文件
  • mkdir,创建抽象路径命名的目录
  • mkdirs,创建抽象路径命名的目录,包括任何必要且不存在的父目录

同一目录下不能创建两个名字相同的目录和文件

File类判断和获取功能:

  • isDirectory,测试抽象路径名是否为目录
  • isFile,测试抽象路径名是否为文件
  • exists,测试抽象路径名是否存在
  • getAbsolutePath,返回抽象路径名的绝对路径字符串
  • getPath,将抽象路径名转换为路径名字符串
  • getName,返回抽象路径名表示的文件或路径名成
  • list,返回抽象路径名中目录和文件的名称字符串数组
  • listFiles,返回抽象路径名中目录和文件的File对象数组

File类删除功能:

  • delete,删除抽象路径名表示的文件或目录

递归:

递归是指方法定义中调用方法本身的现象

递归解决问题的思路:把一个复杂问题层层转换为与原问题相似的规模较小的问题求解

递归策略只需少量的程序就可描述解题过程所需的多次重复计算

递归解决问题,要有出口,递归的规则是转换为规模较小的相似问题

10.2 字节流:

IO流概述:

IO,输入/输出;流,一种抽象概念,对数据传输的总称

IO流是用来处理设备间数据传输问题的,常见的应用有文件的复制、上传、下载

硬盘到内存:读数据

内存到硬盘:写数据

IO流分类:

  • 按数据流向:

    输入流:读数据

    输出流:写数据

  • 按数据类型分类:

    字节流:字节输入/输出流(用记事本打开不能读懂)(万能,不知道就用字节流)

    字符流:字符输入/输出流(用记事本打开能够读懂)

InputStream,字节输入流的超类

OutputStream,字节输出流的超类(FileOutputStream)

所有和IO相关的操作最后都要释放资源(fos.close())

字节流写数据方法:

  • write(int b):将指定字节写入此文件输出流,一次写一个字节数据
  • write(byte []b):将b.length字节从指定字节数组写入此文件输出流
  • write(byte []b, int off, int len):将len字节从指定字节数组偏移量off开始写入字节输出流

"Hanfeng".getBytes(),获得字符串的字节数组形式

字节流写数据换行:在字节数组末尾加上/n

字节流写数据追加信息:创建文件字节输出流时有一个参数append,设置为true即可完成追加操作

字节流写数据异常处理

FileOutputStream fos = null;
try{
	fos = new FileOutputStream("D://Java//file.txt");
    fos.write("hello".getBytes());
}catch(IOException e){
    e.printStackTrace();
}finally{
    if(fos != null){
        try{
            fos.close();
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

字节流读数据:

FileInputStream()

FileInputStream fis = new FileInputStream("E://data//file.txt");
byte[] bys = new byte[1024];
int len;
while((len=fis.read(bys)) != -1){
    System.out.println(new String(bys, 0, len));
}

字节流写数据:

FileOutputStream()

FileOutputStream fos = new FileOutputStream("E://data//newfile.txt");
FileInputStream fis = new FileInputStream("E://data//file.txt")
byte[] bys = new byte[1024];
while((len=fis(bys)) != -1){
    fos.write(bys, 0, len);
}

字节缓冲流:

BufferOutputStream:实现缓冲输出流,(大小为8192)

BufferInputStream:创建一个内部缓冲区数组,提高读写效率

10.3 字符流:

汉字存储编码:GBK编码,占用两个字节;UTF-8编码,占用三个字节

使用字节流的方式读取汉字会输出乱码表示,所以引入了字符流的方式

在使用字节流进行汉字读取和写入时,无论采用GBK还是UTF-8方式读取的字节第一位都是负数,从而能够判断出读取到的是一个汉字

字符流 = 字节流+编码表

编码表:

  • ASCII

  • GBXXX(GB2312、GBK、GB18030)

  • Unicode(UTF-8、UTF-16、UTF-32)

编码方式:byte[] getBytes(),使用平台默认字符集将该String编码为一系列字节,结果存于字节数组

解码方式:String(),使用平台默认字符集解码字节数组构造新的String

字符流写数据方法:

  • osw.wirte(int c):写入单个字符
  • osw.write(char[] cb):写入字符数组
  • osw.write(char[] cb, int off, int len):写入字符数组的一部分
  • osw.write(String str):写入字符串
  • osw.write(String str, int off, int len):写入字符串的一部分

(osw.flush()刷新流方法)

FileWriter,写数据(便携版本的读写操作)

FileReader,读数据

字符缓冲流:

  • BufferedWriter:

  • BufferedReader:

字符缓冲流特有功能:

void newLine():写一行行分隔符

public String readLine():读一行文字

IO流小结:
字节流:
- 字节输入流:
  - FileInputStream
  - BufferedInputStream
- 字节输出流:
  - FileOutputStream
  - BufferedOutputStream
  


字符流:
- 字符输入流:
  - InputStreamReader:-> FileReader
  - BufferedReader:br.readLine()
- 字符输出流:
  - OutputStreamWriter: -> FileWriter
  - BufferedWriter:bw.newLine()

生成随机数:Random r = new Random(int i);int index = r.nextInt();

复制文件异常处理:

  • throws抛出异常让上级处理
  • try...catch...finally...
  • java7:try(文件输入流对象)...catch...
  • java9:文件输入流对象;try(对象名)...catch...

10.4:特殊操作流:

标准输入流:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
// 上面的代码过于麻烦,所以官方给了接口
Scanner sc = new Scanner(System.in);

标准输出流:

PrintStream ps = System.out;
ps.println("Java");
// 上面等价于下面
System.out.println("Java");

打印流:

字节打印流:PrintStream

字节打印流写数据,有两种方法。1)继承父类的write方法,2)自己特有的print和println方法,调用自己特有的方法进行数据写入时,不会发生转码,写入什么显示的就是什么东西

字符打印流:PrintWriter

PrintWriter(String fileName)

PrintWriter(FileWriter fileName,boolean Flush)

对象序列化流:

对象序列化:将对象保存到磁盘中,或在网络中传输对象

ObjectOutputStream:一个对象想要被序列化,需要实现Serializable接口(oos.writeObject())

ObjectInputStream:反序列化使用ObjectOutputStream编写的对象(ois.readObject())

对象序列化流中的问题

  • 修改对象所属的类文件,读取数据发生错误

    抛出InvalidClassException异常

  • 解决上述异常

    给对象所属的类添加serialVersionUID

  • 一个对象中的某个成员变量不想被序列化,如何实现

    给成员变量加transient关键字修饰

Properties:

概述:Properties是一个Map体系的集合,Properties可以保存到流中或从流中加载

Properties特有方法:

  • setProperty:设置集合的键和值,都是String类型
  • getProperty:使用此属性列表中指定的键搜索属性
  • stringPropertyNames:从该属性列表中返回一个不可修改的键集,键及对应值是字符串

Properties与IO流结合:

  • load(InputStream):从输入字节流读取属性列表
  • load(Reader):从输入字符流读取属性列表
  • store(OutputStream,String):将此属性列表写入此Properties表中
  • store(Writer,String):将此属性列表写入此Properties表中

10.IO流

原文:https://www.cnblogs.com/zhongshu/p/15239597.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!