目录:

一、java io 概述

什么是IO?

IO包括输入流和输出流,输入流指的是将数据以字符或者字节形式读取到内存 分为字符输入流和字符输入流

输入流指的是从内存读取到外界 ,分为字符输入流和字节输出流

Java IO即Java 输入输出系统。不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要考虑和哪种媒介进行IO(文件、控制台、网络),我们还要考虑具体和它们的通信方式(顺序、随机、二进制、按字符、按字、按行等等)。Java类库的设计者通过设计大量的类来攻克这些难题,这些类就位于java.io包中。

什么是

在Java IO中,流是一个核心的概念。流从概念上来说是一个连续的数据流。你既可以从流中读取数据,也可以往流中写数据。流与数据源或者数据流向的媒介相关联。在Java IO中流既可以是字节流(以字节为单位进行读写),也可以是字符流(以字符为单位进行读写)

二、Java IO类库的框架

2.1 Java IO的类型

虽然java IO类库庞大,但总体来说其框架还是很清楚的。从是读媒介还是写媒介的维度看,Java IO可以分为:

1. 输入流:InputStream和Reader

2. 输出流:OutputStream和Writer

而从其处理流的类型的维度上看,Java IO又可以分为:

1. 字节流:InputStream和OutputStream

2. 字符流:Reader和Writer

01:File

创建文件   删除文件 修改文件 删除文件信息

02:字节流    InputStream            OutputStream     基类(父类)

03:字符流    Reader                Writer

04:缓冲流    BufferReader           BufferWriter  依赖于 Reader  Writer

05:二进制流  DataInputStream        DataOutputStream 依赖于InputStream OutputStream

06:序例化    objectInputStream      ObjectOutputStream 依赖于InputStream OutputStream

我们的程序需要通过InputStream或Reader从数据源读取数据,然后用OutputStream或者Writer将数据写入到目标媒介中。其中,InputStream和Reader与数据源相关联,OutputStream和writer与目标媒介相关联。 以下的图说明了这一点:

三、Java IO的基本用法

3.1 Java IO :字节流字节流对应的类应该是InputStream和OutputStream

例1,用字节流写文件

  1. package com.dzq;
  2. import java.io.*;
  3. /**
  4. * 字节流 InputStream OutputStream
  5. */
  6. public class ByteDemo {
  7. public static void main(String[] args) {
  8. //创建输入流和输出流对象
  9. InputStream inputStream=null;
  10. OutputStream outputStream=null;
  11. try {
  12. inputStream=new FileInputStream("e:/aaa.txt");
  13. //true代表是否向文件拼接,不能删除之前的内容
  14. outputStream=new FileOutputStream("e:/aaa.txt",true);
  15. //向文件写入内容
  16. outputStream.write("54321".getBytes());
  17. //read方法0-255,如果流读到了最后,将返回-1
  18. int num=0;//int -1 字符串 null
  19. while ((num=inputStream.read())!=-1){
  20. System.out.println((char)num);
  21. }
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. }
  25. try {
  26. inputStream.close();
  27. outputStream.close();
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. }

3.2 Java IO :字符流字符流对应的类应该是Reader和Writer

例3,用字符流文件

  1. package com.dzq;
  2. import java.io.*;
  3. /*
  4. * 字符流 Reader Writer
  5. */
  6. public class CharDemo{
  7. public static void main(String[] args) {
  8. //创建字符流输出和输入
  9. Reader reader=null;
  10. Writer writer=null;
  11. try {
  12. reader=new FileReader("e:/aaa.txt");
  13. writer=new FileWriter("e:/aaa.txt",true);
  14. writer.write("我爱我家!");
  15. writer.write("我爱我家?");
  16. writer.write("我爱我家!!");
  17. writer.write("我爱我家??");
  18. writer.flush();
  19. writer.write("我爱我家!!!!");
  20. writer.close();
  21. //读取
  22. //创建一次性读取多个字符
  23. char[] bytes =new char[1024];
  24. int num=0;
  25. StringBuffer stringBuffer=new StringBuffer();
  26. while((num=reader.read(bytes))!=-1){
  27. stringBuffer.append(bytes);
  28. }
  29. System.out.println(bytes);
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. }finally {
  33. try {
  34. writer.close();
  35. reader.close();
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. }
  41. }

3.3 Java IO  :二进制流( DataInputStream DataOutputStream 依赖于 InputStream  和  OutputStream

  1. package com.dzq;
  2. import java.io.*;
  3. /*
  4. *二进制流 DataInputStream DataOutputStream
  5. */
  6. public class DataDemo {
  7. public static void main(String[] args) {
  8. //创建输入流和输出流对象
  9. InputStream inputStream=null;
  10. OutputStream outputStream=null;
  11. DataInputStream dataInputStream=null;
  12. DataOutputStream dataOutputStream=null;
  13. try {
  14. //获取输入流
  15. inputStream=new FileInputStream("e:/aaa.txt");
  16. dataInputStream=new DataInputStream(inputStream);//封装
  17. //获取输出流
  18. outputStream=new FileOutputStream("e:/aaa.txt");
  19. dataOutputStream=new DataOutputStream(outputStream);
  20. //读取
  21. int num=0;
  22. while ((num=dataInputStream.read())!=-1){
  23. dataOutputStream.write(num);//复制
  24. }
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. }finally {
  28. try {
  29. dataOutputStream.close();
  30. dataInputStream.close();
  31. outputStream.close();
  32. inputStream.close();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. }
  38. }

3.4 Java IO(缓冲流BufferReader  BufferWriter 依赖于Reader 和Writer)

  1. package com.dzq;
  2. import java.io.*;
  3. /**
  4. *缓冲流 BufferReader BufferWriter
  5. */
  6. public class BufferDemo {
  7. public static void main(String[] args) {
  8. //创建字符流输出和输入
  9. Reader reader = null;
  10. Writer writer = null;
  11. BufferedReader bufferReader=null;
  12. BufferedWriter bufferedWriter=null;
  13. try {
  14. //写入
  15. writer=new FileWriter("e:/aaa.txt") ;
  16. bufferedWriter=new BufferedWriter(writer);//封装
  17. bufferedWriter.write("我爱我家1");
  18. bufferedWriter.write("我爱我家2");
  19. bufferedWriter.write("我爱我家3");
  20. bufferedWriter.newLine();//换行
  21. bufferedWriter.write("我爱我家4");
  22. reader.close();
  23. bufferedWriter.close();//如果不关闭后两行出不来
  24. //读取
  25. reader=new FileReader("e:/aaa.txt") ;
  26. bufferReader=new BufferedReader(reader);//封装
  27. //拼接
  28. String line=null;
  29. StringBuffer stringBuffer=new StringBuffer();
  30. while((line=bufferReader.readLine())!=null){
  31. stringBuffer.append(line);
  32. }
  33. System.out.println(stringBuffer.toString());
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }finally {
  37. try {
  38. bufferReader.close();
  39. reader.close();
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. }
  45. }

3.5 Java IO序列化和非序列化

User类:

  1. package com.cd;
  2. import java.io.Serializable;
  3. public class User implements Serializable{
  4. public String username;
  5. public String password;
  6. public String getUsername() {
  7. return username;
  8. }
  9. public void setUsername(String username) {
  10. this.username = username;
  11. }
  12. public String getPassword() {
  13. return password;
  14. }
  15. public void setPassword(String password) {
  16. this.password = password;
  17. }
  18. public User(String username, String password) {
  19. this.username = username;
  20. this.password = password;
  21. }
  22. public User(){
  23. }
  24. }

各方法:

  1. package com.cd;
  2. /**
  3. * 序列化和非序列化
  4. */
  5. import java.io.*;
  6. import java.util.Scanner;
  7. public class ObjectDemo {
  8. static Scanner input=new Scanner(System.in);
  9. //创建输出流和输入流
  10. static InputStream inputStream=null;
  11. static OutputStream outputStream=null;
  12. static ObjectInputStream objectInputStream=null;
  13. static ObjectOutputStream objectOutputStream=null;
  14. public static void main(String[] args) {
  15. //登录
  16. Login();
  17. //注册
  18. register();
  19. }
  20. //注册
  21. private static void register() {
  22. User user =new User();
  23. System.out.println("请输入你的用户名");
  24. user.setUsername(input.next());
  25. System.out.println("请输入你的密码");
  26. user.setPassword(input.next());
  27. try {
  28. outputStream=new FileOutputStream("e:/aaa.txt");
  29. objectOutputStream=new ObjectOutputStream(outputStream);
  30. //把对象输出到文件中
  31. objectOutputStream.writeObject(user);
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }finally {
  35. try {
  36. objectOutputStream.close();
  37. outputStream.close();
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }
  43. //登录
  44. private static void Login() {
  45. try {
  46. inputStream=new FileInputStream("e:/user.txt");
  47. objectInputStream=new ObjectInputStream(inputStream);
  48. //读取对象
  49. User user= (User) objectInputStream.readObject();
  50. System.out.println(user);
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. }finally {
  54. try {
  55. objectInputStream.close();
  56. inputStream.close();
  57. } catch (IOException e) {
  58. e.printStackTrace();
  59. }
  60. }
  61. }
  62. }

3.6 Java IO :字节流转换为字符流InputStreamReader

  1. public static void convertByteToChar() throws IOException{
  2. File file= new File( "d:/test.txt");
  3. //获得一个字节流 InputStream is= new FileInputStream( file);
  4. //把字节流转换为字符流,其实就是把字符流和字节流组合的结果。
  5. Reader reader= new InputStreamReader( is);
  6. char [] byteArray= new char[( int) file.length()];
  7. int size= reader.read( byteArray);
  8. System. out.println( "大小:"+size +";内容:" +new String(byteArray));
  9. is.close();
  10. reader.close();
  11. }

3.7 File 操作文件

DEMO:

  1. public class FileDemo
  2. {
  3. static Scanner input =new Scanner(System.in);
  4. public static void main( String[] args )
  5. {
  6. System.out.println( "***********欢迎进入文件操作系统*******************" );
  7. System.out.println(" *******************1:创建文件*******************" );
  8. System.out.println( "*******************2:删除文件*******************" );
  9. System.out.println( "*******************3:修改文件*******************" );
  10. System.out.println( "*******************4:创建文件夹*******************" );
  11. System.out.println( "*******************5:删除文件夹*******************" );
  12. System.out.println( "*******************6:查询文件夹下所有的列表*******************" );
  13. int choose =input.nextInt();
  14. switch(choose){
  15. case 1://创建文件
  16. createNewFile();
  17. break;
  18. case 2://删除文件
  19. deleteNewFile();
  20. break;
  21. case 3://修改文件
  22. updateNewFile();
  23. break;
  24. case 4://创建文件夹
  25. mkdirs();
  26. break;
  27. case 5://删除文件夹
  28. deletemkdirs();
  29. break;
  30. case 6://查询文件夹下所有的列表
  31. findFileList();
  32. break;
  33. }
  34. }

创建文件

  1. private static void createNewFile()
  2. {
  3. System.out.println("请输入文件的名称:(默认为E:/)");
  4. String fileName=input.next();
  5. //创建文件
  6. File file=new File("E:/"+fileName);//默认的路径
  7. if(file.exists()){
  8. System.out.println("该文件已存在!");
  9. }else{
  10. try {
  11. boolean flag =file.createNewFile();
  12. if(flag){
  13. System.out.println("文件夹创建成功");
  14. }else{
  15. System.out.println("文件夹创建失败");
  16. }
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. }

删除文件

  1. private static void deleteNewFile()
  2. {
  3. System.out.println("请输入你要删除的文件名称:(默认为E:/)");
  4. String fileName=input.next();
  5. //创建File对象
  6. File file =new File("E:/"+fileName);
  7. if (file.exists()){
  8. boolean flag =file.delete();
  9. if(flag)
  10. {
  11. System.out.println("删除成功");
  12. }else{
  13. System.out.println("删除失败");
  14. }
  15. }else{
  16. System.out.println("该文件不存在");
  17. }
  18. }

修改文件

  1. private static void updateNewFile()
  2. {
  3. System.out.println("请你输入需要修改的文件的名称:(默认为E:/)");
  4. String oldFileName=input.next();
  5. System.out.println("请你输入文件的新名称:(默认为E:/)");
  6. String newFileName=input.next();
  7. //创建File对象
  8. File oldFile=new File("E:/"+oldFileName);
  9. File NewFile=new File("E:/"+newFileName);
  10. if(oldFile.renameTo(NewFile)){
  11. System.out.println("修改成功");
  12. }else{
  13. System.out.println("修改失败");
  14. }
  15. }

创建文件夹

  1. private static void mkdirs() {
  2. System.out.println("请输入你要创建的文件名称:(默认为E:/)");
  3. String fileName=input.next();
  4. //创建File对象
  5. File file =new File("E:/"+fileName);
  6. if (file.mkdirs()){
  7. System.out.println("创建成功");
  8. }else{
  9. System.out.println("创建失败");
  10. }
  11. }

删除文件夹

一:删除文件夹的方法先删除文件夹里面的东西在删除文件

  1. public static void delFolder(String folderPath) {
  2. try {
  3. delAllFile(folderPath); //删除完里面所有内容
  4. String filePath = folderPath;
  5. filePath = filePath.toString();
  6. java.io.File myFilePath = new java.io.File(filePath);
  7. myFilePath.delete(); //删除空文件夹
  8. } catch (Exception e) {
  9. e.printStackTrace();
  10. }
  11. }

二:删除文件夹的方法

  1. public static boolean delAllFile(String path) {
  2. boolean flag = false;
  3. File file = new File(path);
  4. if (!file.exists()) {
  5. return flag;
  6. }
  7. if (!file.isDirectory()) {
  8. return flag;
  9. }
  10. String[] tempList = file.list();
  11. File temp = null;
  12. for (int i = 0; i < tempList.length; i++) {
  13. if (path.endsWith(File.separator)) {
  14. temp = new File(path + tempList[i]);
  15. } else {
  16. temp = new File(path + File.separator + tempList[i]);
  17. }
  18. if (temp.isFile()) {
  19. temp.delete();
  20. }
  21. if (temp.isDirectory()) {
  22. delAllFile(path + tempList[i]);//先删除文件夹里面的文件
  23. delFolder(path + tempList[i]);//再删除空文件夹
  24. flag = true;
  25. }
  26. }
  27. return flag;
  28. }

三:删除文件夹的终极方法

  1. private static void deletemkdirs() {
  2. System.out.println("请输入你要删除的文件夹名称:(默认为E:/)");
  3. String fileName=input.next();
  4. //创建File对象
  5. File file =new File("E:/"+fileName);
  6. if (file.exists()){
  7. boolean flag = delAllFile("E:/qqq");
  8. if(flag)
  9. {
  10. System.out.println("删除失败");
  11. }else{
  12. file.delete();
  13. System.out.println(" 删除成功");
  14. }
  15. }else{
  16. System.out.println("该文件不存在");
  17. }
  18. }

Java 持久化之 -- IO 全面整理(看了绝不后悔)的更多相关文章

  1. Java基础之IO流整理

    Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...

  2. Java 持久化之 --io流与序列化操作

    1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路径:getPath() 文件的上一级目录:g ...

  3. 近5年常考Java面试题及答案整理(三)

    上一篇:近5年常考Java面试题及答案整理(二) 68.Java中如何实现序列化,有什么意义? 答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写 ...

  4. 2018年最新Java面试题及答案整理(持续完善中…)

    2018年最新Java面试题及答案整理(持续完善中…) 基础篇 基本功 面向对象特征 封装,继承,多态和抽象 封装封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内 ...

  5. Java 面试/笔试题神整理 [Java web and android]

    Java 面试/笔试题神整理 一.Java web 相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并 ...

  6. java 开发面试题小整理(一)

    本篇文档将持续更新,有基础滴,也有深层次的,谢谢! 1.看下面的程序是否有问题,如果有问题,请指出并说明理由. * byte b1 = 3; * byte b2 = 4; * byte b3 = b1 ...

  7. Elasticsearch Java API 很全的整理

    Elasticsearch 的API 分为 REST Client API(http请求形式)以及 transportClient API两种.相比来说transportClient API效率更高, ...

  8. Java中的IO流 - 入门篇

    前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的IO流-入门篇>,希望对大家有帮助,谢谢 由于Java的IO类有很多,这就导致我刚开始学的时候,感觉很乱,每次用到都是上网搜,结果 ...

  9. java nio 与io区别

    转自:http://blog.csdn.net/keda8997110/article/details/19549493 当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使 ...

随机推荐

  1. 前端常用功能记录(二)—datatables表格

    并不是所有的后台开发都有美工和前端工程师来配合做页面,为了显示数据并有一定的美感,jQuery的DataTables插件对于像我这样的前端菜鸟来说真是雪中送炭,当然对于专业的前端开发者来说它更是锦上添 ...

  2. 关于爬取数据保存到json文件,中文是unicode解决方式

    流程: 爬取的数据处理为列表,包含字典.里面包含中文, 经过json.dumps,保存到json文件中, 发现里面的中文显示未\ue768这样子 查阅资料发现,json.dumps 有一个参数.ens ...

  3. websocket使用nginx作为反向代理

    需要nginx作为websocket的反向代理,没有nginx反向代理时候没有问题,通过nginx反向代理后会报400错误,查后台调试信息: tornado.general – DEBUG – Can ...

  4. android编译时出现org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileDebugJavaWithJavac'.错误

    android studio中使用terminal工具.在android studio最下面的底部菜单栏中有(如果没有那cmd中进入项目根目录后): 使用命令  gradlew compileDebu ...

  5. LINQ 查询

    概述 事实上,对于LINQ to Objects来说,就是通过为IEnumerable<T>接口定义了一组约50个扩展方式来实现的. Lambda表达式(拉姆达表达式,Lambda Exp ...

  6. 20145234黄斐《Java程序设计》第八周

    教材学习内容总结 第十四章-NIO与NIO2 NIO与IO的区别 NIO Channel继承框架 想要取得Channel的操作对象,可以使用Channels类,它定义了静态方法newChannel() ...

  7. 第10月第4天 Mac g++ sfml opendir

    1. g++ OpenGL.cpp -I/Users/temp/Downloads/SFML-2.4.2-osx-clang/include -L/usr/local/lib -framework O ...

  8. 【Python】Flask系列-cookie和session笔记

    cookie: 1.cookie出现的原因:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了 ...

  9. 从Dying gasp功能看Linux的响应速度(zhuan)

    转自https://blog.csdn.net/qq_20405005/article/details/77967358 前一阵子在做dying gasp功能测试,过程中恰好测试到了Linux的响应速 ...

  10. centos7切换启动内核

    1.查看当前系统内核 uname -r 3.18.6-2.el7.centos.x86_64 查看可使用的内核列表 awk -F\' '$1=="menuentry " {prin ...