上一篇文章[数据库部分(面试题)]
通俗的说,就是可以将内存中java对象可以写在硬盘上(序列化到硬盘上),反序列化就是讲硬盘的内容读取到内存中去;java是通过实现
Serializeble
接口,实现的序列化,Serializeble接口里面没有任何方法,只是标示接口
字节流,字符流
- 字节流继承于
InputStream outputStream
- 字符流继承于
InputStreamReader OutputStreamWriter
- 在java.io包中还有许多其他的流,主要是为了提高性能和使用方便
- 把一片二进制数据数据逐一输出到某个设备中,或者从某个设备中逐一读取一片二进制数据,不管输入输出设备是什么,我们要用统一的方式来完成这些操作,用一种抽象的方式进行描述,这个抽象的描述方式起名为Io流,对应得抽象类为OutputStream和InputStream,不同的实现类就代表不同的输入和输出设备,他们都是针对字节进行操作的
- 在应用中,经常要完全是字符的一段文本输出去或读进来,用字节流可以吗?计算机中一切最终都是二进制的字节流式存在.对于"中国"这些字符,首先要得到其对应的字节,然后将字节写入到输出流.读取时,首先读到的是字节,可是我们要把它显示为字符,我们需要将字节转换成字符.由于这样的需求很广泛,专门提供了字符流的包装类
- 底层设备永远只接受字节数据,有时候要写字符串到底层设备,需要将字符串转成字节再进行写入,字符流是字节流的包装,字符流则是直接接受字符串,它内部将字符串转成字节,再写入底层设备,这为我们向Io设别写入或读取字符串提供了一点点方便
- 字符向字节转换时,要注意编码的问题,因为字符串转成字节数组,其实是转成该字符的某种编码的字节形式,读取也是反之的道理
讲解字节流与字符流关系的代码案列:
package com.company; import javax.annotation.processing.Filer; import java.io.*; public class IOTest { public static void main(String[] args) throws Exception { String str="我和我的祖国"; /*FileOutputStream fos=new FileOutputStream("1.txt"); fos.write(str.getBytes("utf-8")); fos.close();*/ /*FileWriter fw=new FileWriter("1.txt"); fw.write(str); fw.close();*/ PrintWriter pw=new PrintWriter("1.txt","utf-8"); pw.write(str); pw.close(); /*FileReader fr=new FileReader("1.txt"); char[] buf=new char[1024]; int len=fr.read(buf); String myStr=new String(buf,0,len); System.out.println(myStr);*/ /*FileInputStream frs=new FileInputStream("1.txt"); byte[] bufs=new byte[1024]; int lens=frs.read(bufs); String mystr=new String(bufs,0,len,"utf-8"); System.out.println(mystr);*/ BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("1.txt"),"utf-8")); String Mystrs=br.readLine(); br.close(); System.out.println(Mystrs); } }
总结:很简单,字符流的底层就是字节流,而字符流主要是读取文本文件内容的,可以一个字符一个字符的读取,也可以一行一行的读取文本文件内容,而字节流读取单位为byte.byte作为计算机存储最基本的单位,可以用字节流来读取很多其他格式的文件,比如图片视频等等,基于B/S和C/S的文件传输都可以采用字节流的形式
File f=new FIle(fileName);//构造文件File类
f.isDirectory();//判断是否为目录
File f=new File(filepath);//构造文件File类
String[] fileName=f.list();//获取目录的文件名
File[] files=f.listFiles();//获取目录下的文件
读取文件:
package com.company; import java.io.*; public class FileRead { /** * 1.找到指定的文件 * 2.根据文件创建文件的输入流 * 3.创建字节数组 * 4.读取内容,放到字节数组里面 * 5.关闭输入流 * @param args */ public static void main(String[] args) { File file=new File("2.txt");//构建指定文件 InputStream in=null; try { in=new FileInputStream(file);//根据文件创建文件的输入流 byte[] bytes=new byte[1024];//创建字节数组 in.read(bytes);//读取内容,放到字节数组里面 System.out.println(new String(bytes)); } catch (Exception e) { e.printStackTrace(); }finally { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } }
写入文件:
package com.company; import java.io.*; public class FileWriter { /** * 文件的输出流,用来写入文件内容 * 1.找到指定的文件 * 2.根据文件创建文件的输出流 * 3.把内容转换成字节数组 * 4.向文件写入内容 * 5.关闭输出流 * @param args */ public static void main(String[] args) { File file=new File("2.txt");//构建指定文件 OutputStream out =null; try { out=new FileOutputStream(file);//根据文件创建文件的输出流 String message="我和我的祖国!"; byte[] mesbyte=message.getBytes();//把内容转换成字节数组 out.write(mesbyte); } catch (Exception e) { e.printStackTrace(); }finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }
package com.company; import java.io.*; public class FileCopy { /** * 实现思路 * 1.构建源文件与目标文件 * 2.源文件创建输入流,目标文件创建输出流 * 3.创建字节数组 * 4.使用循环,源文件读取一部分内容,目标文件写入一部分内容,直到写完所有内容 * 5.关闭源文件输入流,目标文件输出流 * @param args */ public static void main(String[] args) { //构建源文件 File file=new File("2.txt"); //构建目标文件 File fileCopy=new File("3.txt"); InputStream in=null; OutputStream out=null; try { if(!fileCopy.exists()){ fileCopy.createNewFile(); } //源文件创建输入流 in=new FileInputStream(file); //目标文件创建输出流 out=new FileOutputStream(fileCopy,true); //创建字节数组 byte[] bytes=new byte[1024]; int len=0; while ((len=in.read(bytes))!=-1){ //目标文件写入一部分内容 out.write(bytes,0,len); } } catch (Exception e) { e.printStackTrace(); }finally { try { in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } } }
package com.company;
import java.sql.*;
public class DBUtil {
private static final String USERNAME = "*";
private static final String PASSWORD = "*";
private static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String URL = "jdbc:sqlserver://*****:1433;database=**";
/**
*
* @return
*/
public static Connection getConnection(){
Connection con=null;
try {
Class.forName(DRIVER);
con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
public static void close(Connection con, PreparedStatement ps, ResultSet rs){
try {
if(rs!=null){
rs.close();
rs=null;
}
if(ps!=null){
ps.close();
ps=null;
}
if(con!=null){
con.close();
con=null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
提高性能:
- 在使用PreparedStatement对象执行的SQL时候,命令被数据库编译和解析,然后被放到命令缓冲区,然后每当执行同一个PreparedStatement时候,他就被在解析一次,如果你写Insert update delete 最好使用PreparedStatement,并且可以重新使用
安全性:
PreparedStatement可以防止SQL注入
List:是列表,有下标值,存储元素可以重复,遍历元素是有序的
Set:是散列表,无下标值,存储元素不可重复,遍历元素时无序的
Map:是以键值对存储,一个key一个value,key不可以重复,value可以重复
数组:指定类型,固定长度,元素存储地址是连续的
数:元素以树形结构存储,只有一个根节点
栈:元素是先进后出,后进先出
向量:动态数组,可以存储任何类型元素,动态长度,元素存储地址是连续的
队列:元素存储是排列有序的,一定保证先进的先出,后进的后出
Class<?> demo1=Class.forName("Reflect.Dmeo");//使用class类
Class<?> demo2=new Demo().getClass();//通过对象
Class<?> demo3 =Demo.class;//通过类
获取所有方法:
Class<?> demo=Class.forName("Reflect.Demo"); Method[] methods=Demo.getDeclaredMethods();
获取所有属性:
Class<?> demo =Class.forName("Reflect.Demo"); Field[] fields=demo.getDeclaredFiekds();
1.Connection 用来与数据库建立连接 2.Statement 用来执行SQL语句 3.ResultSet 用来接收结果集 4.PreParedStatement 是Statement子接口,执行SQL语句,预编译,防止SQL注入,安全性高
Json是一种字符串数据格式,一般用于数据传输格式
Json字符串中[]对应JSONArray,{}对应JSONObject
JAVA反射机制是在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制
[扩展学习]
[简言]
全网呼叫,四川8633,收到请回答!