1. การเข้ารหัสเอกสาร
แพ็คเกจ com.study.io;/*** ทดสอบการเข้ารหัสไฟล์*/คลาสสาธารณะเข้ารหัส {/*** @param args*@throws ข้อยกเว้น*/โมฆะสาธารณะคงที่หลัก (สตริง [] args) โยนข้อยกเว้น {string s = "การศึกษา abc well"; byte [] bytes1 = s.getBytes ของโครงการ (นี่คือ UTF-8) สำหรับ (byte b: bytes1) {// แปลงไบต์ (เป็น int) เพื่อแสดง system.out.print (integer.toHexstring (b & 0xff)+""); // & 0xff คือการลบ 24 0S ไบต์ในภาษาอังกฤษ */byte [] bytes2 = s.getBytes ("utf-8"); // จะมีข้อยกเว้นที่แสดงที่นี่ดังนั้นเราจึงโยนข้อยกเว้นนี้สำหรับ (ไบต์ B: bytes2) {system.out.print (integer.tohexstring (b & 0xff)+"); ในภาษาอังกฤษ */byte [] bytes3 = s.getBytes ("gbk"); // จะมีข้อยกเว้นที่แสดงที่นี่ดังนั้นเราจะโยนข้อยกเว้นนี้สำหรับ (byte b: bytes3) {system.out.out.print (integer.tohexstring (b & 0xff)+"); 2 bytes*/byte [] bytes4 = s.getBytes ("utf-16be"); // จะมีข้อยกเว้นที่แสดงที่นี่ดังนั้นเราจะโยนข้อยกเว้นนี้สำหรับ (byte b: bytes4) {system.out.print (integer.tohexstring (b & 0xff) " ต้องการเปลี่ยนลำดับไบต์เป็นสตริงคุณต้องใช้วิธีการเข้ารหัสนี้มิฉะนั้นรหัสที่อ่านไม่ออกจะปรากฏขึ้น*/string str1 = สตริงใหม่ (bytes4); // ในเวลานี้การเข้ารหัสเริ่มต้นของโครงการจะถูกใช้เพื่อแปลง String (bytes4, "utf-16be"); system.out.println (str2);}} วิเคราะห์:
* 1. คำอธิบายของ“ & 0xff”:
* 0xff แสดงถึง hexadecimal (ทศนิยมคือ 255) และแสดงเป็นไบนารีซึ่งก็คือ "111111111"
* จากนั้นอักขระ & แสดงจำนวนบิต (กลับ 1 เมื่อเหมือนกันคือ 1 มิฉะนั้นจะส่งคืน 0)
* 2. ไบต์ไบต์และการแปลงประเภท int:
* integer.tohexstring (b & 0xff) ที่นี่, b และ 0xff ของประเภทไบต์จะดำเนินการครั้งแรกจากนั้นจำนวนเต็ม tohexstring จะได้รับสตริง hexadecimal
* จะเห็นได้ว่าผลลัพธ์ของ B & 0xff ยังคงเป็น INT ดังนั้นทำไมคุณต้องดำเนินการกับ 0xff? Direct Integer.tohexstring (b) ;, ไม่สามารถบังคับให้ไบต์ให้ถูกแปลงได้หรือไม่? คำตอบเป็นไปไม่ได้
* เหตุผลคือ: 1. ขนาดของ Byte คือ 8 บิตและขนาดของ int คือ 32 บิต; 2. แบบฟอร์มการเติมเต็มสองของจาวา
* พารามิเตอร์ของจำนวนเต็ม tohexstring คือ int ถ้า & 0xff ไม่ได้ดำเนินการดังนั้นเมื่อไบต์จะถูกแปลงเป็น int เนื่องจาก int คือ 32 บิตและไบต์มีเพียง 8 บิตมันจะถูกเติมในเวลานี้ - - - - -
* ดังนั้นเมื่อไบต์และ 0xff มีส่วนเกี่ยวข้องไบต์จะถูกแปลงเป็นการทำศัลยกรรมพลาสติกก่อนเพื่อให้ 24 บิตสูงในผลลัพธ์จะถูกล้างด้วย 0 ดังนั้นผลลัพธ์จึงเป็นสิ่งที่เราต้องการเสมอ
* 3. การเข้ารหัส UTF-8: จีนมี 3 ไบต์และภาษาอังกฤษใช้ 1 ไบต์
* การเข้ารหัส GBK: จีนมี 2 ไบต์และภาษาอังกฤษใช้ 1 ไบต์
* Java ใช้การเข้ารหัสแบบสองไบต์ (นั่นคือตัวละครหนึ่งตัวในบัญชี Java สำหรับสองไบต์) และการเข้ารหัส UTF-16BE จีนมีพื้นที่ 2 ไบต์ภาษาอังกฤษมี 2 ไบต์
-
* 4. เมื่อลำดับไบต์ของคุณคือการเข้ารหัสที่แน่นอนหากคุณต้องการเปลี่ยนลำดับไบต์เป็นสตริงคุณจะต้องใช้วิธีการเข้ารหัสนี้มิฉะนั้นรหัสที่อ่านไม่ออกจะเกิดขึ้น
* 5. ไฟล์ข้อความเป็นลำดับไบต์ มันสามารถเป็นลำดับที่เข้ารหัสของไบต์
* หากเราสร้างไฟล์ข้อความโดยตรงบนเครื่องจีนไฟล์จะจดจำการเข้ารหัส ANSI เท่านั้น (เช่นสร้างไฟล์ข้อความโดยตรงบนคอมพิวเตอร์)
2. การใช้คลาสไฟล์
แพ็คเกจ com.study.io; นำเข้า java.io.file;/*** การใช้คลาสไฟล์*/คลาสสาธารณะ FileDemo {/*java.io.file คลาสแสดงถึงไฟล์หรือไดเรกทอรี คลาสไฟล์ใช้เพื่อแสดงข้อมูลของไฟล์หรือไดเรกทอรีเท่านั้น (ชื่อขนาด ฯลฯ ) และไม่สามารถใช้เพื่อเข้าถึงเนื้อหาไฟล์ */โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ไฟล์ไฟล์ = ไฟล์ใหม่ ("d: // 111"); // เมื่อสร้างวัตถุไฟล์คุณต้องใช้สแลชสองครั้งเพื่อระบุไดเรกทอรีเพราะ "/" เป็นตัวละครหลบหนี/ตัวคั่นที่อยู่ตรงกลางของไดเรกทอรี ไฟล์ ("D:"+file.Sparator); // system.out.println (file.exists ()); // มีอยู่ () กำหนดว่าไฟล์หรือโฟลเดอร์มีอยู่ถ้า (! file.exists ()) {// ถ้าไฟล์ไม่มีไฟล์ mkdir (); // สร้างโฟลเดอร์ mkdir () ไดเรกทอรี} else {file.delete (); // ลบไฟล์หรือโฟลเดอร์} // ตรวจพบว่าเป็นไดเรกทอรี iSdirectory, ส่งคืนจริงถ้ามันเป็นไดเรกทอรี, ส่งคืน falsesystem.out.println (file.isdirectory ()); ไฟล์ file2 = ไฟล์ใหม่ ("d: // 222", "123.txt"); // api ทั่วไป: system.out.println (ไฟล์); // พิมพ์เนื้อหาของ file.toString () System.out.println (file.getabsolutepath (); System.out.println (file2.getName ()); System.out.println (file.getParent ()); // รับพาเรตต์ PARTEMALTE PATH.OUT.PRINTLN (file2.getParentFile (). getAbsolutepath ());}} ผลการทำงาน:
ภาพประกอบ:
คลาส java.io.file แสดงถึงไฟล์หรือไดเรกทอรี
คลาสไฟล์ใช้เพื่อแสดงข้อมูล (ชื่อขนาด ฯลฯ ) ของไฟล์หรือไดเรกทอรีเท่านั้นและไม่สามารถใช้ในการเข้าถึงเนื้อหาไฟล์
API ที่ใช้กันทั่วไป:
1. สร้างวัตถุไฟล์: ไฟล์ไฟล์ = ไฟล์ใหม่ (พา ธ สตริง); หมายเหตุ: file.seperater (); รับตัวคั่นระบบเช่น: "/"
2. ไม่ว่าจะเป็น file.exists (); มีอยู่
3.file.mkdir (); หรือ file.mkdirs (); สร้างไดเรกทอรีไดเรกทอรีหรือหลายระดับ
4.File.isdirectory () กำหนดว่าเป็นไดเรกทอรี
file.isfile () กำหนดว่าเป็นไฟล์หรือไม่
5.File.Delete (); ลบไฟล์หรือไดเรกทอรี
6.File.CreatenewFile (); สร้างไฟล์ใหม่
7.File.getName () รับชื่อไฟล์หรือเส้นทาง Absolute Directory
8. file.getAbsolutepath () ได้รับเส้นทางที่สมบูรณ์
9.File.getParent (); รับเส้นทาง Absolute Parent
1. สำรวจไดเรกทอรี
แพ็คเกจ com.study.io; นำเข้า java.io.file; นำเข้า java.io.ioException;/*** คลาสเครื่องมือไฟล์*แสดงรายการการดำเนินงานทั่วไปของคลาสไฟล์เช่น: การกรอง, การสำรวจ, ฯลฯ*/ชั้นเรียนสาธารณะ listDirectory (ไฟล์ dir) พ่น IOException {ถ้า (! dir.exists ()) {// มีอยู่ () วิธีการใช้เพื่อตรวจสอบว่าไฟล์หรือไดเรกทอรีได้โยน unledalargumentException ใหม่ ("dir:"+dir+"ไม่มีอยู่หรือไม่ unledalargumentException (dir+"ไม่ใช่ไดเรกทอรี");}/*สตริง [] filenames = dir.list (); // list () วิธีใช้เพื่อแสดงรายการไดเรกทอรีย่อยและไฟล์ในไดเรกทอรีปัจจุบัน {System.out.println (String);}*/// หากคุณต้องการสำรวจเนื้อหาในไดเรกทอรีย่อยคุณต้องสร้างวัตถุไฟล์สำหรับการดำเนินการแบบเรียกซ้ำ ไฟล์มี apifile ที่ส่งคืนวัตถุไฟล์โดยตรง listfiles = dir.listfiles (); // ส่งคืน abstraction ของไดเรกทอรีย่อยโดยตรง (ไฟล์) ถ้า (listfiles! = null && listfiles.length> 0) {สำหรับ (ไฟล์ไฟล์: listfiles) {/*system.out.println(file); ListDirectory (ไฟล์);} else {system.out.println (ไฟล์);}}}}}}} คลาสทดสอบ:
Public Class FileTilstest {โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น ioexception {fileutils.listdirectory (ไฟล์ใหม่ ("d: // iostudy")));}} ผลการทำงาน:
3. การใช้คลาส ApplicessFile
RandomaccessFile: Java ให้การเข้าถึงเนื้อหาไฟล์ซึ่งสามารถใช้ในการอ่านไฟล์หรือไฟล์เขียน
RandomaccessFile รองรับการเข้าถึงไฟล์แบบสุ่มและสามารถเข้าถึงตำแหน่งใด ๆ ของไฟล์
หมายเหตุรุ่นไฟล์ Java:
ผลการทำงาน:
1
12
[65, 66, 127, -1, -1, -1, 127, -1, -1, -1, -42, -48]
7f
FF
FF
FF
7f
FF
FF
FF
D6
D0
4. สตรีมไบต์ (FileInputStream, FileOutputStream)
สตรีม IO สามารถแบ่งออกเป็นสตรีมอินพุตและสตรีมเอาต์พุต
ที่นี่สามารถแบ่งออกเป็นสตรีมไบต์และสตรีมอักขระ
ตัวอย่างรหัส:
แพ็คเกจ com.study.io; นำเข้า java.io.bufferedInputStream; นำเข้า java.io.bufferedoutputstream; นำเข้า java.io.file; นำเข้า java.io.fileinputstream นำเข้า java.io.fileOutputStream; นำเข้า Java.io.ioException; การอ่านข้อมูลบนไฟล์* fileOutputStream-> การใช้วิธีการเขียนข้อมูลไบต์ลงในไฟล์* ❤Dataอินพุตและเอาต์พุตสตรีม:* dataOutputStream/datainputStream: ขยายฟังก์ชั่น "สตรีม" คุณสามารถอ่าน int, ตัวอักษรยาวและข้อมูลประเภทอื่น ๆ bufferedOutputStream* บิตคลาสสตรีมสองบิตนี้ให้การดำเนินการกับบัฟเฟอร์ โดยทั่วไปเมื่อเปิดไฟล์สำหรับการเขียนหรือการอ่านการดำเนินการบัฟเฟอร์จะถูกเพิ่ม โหมดสตรีมนี้ช่วยปรับปรุงประสิทธิภาพของ IO* ตัวอย่างเช่นการใส่อินพุตลงในไฟล์จากแอปพลิเคชันนั้นเทียบเท่ากับการเทถังน้ำลงในกระบอกสูบอื่น: FileOutputStream ---> Write () วิธีการเทียบเท่ากับ "การถ่ายโอนน้ำมากกว่าการใช้งาน ตักเข้าไปในถังก่อน (เช่นพื้นที่บัฟเฟอร์) จากนั้นเทลงในกระบอกสูบอื่นจากถัง ประสิทธิภาพได้รับการปรับปรุง*/คลาสสาธารณะ ioutil {/*** อ่านเนื้อหาของไฟล์ที่ระบุและส่งออกไปยังคอนโซลใน hexadecimal* และทุก ๆ 10 ไบต์แบ่งบรรทัด* @param filename* การอ่านแบบไบต์เดี่ยวไม่เหมาะสำหรับไฟล์ขนาดใหญ่ที่มีประสิทธิภาพ ใน = ใหม่ FileInputStream (ชื่อไฟล์); int b; int i = 1; ในขณะที่ ((b = in.read ())! =-1) {/* 0xff ถูกแทนที่ด้วยระบบ 2 หลักซึ่งหมายถึง 8 1S ด้วยวิธีนี้ตัวละคร 8 บิตที่ต่ำกว่าจะถูกนำมาใช้จริง * OXF คือ 15. ตัวเลขน้อยกว่า 15 จะถูกแปลงเป็นเลขฐานสิบหก * รหัสของคุณหวังว่าจะเป็นตัวเลข hexadecimal คงที่สองตัวดังนั้นเมื่อมีเพียงหนึ่งเดียวเท่านั้นคุณจะต้องเพิ่ม 0*/if (b <= 0xf) {// integer.toHexstring (b) ก่อนที่หมายเลขหน่วยจะเสริมด้วย 0systring ("0"); System.out.print (Integer.tohexstring (b)+""); if (i ++%10 == 0) {system.out.println ();}} in.close (); // การอ่านไฟล์จะต้องปิดหลังจากอ่านและเขียน}/*** การอ่านแบทช์มีประสิทธิภาพสำหรับไฟล์ขนาดใหญ่ ioException {fileInputStream ใน = ใหม่ fileInputStream (ชื่อไฟล์); byte [] buf = ไบต์ใหม่ [8* 1024];/* แบทช์อ่านไบต์จากในและใส่ลงในอาร์เรย์ไบต์ของ buf* เริ่มต้นจากตำแหน่งที่ 0 in.read (buf, 0, buf.length); // อ่านในครั้งเดียวระบุว่าอาร์เรย์ไบต์มีขนาดใหญ่พอ int j = 1; สำหรับ (int i = 0; i <bytes; i ++) {system.out.print (integer.tohexstring (buf [i] & 0xff)+""); ถ้า (j ++%10 == 0) {system.out.println ();}}*/int bytes = 0; in.read (buf, 0, buf.length))! =-1) {สำหรับ (int i = 0; i <bytes; i ++) {system.out.print (integer.tohexstring (buf [i] & 0xff)+");/*** & 0xff & 0xff*/if (j ++%10 == 0) {system.out.println ();}}} in.close ();}/*** ไฟล์สำเนา, byte batch อ่าน* @param srcfile* @param destfile* @throws ioexception* (! srcfile.exists ()) {โยน unlegalargumentexception ใหม่ ("ไฟล์:" + srcfile + "ไม่มีอยู่จริง");} ถ้า (! fileOutputStream (destFile); // เมื่อไฟล์ไม่มีอยู่มันจะถูกสร้างโดยตรง; หากมีอยู่ให้ลบและสร้างไบต์ [] buf = ไบต์ใหม่ [8 * 1024]; // แบทช์อ่านและเขียน int b; ในขณะที่ ((b = in.read (buf, 0, buf.length))! = -1) {//read(buf,0,0,buf.length) การอ่านด้วยพารามิเตอร์ส่งคืนความยาวทั้งหมดของไบต์; เมื่ออ่านทั้งหมดคือ -1; out.write (buf, 0, b); out.flush (); // เป็นการดีที่สุดที่จะเพิ่ม} in.close (); out.close ();}/*** เพื่อคัดลอกไฟล์และใช้กระแสไบต์บัฟเฟอร์* @param srcfile* @param destfile* @throws ioexception* ioexception {ถ้า (! srcfile.exists ()) {โยน unlegalargumentexception ใหม่ ("ไฟล์:"+srcfile+"ไม่มีอยู่จริง");} ถ้า (! srcfile.isfile ()) FileInputStream (srcfile)); bufferedOutputStream bos = ใหม่ bufferedOutputStream (ใหม่ fileOutputStream (destFile)); int c; ในขณะที่ ((c = bis.read ())! =-1) {bos.write (c); bos.flush (); บัฟเฟอร์สำหรับการคัดลอกไฟล์* @param srcfile* @param destfile* @throws ioexception*/โมฆะสาธารณะคงที่ copyfilebybyte (ไฟล์ srcfile, ไฟล์ destfile) โยน ioexception {ถ้า (! srcfile.exists ()) มีอยู่ ");} if (! srcfile.isfile ()) {โยน unlegalargumentException ใหม่ (srcfile+" ไม่ใช่ไฟล์ ");} fileInputStream ใน = ใหม่ fileInputStream (srcfile); fileOutputStream = new FileOutputStream (int C; ส่งคืนเนื้อหา Byte Read; เมื่อการอ่านทั้งหมดกลับมาทั้งหมดคือ -1; out.write (c); out.flush ();} in.close (); out.close (); out.close ();}} คลาสทดสอบ:
แพ็คเกจ com.study.io; นำเข้า java.io.file; นำเข้า java.io.ioexception; นำเข้า org.junit.test; คลาสสาธารณะ ioutiltest {@testpublic โมฆะ testprinthex () {ลอง {ioutil.printhex ("d: //javaio/fileutils.java {E.PrintStackTrace ();}}@testPublic เป็นโมฆะ TestPrinThexByTeArray () {ลอง {Long Start = System.CurrentTimeMillis (); // เวลาที่แตกต่างระหว่างเวลาปัจจุบันและเที่ยงคืนของวันที่ 1 มกราคม 1970 (วัดใน Milliseconds) //ioutil.printhexbyTearray("e://javaio//fileutils.java"); System.currentTimeMillis (); System.out.println (สิ้นสุด - เริ่มต้น);} catch (ioexception e) {e.printstacktrace ();}}@testpublic เป็นโมฆะ testcopyfile () {ลอง {ioutil.copyfile (ไฟล์ใหม่ ไฟล์ ("d: //javaio//1copy.txt"));} catch (ioexception e) {e.printstacktrace ();}}@testpublic void testcopyfilebybuffer () {ลอง {start long = system.currenttimemillis () ไฟล์ ("e: //javaio//1.mp3"), ไฟล์ใหม่ ("e: //javaio//2.mp3"));*// // มากกว่า 20,000 มิลลิวินาที/*ioutil.copyfilebybuffer (ไฟล์ใหม่ ("e: //javaio//1.mp3" 10,000 มิลลิวินาที*/ioutil.copyfile (ไฟล์ใหม่ ("e: //javaio//1.mp3"), ไฟล์ใหม่ ("e: //javaio//4.mp3")); {E.PrintStackTrace ();}}} 5. สตรีมอักขระ
แพ็คเกจ com.study.io; นำเข้า java.io.fileinputstream; นำเข้า java.io.fileoutputstream; นำเข้า java.io.ioException; นำเข้า java.io.InputStreamReader; นำเข้า java.io.OutputStreamWriter; FileInputStream ("E: //javaio//utf8.txt"); inputStreamReader ISR = ใหม่ inputStreamReader (ใน "UTF-8"); // การเข้ารหัสโครงการเริ่มต้น เมื่อทำงานคุณต้องเขียนรูปแบบการเข้ารหัสของไฟล์เอง fileOutputStream out = new fileOutputStream ("e: //javaio//utf81.txt"); outputStreamWriter OSW = new OutputStreamWriter (out, "UTF-8");/*int c; ถ่าน [8*1024]; int c;/*อ่านแบทช์ใส่อาร์เรย์อักขระบัฟเฟอร์เริ่มจากตำแหน่งที่ 0 และวางบัฟเฟอร์ความยาวมากที่สุด จำนวนอักขระที่ส่งคืนคือจำนวนอักขระอ่าน*/ขณะ ((c = isr.read (บัฟเฟอร์, 0, buffer.length))! =-1) {string s = new สตริง (บัฟเฟอร์, 0, c); system.out.print (s); osw.write (บัฟเฟอร์, 0, c); osw.flush ();} isr.close (); osw.close (); osw.close ();}}}};การอ่านและเขียนสตรีมของสตรีมอักขระ (filereader/fileWriter)
ตัวกรองสำหรับสตรีมอักขระ
6. การทำให้เป็นอนุกรมและ deserialization ของวัตถุ
ตัวอย่าง:
สังเกต: