java自学之路-day15

JAVA15

IO

IO概述

l  i/o全称:

input/output

l  之前的程序都是在内存中,一旦结束就没有了

l  如果需要永久使用这些数据就需要持久化存储

l  需要用到IO技术 将数据放到持久化设备

l  Output 写 Input 读  IO操作两种方方式

File类

概述

l  数据存在文件中 文件在文件夹中  路径

l  操作这些文件夹就需要用到File类

作用 特点

l  Java.io 包中

l  文件和目录路径名的抽象表现形式

l  /  Linux盘符  \ Windows盘符

l  将操作系统中的文件目录路径封装成File对象

l  提供方法操作系统中的内容

l  File与系统无关的类

l  文件 File  目录  Directory 路径 Path

静态成员变量

pathSeparator

l  String 类型

l  实际是char类型的变形 加了个 +“”

l  与系统有关的路径分隔符

l  打印结果为 ;

l  ;表示目录的分隔

l  Linux目录分隔符是 :

separator

l  与系统有关的默认名称分隔符

l  打印结果为 \

l  Linux是 /

l  不要写死分隔符

l  与系统无关的程序 需要使用这个常量

构造方法

三种重载形式

File(String  pathname)

l  传递路径名

l  可以写到文件夹 也可以写到文件

l  示例

l  打印结果为 路径

l  Windows系统文件名可以不区分大小写

l  即使路径错了也不报错 因为File只是把路径变为File对象来调用方法 不分辨是否正确

l  有专门的方法exits()

相对路径和绝对路径

l  绝对路径

  1. 在系统中具有唯一性

l  相对路径

  1. 路径之间的相对关系
  1. 父目录唯一性
  2. 子目录可以多个

File(String parent,String child)

l  传递路径

l  传递字符串父路径 字符串子路径

l  示例

l  单独控制父路径和子路径

l  比如用户输入子路径和父路径

File(String parent,String child)

l  传递路径

l  传递File类型的父路径 字符串子路径

l  父路径可以直接使用File的功能

l

File(URI  uri)

File类的创建和删除文件功能

创建文件功能

l  Boolean CreateNewFile()

l  创建成功返回true 否则返回 false

l  需要进行异常处理 异常类在io包里

l   示例

运行结果

l  文件名是汉字

创建文件夹

l  Boolean mkdir()

l  创建成功返回true 否则返回 false

l  可以创建一层或多级目录 Boolean mkdirs()

l  示例

File类的删除功能

l  Boolean delete()

l  删除成功返回true 否则返回false

l  删除不走回收站 直接从硬盘中删除

File类的获取功能

l  String getName()

  1. 返回路径中表示的文件或文件夹名
  2. 示例

l  String getPath()

  1. 将封装的抽象路径变为一个字符串
  2. 相当于toString
  3. 示例

l  Long length()

  1. 返回路径中表示的文件的字节数
  2. 无法获取到文件夹的字节数
  3. 示例

l  getAbsolutePath() getAbsoluteFile()

  1. getAbsolutePath()返回String
  2. getAbsoluteFile() 返回File对象
  3. 获取绝对路径
  4. 如果写的是相对路径 获取的是工程的根目录
  5. 示例

l  getParent()getParentFile()

  1. getParent()返回String对象

getParentFile()返回File对象

  1. 获取父路径
  2. 示例

File类的判断功能

l  boolean  exists()

  1. 判断构造方法中的封装路径是否存在
  2. 存在返回true 不存在返回false
  3. 示例

l  isDirectory()

  1. 返回布尔值
  2. 是文件夹返回true 不是文件夹返回false
  3. IsFile() 判断是不是文件
  4. 示例

File另一种获取功能

l  List

  1. String[] list()
  2. 获取到File构造方法中封装的路径中的文件和文件夹名(遍历一个目录)
  3. 返回的是目录和文件的名字
  4. 示例

l  listFile()

  1. File[ ] listFiles()
  2. 获取到File构造方法中封装的路径中的文件和文件夹名(遍历一个目录)
  3. 返回的是目录和文件的全路径名 的一个File数组
  4. 示例

l  listRoots()

  1. 获取到系统的所有根目录
  2. 返回一个File数组

文件过滤器

l  遍历方法ListFiles()重载形式

l  ListFiles(FileFilter filter)接口类型

l  传递FileFilter的接口实现类

l  查看文档没有实现类 自定义实现类

l   示例

原理

  1. listFile()在遍历目录的同时,获取到了文件的全路径
  2. 同时调用过滤器的方法accept将获取到的全路径传递给accept方法的参数pathname
  1. accept方法接受到了参数pathname,参数是listFiles传递来的
  2. 然后进进行判断
  3. 如果路径是java文件 就返回true 否则 返回false
  4. 一旦方法返回true 就将路径放到数组中
  5. 一旦方法返回false 就不会将路径放到数组中

递归遍历全目录

l  首先遍历demo目录

l  然后遍历demo下的a目录

l  文件不能遍历只能遍历文件夹

l  所以判断路径是不是文件夹  isDirectory

l  如果是就遍历这个目录 递归调用本方法

l  如果不是目录就直接打印这个目录

l  为了打印出原本的父目录 因此需要先打印下路径

l

递归

l  概念

  1. 方法自己调用自己
  2. 适合于方法中运算的主体不变,但运行的时候参与运行的方法参数会变化
  3. 直接递归 a调用a方法
  4. 间接递归 a调用b 调用 c  c调用a

l  注意

  1. 递归一定要有出口 必须能让程序停下来
  2. 递归次数不能过多
  3. 构造方法不能递归

l  练习

  1. 求和计算

速度慢 执行100次

a)         多次调用方法 进栈

b)         遇到Return方法结束

a)         求阶乘

a)         Int只能到13-14

  1. 递归计算裴波纳多数列

public static double sum(double n){

if(n==1||n==2){

return 1;

}else{

return sum(n-1)+sum(n-2);

}

}

IO流对象

输入和输出

l  文件到程序 输入

l  程序到文件 输出

字节流

OutputStream 字节输出流

概述

l  一次操作1个字节 8个二进制位bit

l  写入文件 任意文件

l  抽象类

l  Java.io包

l  表示输出字节流的所有类的超类

l  方法是写入文件的方法

方法

l  write(int b)写入一个字节

l  write(byte[] b)写入字节数组

l  write(byte[] b,int off,int len)写入字节数组 off开始写入索引 len写入个数

l  close()方法 关闭流对象 释放与此流相关的资源 否则无法删除

l  使用需要子类

子类

l  FileOutputStream

  1. 写入数据文件
  2. 构造方法重载5个
  3. 构造方法作用是绑定一个输出目的
  4. 参数 File封装文件  String字符串的文件名
  5. 使用步骤

a)         创建流子类的对象,绑定输出数据的目的

b)         调用流对象方法write写入文件 进行输出

c)         close释放资源

  1. 可以根据路径创建文件,如果文件存在,直接覆盖
  2. 示例

n  写入一个字节

a)         文本工具打开会先过编码表

b)         所以写入的100是在编码表中对应的d

c)         写入的49 48 48对应的是100

n  写入一个字节数组

如果是负数

则是汉字 负数代表汉字 两个负数代表一个汉字   一个汉字两个字节 一个数字一个字节

少写一个负数 会缺少

n  写入一部分字节数组

只写入了BC

n  写入字节数组的简便方式

n  文件的续写和换行符号

  1. 续写

a)        
在FileOutputStream的构造方法中的第二个参数加入true

b)        
示例

  1. 换行

a)        
\t \r

b)        
符号换行

c)        
写在上一行的末尾
或者下一行的开头

d)

InputStream字节输入流

概述

l  所有字节输入流的超类

l  读取任意文件 每次只读取一个字节

l  抽象类

方法

l  读取方法 read()

  1. 返回值int
  2. 读取一个字节

l  读取方法read(byte[] b)

  1. 返回值是int
  2. 读取一定量的字节
    存储到数组中
子类

l  FileInputStream

n  构造方法 为这个流对象绑定数据源

n  读取步骤

  1. 创建字节输入流的的子类对象
  2. 调用read方法读取
  3. 关闭资源

n  示例

  1. 只要执行一次read就会自动读取下一个字节。返回值是返回读取到的字节,
  1. 读取到数据的结尾是会返回-1
  1. 如果文件中有-1也不影响
    因为这是两个字节
  1. 如果文件太大,就要定义len(read方法返回值)循环读取
  1. 不能直接写fish.read()代替len  因为每执行一次read就会自动读取下一个字节

n  read(byte[] b)读取

  1. 返回的int代表数组长度
  2. 示例  把数组变为字符串 方法 new
    String(byte[] b)

没有读取完毕 继续读取

读取到数据末尾都是-1

n  原理分析图

  1. 程序由JVM虚拟机运行
    虚拟机没有这个功能
    调用系统的功能
  2. 首先装一个字节 a 因为有两个位置
    所以又装了一个字节 b
  3. 指针指向谁把谁装到数组中
  4. 之后
    又装了c d 覆盖了原来的a b
  5. 之后又装了个e 覆盖了 c 所以是输出e d
  6. 之后又继续装
    没有元素但是有结束标记
  7. 读取到结束标记
    返回给JVM   之后JVM返回-1给read方法

