1.IO简介

IO是指Input/Output,即输入和输出:

  • Input指从外部读取数据到内存,例如从磁盘读取,从网络读取。



    * 为什么要把数据读到内存才能处理这些数据呢?

    * 因为代码是在内存中运行的,数据也必须读取到内存。数据在Java中的表现形式是byte数组、字符串。



  • Output指把数据从内存输出到外部,例如写文件,输出到网络。

    * Output是把Java的表现格式如byte数组、字符串输出到某个地方,如硬盘的某个文件。

IO流是一种顺序读写数据的模式:

  • 单向流动,类似水管中水的流动,因此称为IO流
  • 字节流:以byte为最小单位
  • 字符流:

    * Java提供了Reader/Writer表示字符流。Reader/Writer本质上是一个能自动编解码的InputStream/OutputStream。数据源是字节,读入的数据是char字符,原因是Reader内部把读入的byte做了编码,Writer也是一样的。

    * 字符流传输的最小数据单位是char

    * 字符流输出的byte取决于编码方式

  1. String fname = "Hi你好";
  2. //将String转化为byte数组,注意byte是10进制的,如果要转化为16进制,需要再次转换
  3. byte[] tbytes = fname.getBytes();
  4. System.out.println("字符串转换为byte数组:"+Arrays.toString(tbytes));
  5. //byte数组转换为String类型
  6. String fbyte = new String(tbytes);
  7. System.out.println("byte数组转换为字符串:"+fbyte);
  8. //将String转化为char数组
  9. char[] tchars = fname.toCharArray();
  10. System.out.println("字符串转换为char数组:"+Arrays.toString(tchars));
  11. //char数组转化为String类型
  12. String fchars = new String(tchars);
  13. System.out.println("char数组转换为字符串:"+fchars);
  14. //for(int i=0;i<tchars.length;i++){
  15. // int c = tchars[i];
  16. //
  17. // System.out.print(Integer.toHexString(c)+"\t");
  18. // }
  19. //System.out.println("\u0048\u0069\u4f60\u597d");


使用Reader/Writer,还是InputStream/OutputStream,取决于具体的使用场景:
如果数据源不是文本,就只能使用InputStream/OutputStream,如果是文本,使用Reader/Writer更方便。

同步IO:

  • 读写IO时代码等待数据返回后才继续执行后续代码
  • 代码编写简单,CPU执行效率低
  • 例子:肯德基吃饭,等待做好后开吃
  • JDK的Java.io是同步IO功能



    异步IO:
  • 读写IO时仅发出请求,然后立刻执行后续代码
  • 代码编写复杂,CPU执行效率高
  • 例子:肯德基吃饭,点好先去逛街,等待做好再回来吃
  • JDK的Java.nio是异步IO功能

总结:

  • IO流是一种流式的数据输入/输出模型
  • 二进制数组以byte为最小单位在InputStream/OutputStream中单向流动
  • 字符数据以char为最小单位在Reader/Writer中单向流动
  • JDK的java.io包提供了同步IO功能
  • Java的IO流的接口和实现是分离的

    * 字节流接口:InputStream/OutputStream

    * 字符流接口:Reader/Writer

2.File对象

Java.io.File表示文件系统的一个文件或者目录,创建File对象本身不涉及IO操作

2.1访问文件名相关的方法

获取路径/绝对路径/规范路径:getPath()/getAbsolutePath()/getCanonicalPath()

  • getPath():获取的是pathName参数

  • 绝对路径是从根目录开始的完整路径
  • 相对路径是从相对当前工作目录的路径,传入当前路径的时候,相对路径前加上当前目录就是绝对路径
  • getName():返回File对象所表示的文件名或路径名
  • getParent():返回File对象对应目录的父目录
  • boolean renameTo(File newName):重命名次File对象所对应的文件或目录,如果重命名成功返回true;否则返回false。

