Java學(xué)習(xí)筆記:IO流,字節(jié)流,集合,事務(wù),配置文件,常用方法【詩(shī)書畫唱】

集合的分類:
list:ArrayList、LinkedList、Vector
1.有序(可以使用下標(biāo)進(jìn)行訪問(wèn))
2.大小任意
3.存儲(chǔ)的類型任意
set:HashSet
1. 無(wú)序(沒(méi)有下標(biāo))
2.大小任意
3.存儲(chǔ)的類型任意
4.取數(shù)據(jù)的時(shí)候取的順序和存入的順序可能不一致
map:HashMap
1. 無(wú)序(沒(méi)有下標(biāo))
2.大小任意
3.采用的鍵值對(duì)的方式進(jìn)行存儲(chǔ),鍵是不能重復(fù),值是可以重復(fù)
// Collections類是一個(gè)工具類,主要是對(duì)于集合操作的工具類,其中的方法全部都是靜態(tài)的。
// 常用方法:
// 1.addAll():一次性對(duì)集合添加多條數(shù)據(jù)
// 2. Sort():對(duì)集合內(nèi)容進(jìn)行排序
// 3.shuffle():對(duì)集合元素進(jìn)行隨機(jī)排序
// 4.copy():復(fù)制集合,要求復(fù)制的集合的長(zhǎng)度大于被復(fù)制的集合的長(zhǎng)度
// 5.max():得到集合中的最大值
// 6.min():得到集合中的最小值
SQL_PreparedStatement:
什么是防注入?直接字符串拼接用戶再后輸入一個(gè)or 1=1的時(shí)候那么這個(gè)條件是肯定成立的,所以用戶輸入不輸入用戶名沒(méi)有多大的關(guān)系了為了解決這個(gè)問(wèn)題,就要使用preparedstatement解決,它默認(rèn)將sql語(yǔ)句編譯成函數(shù),每次只要傳入相應(yīng)的參數(shù)就可以了,就可以防止用戶sql注入。
預(yù)處理:我們每次對(duì)于數(shù)據(jù)庫(kù)操作數(shù)據(jù)庫(kù)都要將sql語(yǔ)句編譯成函數(shù)
如果我們使用預(yù)處理的時(shí)候,數(shù)據(jù)庫(kù)就默認(rèn)生成了一個(gè)函數(shù),以后再
傳入相同的內(nèi)容的時(shí)候只需要調(diào)用這個(gè)函數(shù)就可以了,這個(gè)就可以提升sql執(zhí)行的效率
//1.導(dǎo)入數(shù)據(jù)包
//2.加載數(shù)據(jù)包
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//3.創(chuàng)建連接數(shù)據(jù)庫(kù)的對(duì)象(Connection)
Connection con=DriverManager.getConnection("jdbc:sqlserver://localhost;databaseName=fuxi","qqq","11111");
//4.創(chuàng)建執(zhí)行sql語(yǔ)句的對(duì)象,是statement,preparedStatement(防注入,預(yù)處理)
String sql="select * from denglu where uid=? and uname=?";//1
PreparedStatement ps=con.prepareStatement(sql);//編譯sql語(yǔ)句
ps.setObject(1, 1);
ps.setObject(2, "qwe");
//5.寫并且執(zhí)行sql語(yǔ)句,ResultSet的對(duì)象
ResultSet res=ps.executeQuery();//使用這個(gè)方法去執(zhí)行sql語(yǔ)句
//6.遍歷這個(gè)對(duì)象
while(res.next()){
System.out.println(res.getObject(1)+"? "+res.getObject(2));
}
為什么要讀取配置文件://將一些常用的配置信息保存在配置文件里,
//java類一旦編譯,雖然我們不能直接修改編譯后的文件,但是我們
//可以修改配置文件,寫的代碼對(duì)于配置都是去配置文件里讀的,萬(wàn)一
//數(shù)據(jù)庫(kù)用戶或者密碼修改里之后,我直接修改配置文件即可
//讀取配置文件:
//1.建立一個(gè)文件,src目錄下,文件名稱可以
//隨便,但是后綴名必須為.properties
//2.添加幾個(gè)內(nèi)容
//3.在main中添加一下代碼
將這個(gè)配置文件轉(zhuǎn)化為字節(jié)流
//使用類加載器轉(zhuǎn)化文件
InputStream is=qqq.class.getResourceAsStream ("../zz.properties");
Properties p=new Properties();
p.load(is);
System.out.println(p);
//獲取指定的單個(gè)內(nèi)容
System.out.println(p.getProperty("qq"));
創(chuàng)建數(shù)據(jù)庫(kù)表stu,結(jié)構(gòu)uid,uname,upwd,umoney,使用預(yù)處理和配置文件制作查詢和增加數(shù)據(jù)
事務(wù):
事務(wù)是指一組操作,要么都執(zhí)行成功,要么都執(zhí)行失敗。四個(gè)特性;
1)原子性:一組操作,要么都執(zhí)行成功,要么都執(zhí)行失敗。
?2)隔離性:一個(gè)事務(wù)的操作沒(méi)有完成之前,其他事務(wù)是不能對(duì)這個(gè)事務(wù)處理的結(jié)果進(jìn)行操作的,需要犧牲速度
3)一致性:事物發(fā)生和發(fā)生后的總金額依然匹配。
4)持久性:事務(wù)產(chǎn)生的影響是不能撤銷的。Connection c=DBUtil.getCon();c.setAutoCommit(false);//設(shè)置連接為手動(dòng)提交
c.commit();//在執(zhí)行完操作后提交事務(wù)
c.rollback();出現(xiàn)異常執(zhí)行回滾File操作:
構(gòu)造方法:
new File("路徑");
new File("父級(jí)路徑","文件名稱");
常用方法:
createNewFile():創(chuàng)建文件
mkdir():創(chuàng)建文件夾
mkdirs():創(chuàng)建多級(jí)文件夾
delete():刪除文件,當(dāng)你的文件夾中包含內(nèi)容的時(shí)候,是不會(huì)刪除的
判斷文件:
判斷文件是否存在:exists();
判斷輸入的路徑是否是絕對(duì)路徑:isAbsolute()
判斷是否是一個(gè)文件夾:isDirectory();
判斷是否是一個(gè)文件:isFile();
判斷文件是否是隱藏文件(系統(tǒng)文件):isHidden();
獲取的方法:
獲取文件的絕對(duì)路徑:getAbsoluteFile()
獲取文件的父路徑:getParentFile();
獲取文件的名字:getName();
返回創(chuàng)建對(duì)象時(shí)的路徑:getPath()
返回文件最后修改時(shí)間:lastModified()
返回文件的字節(jié)數(shù):length()
返回文件是否可讀:CanRead()
返回文件是否可寫:CanWrite();
list:得到文件夾下的所有的文件名稱,它得到的是一個(gè)String類型的數(shù)組
listFiles:得到文件夾下的所有的文件,它得到的是文件類型的數(shù)組
listRoots:得到計(jì)算機(jī)的根目錄
IO流的介紹:
輸入輸出流,將你的程序作為中心點(diǎn),從計(jì)算機(jī)中傳入到程序里叫做輸入流,從程序里往計(jì)算機(jī)輸出文件叫做輸出流
字節(jié)流,字符流,計(jì)算機(jī)文件的最基本單位是字節(jié),1個(gè)字符可以包含1-3個(gè)字節(jié)
1.字符流每次讀取兩個(gè)字節(jié),所以相較于字節(jié)流
速度要快
2.字符流只能夠處理文本文件,字節(jié)流可以處理
其他任何文件結(jié)論:只要是純文本數(shù)據(jù)優(yōu)先使用字符流,除此之外都使用字節(jié)
讀取文本內(nèi)容語(yǔ)法:
File f=new File("ceshi.txt");
//輸出流(追加內(nèi)容)
FileReader fw=new FileReader(f);
char[] cs=new char[100];
int len;
while((len=fw.read(cs))!=-1){
System.out.println(new String(cs,0,len));
}
fw.close();
寫入文本內(nèi)容語(yǔ)法:
File f=new File("ceshi.txt");
//輸出流(追加內(nèi)容)
FileWriter fw=new FileWriter(f);
char[] cs=new char[100];
int len;
while((len=fw.read(cs))!=-1){
fw.writer(new String(cs,0,len));
}
fw.close();
字節(jié)流:
FileInputStream:字節(jié)輸入流
FileOutputStream:字節(jié)輸出流
字節(jié)流是可以讀取任何文件,每次讀取的時(shí)候是1字節(jié)
緩沖流(包裝流):
BufferedReader:字符輸入緩沖流
BufferedWriter:字符輸出緩沖流
BufferedInputStream:字節(jié)輸入緩沖流
BufferedOutputStream:字節(jié)輸出緩沖流
為了提高讀寫流的效率,引入了緩沖機(jī)制,進(jìn)行批量的讀寫,提高了讀寫的效率。Buffered包裝類用于加快了讀寫內(nèi)容的速度。