数组作用
缓冲文件字节 提高效率

Int返回值 表示读取到的有效字节个数

因此改为循环读取

结果多一个 d 因此将数组长度需要变为5

具有可变性
需要进一步进行改进

由于文件大小不定
因此数组应该设置为1024的整数倍

IO中的异常处理

l  不选择抛出异常

l  使用try catch

l  close发法写到finally 仍然需要异常处理

l  如果出现异常无法进行处理 只能抛出运行时异常

l  示例

如果建立文件失败
不需要关资源 因此在close方法前需要对流对象进行判断是否为null

文件复制

原理分析

l  InputStream读取  OutputStream写入

l  复制可扩展为上传下载

l

l  步骤(一次读一个字节)

  1. 定义连个流的对象变量
  2. 字节输入流绑定数据源
    读取源文件内容输入程序
  3. 字节输出流绑定数据目的
    从程序中输出源文件内容到另一个文件
  4. 输入
    读取一个字节
  5. 输出   写一个字节

l  示例

  1. 需要异常处理
  2. 说明
  1. 绑定
  1. 复制
  1. 处理异常

l  步骤(读取字节数组)

  1. 数组缓冲
    提高效率
  2. FileInputStream 读取字节数组
  3. FileOutputStream 写字节数组
  4. 定义两个流的变量
  1. 复制
  1. 处理异常

测量时间

字符编码表

l  以上都是对数字字母的处理

l  字符流目的是为了处理文本文件

l  所以需要了解编码表

l  Ascii码表
一个字节中的7位就可以表示
对应的字节都是整数

l  iso-8859-1 拉丁码表
用一个字节的8位

l  GB2312 简体中文码表
包含6000-7000中文和汉字,两个字节表示
两个字节第一个字节是1,第二个字节可能是0

  1. GBK 目前最常用的中文码表 2万的中文和符号 两个字节表示 两个字节第一个字节开头是1,第二个字节开头可能是0
  2. GB18030 最新的中文码表 还没正式使用

l  Unicode 国际标准码表
无论是什么文字 都用两个字节

  1. Java中的char类型就是用的这个码表
    char c=’a’ 占用两个字节
  2. Java中的字符串是按照系统默认码表解析的,简体中文版 字符串默认的码表是GBK

l  UTF-8 基础unicode 一个字节就可以存储数据
就不要用两个字节存储
后期开发经常使用  而且这个码表更加标准化 在每一个字节头加入了编码信息(后期到api中查找)

l  能识别的中文码表:GBK
UTF-8 正因为识别码表不唯一
表现的负数不同 所以涉及到了解码问题

l  开发而言 常见的编码 GBK UTF-8
ISO-8859-1

l  编码 文字变数字97 98 99

l  解码 数字变文字

a b c

Writer 字符输出流

概述

l  Java.io.Writer

l  所有字符输出流的超类

l  只能写文本文件

方法 write

l  write(int c)写一个字符

l  write(char[] c)写字符数组

l  write(char[],int,int )写字符数组的一部分
开始索引 写几个

l  write(String s)写入字符串

子类

l  FileWriter

l  构造方法 写入的数据目的

l  构造方法 接收的参数类型 File 类型对象或者 String
文件名

l  字符输出流写数据 必须使用flush 刷新方法 否则就不会写入

l  示例

  1. 写一个字符
  1. 写一个字符数组

如果不写flush只在最后写个close也能写进去,但是最好写一个字符数组刷新一下
因为如果关闭时一起刷新会放在内存中,从而消耗系统资源
这样会节省系统资源

  1. close也有刷新的功能
  1. 写一个字符数组的一部分
  1. 写入字符串
  1. 和字节流写数据都一样
    只不过write方法中的参数  变为了char类型

字符输入流读取文本文件 Reader类

概述

l  只能读取记事本能打开读懂的文件 文本文件

l  java.io.reader

l  所有字符输入流的超类

方法

l  read()
读取一个字符

l  read(char [] c)读取字符数组

l  和字节流就是byte和char的区别

l  没有读取字符串的功能

因为字符串的概念无法确定
单个也就字符串 多个也就字符串

子类

l  FileReader

l  构造方法

绑定数据源

l  参数 File类型变量和String文件名

l  示例

  1. 读取一个字符

可以读取文本文件

  1. 读取一个字符数组

flush和close的区别

l  flush刷新完
流还可以用

l  close刷新完
流就关闭了

l  flush 只有写文本需要用
其他不需要用

字符流复制文本文件

示例

l  默认码表 GBK