不同系统对于路径的表示不一样:

  • windows:C:\Windows\test.txt
  • Linux:/usr/Download/text.txt
  1. import java.io.File;
  2. import java.io.IOException;
  3. public class Main {
  4. public static void main(String[] args) throws IOException {
  5. //获取当前目录
  6. System.out.println("System.getProperty(\"user.dir\"):\t"+System.getProperty("user.dir"));
  7. File f1 = new File("");
  8. System.out.println("绝对路径:\t"+f1.getAbsolutePath());
  9. //获取当前目录下的子目录
  10. File f2 = new File("./src");
  11. System.out.println("./src:\t"+f2.getPath());
  12. System.out.println("./src绝对路径:\t"+f2.getAbsolutePath());
  13. System.out.println("./src规范路径:\t"+f2.getCanonicalPath());
  14. //获取当前目录下的子目录
  15. File f3 = new File("src");
  16. System.out.println("src:\t"+f3.getPath());
  17. System.out.println("src绝对路径:\t"+f2.getAbsolutePath());
  18. System.out.println("src规范路径:\t"+f2.getCanonicalPath());
  19. //获取上一级目录
  20. File f = new File("..");
  21. String path1 = f.getPath();
  22. String path2 = f.getAbsolutePath();
  23. String path3 = f.getCanonicalPath();
  24. System.out.println("..path:\t"+path1);
  25. System.out.println("..绝对路径:\t"+path2);
  26. System.out.println("..规范路径:\t"+path3);
  27. }
  28. }

2.2文件检测相关的方法

  • boolean exists():判断File对象所对应的文件或目录是否存在
  • isFile():是否是已存在的文件
  • isDirectory():是否是已存在的目录
  • boolean canRead():是否允许读取该文件
  • boolean canWrite():是否允许写入该文件
  • boolean canExcute():是否允许执行该文件
  • boolean isAbsolute():判断File对象所对应的文件或目录是否是绝对路径。该方法消除了不同平台的差异,可以直接判断File对象是否是绝对路径。Linux路径开头是“/”,Windows路径开头是盘符。
  1. import java.io.File;
  2. import java.io.IOException;
  3. public class Main {
  4. public static void main(String[] args) throws IOException {
  5. File f1 = new File("log");
  6. File f2 = new File("log/all.log");
  7. System.out.println(f1.getCanonicalPath()+"是目录"+f1.isDirectory());
  8. System.out.println(f2.getCanonicalPath()+"是文件:"+f2.isFile());
  9. if(f2.isFile()){
  10. System.out.println(f2.getCanonicalPath()+"可以被读取:"+f2.canRead());
  11. System.out.println(f2.getCanonicalPath()+"可以被写入:"+f2.canWrite());
  12. System.out.println(f2.getCanonicalPath()+"可以被执行:"+f2.canExecute());
  13. System.out.println(f2.getCanonicalPath()+"文件大小:"+f2.length());
  14. }
  15. }
  16. }


### 2.3获取文件常规信息
* long lastModified():返回文件的最后修改时间
* long length():获取文件内容的长度

2.4文件创建、删除

当File对象表示一个文件时(isFile==true):

  • boolean createNewFile():创建一个新文件
  • static File createTempFile(String prefix, String suffix):创建一个临时文件,prefix文件名,suffix代表文件类型,可以为null,此时默认".tmp"
  • static File createTempFile(String prefix, String suffix, File directory):在执行目录创建一个临时文件
  • boolean delete():删除该文件
  • void deleteOnExit():在JVM退出时删除该文件
  1. import java.io.File;
  2. import java.io.IOException;
  3. public class Main {
  4. public static void main(String[] args) throws IOException, InterruptedException {
  5. File newFile = new File("log/feeling.txt");
  6. System.out.println(newFile.getCanonicalPath());
  7. newFile.createNewFile();
  8. Thread.sleep(3000);
  9. newFile.delete();
  10. File tempFile = File.createTempFile("log/tempfeeling","txt");
  11. System.out.println(tempFile.getCanonicalPath());
  12. Thread.sleep(3000);
  13. tempFile.deleteOnExit();
  14. }
  15. }


### 2.4目录操作的方法
目录操作(isDirectory()==true ):
* String[] list():列出目录下的文件和子目录名,返回字符串数组。
* File[] listFiles():列出目录下的文件和子目录名,返回File对象数组
* File[] listFiles(FileFilter filter):过滤不想要的文件
* File[] listFiles(FilenameFilter filter)
* boolean mkdir():创建该目录
* boolean mkdirs():创建该目录,并在必须要将不存在的父目录也创建出来,相当于Linux的mkdir -p
* delete():删除该目录
```#java
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;

public class Main {

public static void main(String[] args) throws IOException, InterruptedException {

File dir1 = new File("log/DasAuto/Audi");

dir1.mkdirs();

File dir2 = new File("log/feel");

dir2.mkdir();

File dir = new File("log");

if (dir.isDirectory()){

System.out.println(Arrays.toString(dir.list()));

System.out.println(Arrays.toString(dir.listFiles()));

File[] fs = dir.listFiles(new FilenameFilter() {

@Override

public boolean accept(File dir, String name) {

return name.endsWith(".sh");

}

});

System.out.println(Arrays.toString(fs));

}

dir1.delete();

dir2.delete();

}

}

  1. <img src="https://img2018.cnblogs.com/blog/1418970/201903/1418970-20190324195529024-2111250719.png" width="500" />
  2. ### 2.5文件过滤器
  3. File类的list方法还可以接收一个FilenameFilter参数,通过该参数可以只列出符合条件的文件。这里的FilenameFilter接口和java.swing.filechooser包下的FileFilter抽象类的功能非常相似,可以把FileFilter当成FilenameFilter的实现类,当Sun并没有让FileFilter实现FilenameFilter接口。
  4. FilenameFilter接口接收2个参数,dir和name
  5. <img src="https://img2018.cnblogs.com/blog/1418970/201903/1418970-20190325225021223-1993544036.png" width="500" />
  6. list方法接收FilenameFilter类型过滤器
  7. <img src="https://img2018.cnblogs.com/blog/1418970/201903/1418970-20190325225223694-2094055769.png" width="500" />
  8. Main.java
  9. ```#java
  10. import java.io.File;
  11. import java.io.IOException;
  12. public class Main {
  13. public static void main(String[] args) throws IOException {
  14. File file = new File(".");
  15. String[] list = file.list((dir,name)->name.endsWith(".java")||new File(name).isDirectory());
  16. for(String name:list){
  17. System.out.println(name);
  18. }
  19. }
  20. }

2.6总结:

File对象表示一个文件或者目录

  • 创建File对象本身不涉及IO操作
  • 获取路径/绝对路径/规范路径:getPath()/getAbsolutePath()/getCanonicalPath()
  • 可以获取目录的文件和子目录
  • 通过File对象可以创建或删除文件和目录

3.File练习


GetDir.java
```#java
import java.io.File;
import java.io.IOException;

public class GetDir {

private String pathName;

public GetDir() {

this.pathName = ".";

}

public GetDir(String pathName) {

this.pathName = pathName;

}

public void getDir() throws IOException {

File path = new File(".");

int num = path.getCanonicalPath().split("/").length-1;

System.out.println(path.getCanonicalPath().split("/")[num]);

printdir(path,num);

}

static void printdir(File path,int num) throws IOException{

File[] fs = path.listFiles();

for(File f:fs){

if(f.isDirectory()){

path(f,num);

printdir(f,num);

}else if(f.isFile()){

path(f,num);

}

}

}

  1. static void path(File f,int n) throws IOException{
  2. String s = f.getCanonicalPath();
  3. String[] ss = s.split("/");
  4. for(int i=n;i<ss.length-1;i++){
  5. System.out.print("\t");
  6. }
  7. System.out.println(ss[ss.length-1]);
  8. }

}

  1. Main.java
  2. ```#java
  3. import java.io.IOException;
  4. public class Main {
  5. public static void main(String[] args) throws IOException {
  6. GetDir getDir = new GetDir();
  7. getDir.getDir();
  8. }
  9. }

