Java 持久化之 -- IO 全面整理(看了绝不后悔)
目录:
一、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,用字节流写文件
- package com.dzq;
- import java.io.*;
- /**
- * 字节流 InputStream OutputStream
- */
- public class ByteDemo {
- public static void main(String[] args) {
- //创建输入流和输出流对象
- InputStream inputStream=null;
- OutputStream outputStream=null;
- try {
- inputStream=new FileInputStream("e:/aaa.txt");
- //true代表是否向文件拼接,不能删除之前的内容
- outputStream=new FileOutputStream("e:/aaa.txt",true);
- //向文件写入内容
- outputStream.write("54321".getBytes());
- //read方法0-255,如果流读到了最后,将返回-1
- int num=0;//int -1 字符串 null
- while ((num=inputStream.read())!=-1){
- System.out.println((char)num);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- try {
- inputStream.close();
- outputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
3.2 Java IO :字符流(字符流对应的类应该是Reader和Writer)
例3,用字符流写文件
- package com.dzq;
- import java.io.*;
- /*
- * 字符流 Reader Writer
- */
- public class CharDemo{
- public static void main(String[] args) {
- //创建字符流输出和输入
- Reader reader=null;
- Writer writer=null;
- try {
- reader=new FileReader("e:/aaa.txt");
- writer=new FileWriter("e:/aaa.txt",true);
- writer.write("我爱我家!");
- writer.write("我爱我家?");
- writer.write("我爱我家!!");
- writer.write("我爱我家??");
- writer.flush();
- writer.write("我爱我家!!!!");
- writer.close();
- //读取
- //创建一次性读取多个字符
- char[] bytes =new char[1024];
- int num=0;
- StringBuffer stringBuffer=new StringBuffer();
- while((num=reader.read(bytes))!=-1){
- stringBuffer.append(bytes);
- }
- System.out.println(bytes);
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- try {
- writer.close();
- reader.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
3.3 Java IO :二进制流( DataInputStream DataOutputStream 依赖于 InputStream 和 OutputStream )
- package com.dzq;
- import java.io.*;
- /*
- *二进制流 DataInputStream DataOutputStream
- */
- public class DataDemo {
- public static void main(String[] args) {
- //创建输入流和输出流对象
- InputStream inputStream=null;
- OutputStream outputStream=null;
- DataInputStream dataInputStream=null;
- DataOutputStream dataOutputStream=null;
- try {
- //获取输入流
- inputStream=new FileInputStream("e:/aaa.txt");
- dataInputStream=new DataInputStream(inputStream);//封装
- //获取输出流
- outputStream=new FileOutputStream("e:/aaa.txt");
- dataOutputStream=new DataOutputStream(outputStream);
- //读取
- int num=0;
- while ((num=dataInputStream.read())!=-1){
- dataOutputStream.write(num);//复制
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- try {
- dataOutputStream.close();
- dataInputStream.close();
- outputStream.close();
- inputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
3.4 Java IO(缓冲流BufferReader BufferWriter 依赖于Reader 和Writer)
- package com.dzq;
- import java.io.*;
- /**
- *缓冲流 BufferReader BufferWriter
- */
- public class BufferDemo {
- public static void main(String[] args) {
- //创建字符流输出和输入
- Reader reader = null;
- Writer writer = null;
- BufferedReader bufferReader=null;
- BufferedWriter bufferedWriter=null;
- try {
- //写入
- writer=new FileWriter("e:/aaa.txt") ;
- bufferedWriter=new BufferedWriter(writer);//封装
- bufferedWriter.write("我爱我家1");
- bufferedWriter.write("我爱我家2");
- bufferedWriter.write("我爱我家3");
- bufferedWriter.newLine();//换行
- bufferedWriter.write("我爱我家4");
- reader.close();
- bufferedWriter.close();//如果不关闭后两行出不来
- //读取
- reader=new FileReader("e:/aaa.txt") ;
- bufferReader=new BufferedReader(reader);//封装
- //拼接
- String line=null;
- StringBuffer stringBuffer=new StringBuffer();
- while((line=bufferReader.readLine())!=null){
- stringBuffer.append(line);
- }
- System.out.println(stringBuffer.toString());
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- try {
- bufferReader.close();
- reader.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
3.5 Java IO序列化和非序列化
User类:
- package com.cd;
- import java.io.Serializable;
- public class User implements Serializable{
- public String username;
- public String password;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public User(String username, String password) {
- this.username = username;
- this.password = password;
- }
- public User(){
- }
- }
各方法:
- package com.cd;
- /**
- * 序列化和非序列化
- */
- import java.io.*;
- import java.util.Scanner;
- public class ObjectDemo {
- static Scanner input=new Scanner(System.in);
- //创建输出流和输入流
- static InputStream inputStream=null;
- static OutputStream outputStream=null;
- static ObjectInputStream objectInputStream=null;
- static ObjectOutputStream objectOutputStream=null;
- public static void main(String[] args) {
- //登录
- Login();
- //注册
- register();
- }
- //注册
- private static void register() {
- User user =new User();
- System.out.println("请输入你的用户名");
- user.setUsername(input.next());
- System.out.println("请输入你的密码");
- user.setPassword(input.next());
- try {
- outputStream=new FileOutputStream("e:/aaa.txt");
- objectOutputStream=new ObjectOutputStream(outputStream);
- //把对象输出到文件中
- objectOutputStream.writeObject(user);
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- try {
- objectOutputStream.close();
- outputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- //登录
- private static void Login() {
- try {
- inputStream=new FileInputStream("e:/user.txt");
- objectInputStream=new ObjectInputStream(inputStream);
- //读取对象
- User user= (User) objectInputStream.readObject();
- System.out.println(user);
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- try {
- objectInputStream.close();
- inputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
3.6 Java IO :字节流转换为字符流(InputStreamReader)
- public static void convertByteToChar() throws IOException{
- File file= new File( "d:/test.txt");
- //获得一个字节流 InputStream is= new FileInputStream( file);
- //把字节流转换为字符流,其实就是把字符流和字节流组合的结果。
- Reader reader= new InputStreamReader( is);
- char [] byteArray= new char[( int) file.length()];
- int size= reader.read( byteArray);
- System. out.println( "大小:"+size +";内容:" +new String(byteArray));
- is.close();
- reader.close();
- }
3.7 File 操作文件
DEMO:
- public class FileDemo
- {
- static Scanner input =new Scanner(System.in);
- public static void main( String[] args )
- {
- System.out.println( "***********欢迎进入文件操作系统*******************" );
- System.out.println(" *******************1:创建文件*******************" );
- System.out.println( "*******************2:删除文件*******************" );
- System.out.println( "*******************3:修改文件*******************" );
- System.out.println( "*******************4:创建文件夹*******************" );
- System.out.println( "*******************5:删除文件夹*******************" );
- System.out.println( "*******************6:查询文件夹下所有的列表*******************" );
- int choose =input.nextInt();
- switch(choose){
- case 1://创建文件
- createNewFile();
- break;
- case 2://删除文件
- deleteNewFile();
- break;
- case 3://修改文件
- updateNewFile();
- break;
- case 4://创建文件夹
- mkdirs();
- break;
- case 5://删除文件夹
- deletemkdirs();
- break;
- case 6://查询文件夹下所有的列表
- findFileList();
- break;
- }
- }
创建文件
- private static void createNewFile()
- {
- System.out.println("请输入文件的名称:(默认为E:/)");
- String fileName=input.next();
- //创建文件
- File file=new File("E:/"+fileName);//默认的路径
- if(file.exists()){
- System.out.println("该文件已存在!");
- }else{
- try {
- boolean flag =file.createNewFile();
- if(flag){
- System.out.println("文件夹创建成功");
- }else{
- System.out.println("文件夹创建失败");
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
删除文件
- private static void deleteNewFile()
- {
- System.out.println("请输入你要删除的文件名称:(默认为E:/)");
- String fileName=input.next();
- //创建File对象
- File file =new File("E:/"+fileName);
- if (file.exists()){
- boolean flag =file.delete();
- if(flag)
- {
- System.out.println("删除成功");
- }else{
- System.out.println("删除失败");
- }
- }else{
- System.out.println("该文件不存在");
- }
- }
修改文件
- private static void updateNewFile()
- {
- System.out.println("请你输入需要修改的文件的名称:(默认为E:/)");
- String oldFileName=input.next();
- System.out.println("请你输入文件的新名称:(默认为E:/)");
- String newFileName=input.next();
- //创建File对象
- File oldFile=new File("E:/"+oldFileName);
- File NewFile=new File("E:/"+newFileName);
- if(oldFile.renameTo(NewFile)){
- System.out.println("修改成功");
- }else{
- System.out.println("修改失败");
- }
- }
创建文件夹
- private static void mkdirs() {
- System.out.println("请输入你要创建的文件名称:(默认为E:/)");
- String fileName=input.next();
- //创建File对象
- File file =new File("E:/"+fileName);
- if (file.mkdirs()){
- System.out.println("创建成功");
- }else{
- System.out.println("创建失败");
- }
- }
删除文件夹
一:删除文件夹的方法(先删除文件夹里面的东西在删除文件)
- public static void delFolder(String folderPath) {
- try {
- delAllFile(folderPath); //删除完里面所有内容
- String filePath = folderPath;
- filePath = filePath.toString();
- java.io.File myFilePath = new java.io.File(filePath);
- myFilePath.delete(); //删除空文件夹
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
二:删除文件夹的方法
- public static boolean delAllFile(String path) {
- boolean flag = false;
- File file = new File(path);
- if (!file.exists()) {
- return flag;
- }
- if (!file.isDirectory()) {
- return flag;
- }
- String[] tempList = file.list();
- File temp = null;
- for (int i = 0; i < tempList.length; i++) {
- if (path.endsWith(File.separator)) {
- temp = new File(path + tempList[i]);
- } else {
- temp = new File(path + File.separator + tempList[i]);
- }
- if (temp.isFile()) {
- temp.delete();
- }
- if (temp.isDirectory()) {
- delAllFile(path + tempList[i]);//先删除文件夹里面的文件
- delFolder(path + tempList[i]);//再删除空文件夹
- flag = true;
- }
- }
- return flag;
- }
三:删除文件夹的终极方法
- private static void deletemkdirs() {
- System.out.println("请输入你要删除的文件夹名称:(默认为E:/)");
- String fileName=input.next();
- //创建File对象
- File file =new File("E:/"+fileName);
- if (file.exists()){
- boolean flag = delAllFile("E:/qqq");
- if(flag)
- {
- System.out.println("删除失败");
- }else{
- file.delete();
- System.out.println(" 删除成功");
- }
- }else{
- System.out.println("该文件不存在");
- }
- }
Java 持久化之 -- IO 全面整理(看了绝不后悔)的更多相关文章
- Java基础之IO流整理
Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...
- Java 持久化之 --io流与序列化操作
1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路径:getPath() 文件的上一级目录:g ...
- 近5年常考Java面试题及答案整理(三)
上一篇:近5年常考Java面试题及答案整理(二) 68.Java中如何实现序列化,有什么意义? 答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写 ...
- 2018年最新Java面试题及答案整理(持续完善中…)
2018年最新Java面试题及答案整理(持续完善中…) 基础篇 基本功 面向对象特征 封装,继承,多态和抽象 封装封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内 ...
- Java 面试/笔试题神整理 [Java web and android]
Java 面试/笔试题神整理 一.Java web 相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并 ...
- java 开发面试题小整理(一)
本篇文档将持续更新,有基础滴,也有深层次的,谢谢! 1.看下面的程序是否有问题,如果有问题,请指出并说明理由. * byte b1 = 3; * byte b2 = 4; * byte b3 = b1 ...
- Elasticsearch Java API 很全的整理
Elasticsearch 的API 分为 REST Client API(http请求形式)以及 transportClient API两种.相比来说transportClient API效率更高, ...
- Java中的IO流 - 入门篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的IO流-入门篇>,希望对大家有帮助,谢谢 由于Java的IO类有很多,这就导致我刚开始学的时候,感觉很乱,每次用到都是上网搜,结果 ...
- java nio 与io区别
转自:http://blog.csdn.net/keda8997110/article/details/19549493 当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使 ...
随机推荐
- 前端常用功能记录(二)—datatables表格
并不是所有的后台开发都有美工和前端工程师来配合做页面,为了显示数据并有一定的美感,jQuery的DataTables插件对于像我这样的前端菜鸟来说真是雪中送炭,当然对于专业的前端开发者来说它更是锦上添 ...
- 关于爬取数据保存到json文件,中文是unicode解决方式
流程: 爬取的数据处理为列表,包含字典.里面包含中文, 经过json.dumps,保存到json文件中, 发现里面的中文显示未\ue768这样子 查阅资料发现,json.dumps 有一个参数.ens ...
- websocket使用nginx作为反向代理
需要nginx作为websocket的反向代理,没有nginx反向代理时候没有问题,通过nginx反向代理后会报400错误,查后台调试信息: tornado.general – DEBUG – Can ...
- android编译时出现org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileDebugJavaWithJavac'.错误
android studio中使用terminal工具.在android studio最下面的底部菜单栏中有(如果没有那cmd中进入项目根目录后): 使用命令 gradlew compileDebu ...
- LINQ 查询
概述 事实上,对于LINQ to Objects来说,就是通过为IEnumerable<T>接口定义了一组约50个扩展方式来实现的. Lambda表达式(拉姆达表达式,Lambda Exp ...
- 20145234黄斐《Java程序设计》第八周
教材学习内容总结 第十四章-NIO与NIO2 NIO与IO的区别 NIO Channel继承框架 想要取得Channel的操作对象,可以使用Channels类,它定义了静态方法newChannel() ...
- 第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 ...
- 【Python】Flask系列-cookie和session笔记
cookie: 1.cookie出现的原因:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了 ...
- 从Dying gasp功能看Linux的响应速度(zhuan)
转自https://blog.csdn.net/qq_20405005/article/details/77967358 前一阵子在做dying gasp功能测试,过程中恰好测试到了Linux的响应速 ...
- centos7切换启动内核
1.查看当前系统内核 uname -r 3.18.6-2.el7.centos.x86_64 查看可使用的内核列表 awk -F\' '$1=="menuentry " {prin ...