l

时间: 2024-08-27 22:31:25

java自学之路-day15的相关文章

【转】JAVA自学之路

JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向呢? 我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当成学生,不要把自己的将来交给别人,学会运用自己的眼睛去观察,去了解这个世界吧. 每个培训机构都会宣传自己的好处,并不能说明大的趋势. 一些新闻文章很有可能是枪手写的,不必太过相信.国外背景的

[转载] JAVA自学之路

原文链接http://blog.csdn.net/mengxin846/article/details/2219844 虽然文章有点旧但还是有些启发的,譬如要事第一,好读书不求甚解. JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向呢? 我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当 成学生

马士兵:JAVA自学之路

JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训.决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向呢?我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当成学生,不要把自己的将来交给别人,学会运用自己的眼睛去观察,去了解这个世界吧. 每个培训机构都会宣传自己的好处,并不能说明大的趋势.一些新闻文章很有可能是枪手写的,不必太过相信.国外背景的教师和课

Java 自学之路

Java 自学之路 前言 从运行第一个程序开始算起,我接触编程也有三年的时间了.最初是从51单片机入门学习的C语言,班里面的大佬带着我一起做小项目,但是因为没人教,基本靠自学,学得慢,写的代码也烂,很没有章法.后来大三下半学期开始准备考研(从电子跨考计算机),从零开始学习数据结构,这才算是真正地入了编程的门.至于考研,后来就放弃了(别问我为什么放弃,当时脑子抽了),去了一家小公司实习.这家公司主要做机器视觉的项目,当时去面试的时候觉得挺高大上,技术 leader 也挺和蔼,感觉是很务实的一个团队

java自学之路-day17

JAVA17 多线程 进程和线程的概念 进程 l  正在运行中的程序 l  程序存储在硬盘中 当进入内存运行时 l  内存中的每一个程序就叫进程 l  并且每一个进程都有一个独立的功能 线程 l  迅雷中的多线程下载 l  main方法中有很多方法一次排列 如果其中一个方法执行了很多次循环 那么下一个方法就不会执行 从入口main到结束,一条路走到底 必须一个一个的执行 这种程序是单线程程序 效率慢 l  例如 多台电脑网吧上网 多条路通行 线程 概念 l  CPU 中央处理器 inter AW

Java自学之路---DotCom

引言 我从接触编程以来,一直是一个C/C++程序猿,因为我喜欢编程时,那种接地气的感觉,认为只有自己管理内存的使用,心理才踏实.但随着工作中不断增加的见闻,不断的从博客和源码中获得新的见解,我发现这个时代已经发生了变化,我们有强劲的硬件资源.我们有久经考验的框架和源码,我们最宝贵的是花在编码上的时间.所以我决定带着之前C/C++的经验,来认识JAVA是门怎样的语言,以及它的编程理念可以给我带来怎样的好处. 如何学习 和我学习其他语言一样,我主要还是依靠书本,电子书或者是纸质书,这样学习起来才是最

java自学之路-day16

JAVA16 IO流 转换流 引入 l  中文系统默认编码表GBK l  FileWriter的构造方法假定默认编码GBK l  但是一些文本文件有可能是其他编码方式 l  所以引入转换流 可以对编码表进行设定 l  对之后开发互联网程序很重要 概述 l  字符流的一种 l  字符与字节的桥梁 l  继承Writer类 OutputStreamWriter l  Java.io. OutputStreamWriter l  继承Writer类 l  字符输出流 向文本文件写入数据 l  字符流转

java自学之路-day18

数据库 数据库 概念 l  对于一串数据修改其中的一条数据 l  如果用io流就需要全盘读写 然后找到其中的一行 进行修改 l  或者使用数组进行修改 l  这样太复杂 效率慢 所以需要引用数据库 l  数据库本质是一个文件系统 可以看做是一个具有很好的处理数据能力的容器 和集合 数组 都一样 l  里面有严格的数据存储格式 l  数据库管理系统是用一个软件管理数据库 l  常见的数据库管理系统 MYSQL  开源免费 瑞典的公司开发 sun公司收购  Oracle收购了sun MYSQL6.x

java自学之路-day10

JAVA10 Eclipse快捷键补充 l  选中类Ctrl T 继承树 l  Ctrl 或者f3 查看源码 多态会跳转到调用父类中 l  Java中lang包中的所有类 不需要导包 直接用  例如 System String l  Ecplise 中的Jre System Library是默认的eclipse依赖jre的类库 在该位置可以查找到平常使用的String 类 Random类 Math类 l  Jdk 包括 jre和开发工具,jre包括jvm 和运行时所需要的核心类库 l  运行 h