廖雪峰Java6IO编程-1IO基础-1IO简介的更多相关文章

  1. 廖雪峰Java6IO编程-2input和output-1inputStream

    1.InputStream 1.1InputStream是所有输入流的超类: int read() * 读取下一个字节,并返回字节(0-255) * 如果已读到末尾,返回-1 * read()方法是阻 ...

  2. 廖雪峰Java15JDBC编程-3JDBC接口-1JDBC简介

    JDBC:Java DataBase Connectivity Java程序访问数据库的标准接口 使用Java程序访问数据库的时候,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接 ...

  3. 廖雪峰Java15JDBC编程-1关系数据库基础-1关系数据库简介

    1.数据库 1.1 定义 数据库是按照数据结构来组合.存储和管理数据的软件. 1.2 数据库模型 数据库有层次模型.网状模型.关系模型三种模型. 2 关系数据库 关系数据库是建立在关系模型上的数据库, ...

  4. 廖雪峰Java15JDBC编程-3JDBC接口-5JDBC连接池

    1. JDBC连接池 1.1 JDBC连接池简介 线程池可以复用一个线程,这样大量的小任务通过线程池的线程执行,就可以避免反复创建线程带来的开销. 同样JDBC可以复用一个JDBC连接 JDBC的连接 ...

  5. 【python】廖雪峰python教程学习--基础

     No1: 目前,Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的 No2: 用r''表示''内部的字符串默认不转义 No3: 以'''开头,敲回车可以换行 No4: 布尔 ...

  6. 廖雪峰Java15JDBC编程-3JDBC接口-4JDBC事务

    1 数据库事务:Transaction 1.1 定义 若干SQL语句构成的一个操作序列 要么全部执行成功 要么全部执行不成功 1.2 数据库事务具有ACID特性: Atomicity:原子性 一个事务 ...

  7. 廖雪峰Java15JDBC编程-3JDBC接口-3JDBC更新

    使用update语句的时候,需要通过JDBC实现update语句的执行,这个时候仍然通过PreparedStatement对象来使用,直接传入update语句,然后通过setObject传入占位符的值 ...

  8. 廖雪峰Java15JDBC编程-3JDBC接口-2JDBC查询

    我们可以使用JDBC查询来执行select语句. 1. Statement try(Connection conn = DriverManager.getConnection(JDBC_URL, JD ...

  9. 廖雪峰Java15JDBC编程-2SQL入门-2insert/select/update/delete

    1. INSERT用于向数据库的表中插入1条记录 insert into 表名 (字段1,字段2,...) values (数据1,数据2,数据3...) 示例 -- 如果表存在,就删除 drop t ...

随机推荐

  1. (2)Django入门

    web框架:把一个请求拆成几部分,每部分做相同的事 python中常用的框架 1.Django:大而全的框架 2.flask:微框架又叫轻量级的框架 3.Tornado:高性能框架 pycharm创建 ...

  2. ls -l 和du 的区别

    编程之路刚刚开始,错误难免,希望大家能够指出. 简单的来说,ls -l 显示的是实际文件(目录)大小,而du显示的是文件(目录)占用磁盘空间的大小. linux下一切皆文件. 首先,硬盘的最小存储单位 ...

  3. 【BZOJ2154】Crash的数字表格

    算是学会反演了……(其实挺好学的一天就能学会…… 原题: 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能 ...

  4. 【BZOJ1497】【NOI2006】最大获利

    最小割好劲啊 原题: 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项 ...

  5. 每天进步一点点-序列化和反序列(将对象写入硬盘文件and从硬盘文件读出对象)

    一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象.所谓“对象序列化”: 简单一句话:使用它可以象存储文本或者数字一样简单的存储对象.一个应用是,程序在执行过程中突 ...

  6. Java中的继承抽象类和接口

    一.总结 1.使用extends关键字继承,eg: class Student extends Persion { ...}; 2.Java编程规范中类的首字母大写,方法的首字母小写单词首字母代谢,e ...

  7. apache kafka系列之在zookeeper中存储结构

    1.topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 Schema:   {    "version": ...

  8. laravel使用过程中一些总结

    推荐连接: laravel辅助函数总结:https://laravel-china.org/docs/laravel/5.5/helpers 基于 Laravel 集成的 Monolog 库对日志进行 ...

  9. HDOJ 1297 Children’s Queue

    版权声明:来自: 码代码的猿猿的AC之路 http://blog.csdn.net/ck_boss https://blog.csdn.net/u012797220/article/details/3 ...

  10. VS 文件共享

    按照这个顺序:选中项目,鼠标右键菜单==〉添加==〉添加现有项==〉选择相应的文件==〉添加为链接注意,最后一步,添加按钮上有一个表示下拉的小三角,点击它就能看到“添加为链接”选项了.用的是VS201 ...