หลังจากทำงาน เทคโนโลยีที่ใช้ก็เปลี่ยนไปตามการเปลี่ยนแปลงของโปรเจ็กต์ บางครั้งใช้ C# บางครั้ง Java และแน่นอนว่าเทคโนโลยีอื่นๆ ที่กระจัดกระจาย โดยรวมแล้ว C# ใช้เวลานานกว่า ตามมาด้วย Java ฉันไม่มีความชอบด้านภาษาใดๆ ภาษาที่สามารถทำงานได้คือภาษาที่ดี และจากมุมมองของเชิงวัตถุ ฉันคิดว่าไม่มีความแตกต่างระหว่าง C# และ Java สำหรับฉัน
บทความนี้จะทบทวนเนื้อหาที่เกี่ยวข้องกับการดำเนินการ I/O ใน Java เป็นหลัก I/O ยังเป็นคุณลักษณะพื้นฐานของภาษาการเขียนโปรแกรมอีกด้วย I/O ใน Java แบ่งออกเป็นสองประเภท ประเภทหนึ่งคือการอ่านตามลำดับและอีกประเภทคือการอ่านแบบสุ่ม
มาดูการอ่านตามลำดับกันก่อน มีสองวิธีในการอ่านตามลำดับ วิธีแรกคือ InputStream/OutputStream ซึ่งเป็นสตรีมอินพุตและเอาท์พุตที่ทำงานบนไบต์ และอีกวิธีคือ Reader/Writer ซึ่งดำเนินการกับอักขระ กระแสการดำเนินงาน
ด้านล่างเราวาดโครงสร้างของ InputStream
FileInputStream: ดำเนินการไฟล์ซึ่งมักใช้ร่วมกับ BufferedInputStream
PipedInputStream: สามารถใช้สำหรับการสื่อสารระหว่างเธรด
ObjectInputStream: สามารถใช้สำหรับการทำให้เป็นอนุกรมของวัตถุได้
ByteArrayInputStream: ใช้เพื่อประมวลผลอินพุตของอาร์เรย์ไบต์
LineNumberInputStream: สามารถส่งออกหมายเลขบรรทัดปัจจุบันและสามารถแก้ไขได้ในโปรแกรม
ต่อไปนี้เป็นโครงสร้างของ OutputStream
PrintStream: ให้อินเทอร์เฟซที่คล้ายกับการพิมพ์และ println เพื่อส่งออกข้อมูล
มาดูวิธีการใช้ Stream เพื่อควบคุมอินพุตและเอาท์พุตกัน
การอ่านไฟล์โดยใช้ InputStream
คัดลอกรหัสรหัส ดังต่อไปนี้:
ใช้ FileInputStream เพื่ออ่านข้อมูลไฟล์
ไบต์สาธารณะแบบคงที่ [] readFileByFileInputStream (ไฟล์ไฟล์) พ่น IOException
-
เอาต์พุต ByteArrayOutputStream = ByteArrayOutputStream ใหม่ ();
FileInputStream fis = null;
พยายาม
-
fis = FileInputStream ใหม่ (ไฟล์);
ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [1024];
int ไบต์อ่าน = 0;
ในขณะที่ ((bytesRead = fis.read (บัฟเฟอร์, 0, buffer.length)) != -1)
-
output.write(บัฟเฟอร์, 0, bytesRead);
-
-
จับ (ข้อยกเว้นเช่น)
-
System.out.println("เกิดข้อผิดพลาดระหว่างการอ่าน" + file.getAbsoluteFile());
-
ในที่สุด
-
ถ้า (fis !=null) fis.close();
ถ้า (เอาท์พุท !=null) output.close();
-
กลับเอาท์พุทtoByteArray();
-
การอ่านไฟล์โดยใช้ BufferedInputStream
คัดลอกรหัสรหัส ดังต่อไปนี้:
ไบต์สาธารณะแบบคงที่ [] readFileByBufferedInputStream (ไฟล์ไฟล์) ส่งข้อยกเว้น
-
FileInputStream fis = null;
BufferedInputStream ทวิ = null;
เอาต์พุต ByteArrayOutputStream = ByteArrayOutputStream ใหม่ ();
พยายาม
-
fis = FileInputStream ใหม่ (ไฟล์);
ทวิ = BufferedInputStream ใหม่ (fis);
ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [1024];
int ไบต์อ่าน = 0;
ในขณะที่ ((bytesRead = bis.read (บัฟเฟอร์, 0, buffer.length)) != -1)
-
output.write(บัฟเฟอร์, 0, bytesRead);
-
-
จับ (ข้อยกเว้นเช่น)
-
System.out.println("เกิดข้อผิดพลาดระหว่างการอ่าน" + file.getAbsoluteFile());
-
ในที่สุด
-
ถ้า (fis != null) fis.close();
ถ้า (ทวิ != null) ทวิ.ปิด();
ถ้า (เอาท์พุท != null) output.close();
-
กลับเอาท์พุทtoByteArray();
-
คัดลอกไฟล์โดยใช้ OutputStream
คัดลอกรหัสรหัส ดังต่อไปนี้:
คัดลอกไฟล์โดยใช้ FileOutputStream
โมฆะคงสาธารณะ copyFileByFileOutputStream (ไฟล์) พ่น IOException
-
FileInputStream fis = null;
FileOutputStream fos = null;
พยายาม
-
fis = FileInputStream ใหม่ (ไฟล์);
fos = ใหม่ FileOutputStream(file.getName() + ".bak");
ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [1024];
int ไบต์อ่าน = 0;
ในขณะที่ ((bytesRead = fis.read (บัฟเฟอร์, 0, บัฟเฟอร์. ความยาว)) ! = -1)
-
fos.write (บัฟเฟอร์, 0, bytesRead);
-
ฟอส.ฟลัช();
-
จับ (ข้อยกเว้นเช่น)
-
System.out.println("เกิดข้อผิดพลาดระหว่างการคัดลอก" + file.getAbsoluteFile());
-
ในที่สุด
-
ถ้า (fis != null) fis.close();
ถ้า (fos != null) fos.close();
-
-
คัดลอกรหัสรหัส ดังต่อไปนี้:
คัดลอกไฟล์โดยใช้ BufferedOutputStream
โมฆะคงสาธารณะ copyFilebyBufferedOutputStream (ไฟล์ไฟล์) พ่น IOException
-
FileInputStream fis = null;
BufferedInputStream ทวิ = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
พยายาม
-
fis = FileInputStream ใหม่ (ไฟล์);
ทวิ = BufferedInputStream ใหม่ (fis);
fos = ใหม่ FileOutputStream(file.getName() + ".bak");
bos = BufferedOutputStream ใหม่ (fos);
ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [1024];
int ไบต์อ่าน = 0;
ในขณะที่ ((bytesRead = bis.read (บัฟเฟอร์, 0, buffer.length)) != -1)
-
bos.write(บัฟเฟอร์, 0, bytesRead);
-
bos.ฟลัช();
-
จับ (ข้อยกเว้นเช่น)
-
System.out.println("เกิดข้อผิดพลาดระหว่างการคัดลอก" + file.getAbsoluteFile());
-
ในที่สุด
-
ถ้า (fis != null) fis.close();
ถ้า (ทวิ != null) ทวิ.ปิด();
ถ้า (fos != null) fos.close();
ถ้า (บอส != null) bos.close();
-
-
รหัสที่นี่จัดการข้อยกเว้นได้ไม่สมบูรณ์มาก เราจะให้รหัสที่สมบูรณ์และเข้มงวดในภายหลัง
มาดูโครงสร้างของ Reader กัน
โดยทั่วไป Reader ที่นี่จะสอดคล้องกับ InputStream
โครงสร้างของตัวเขียนมีดังนี้
มาดูตัวอย่างการใช้ Reader หรือ Writer กัน
ใช้ Reader เพื่ออ่านเนื้อหาไฟล์
คัดลอกรหัสรหัส ดังต่อไปนี้:
ใช้ BufferedReader เพื่ออ่านเนื้อหาไฟล์
สาธารณะสตริง readFile (ไฟล์สตริง) พ่น IOException
-
BufferedReader br = null;
StringBuffer sb = StringBuffer ใหม่ ();
พยายาม
-
br = ใหม่ BufferedReader (FileReader ใหม่ (ไฟล์));
เส้นสตริง = null;
ในขณะที่ ((line = br.readLine()) != null)
-
sb.ผนวก(บรรทัด);
-
-
จับ (ข้อยกเว้นเช่น)
-
System.out.println("เกิดข้อผิดพลาดระหว่างการอ่านไฟล์ " +);
-
ในที่สุด
-
ถ้า (br != null) br.close();
-
กลับ sb.toString();
-
คัดลอกไฟล์โดยใช้ Writer
คัดลอกรหัสรหัส ดังต่อไปนี้:
คัดลอกไฟล์โดยใช้ BufferedWriter
copyFile โมฆะคงที่สาธารณะ (ไฟล์ String) พ่น IOException
-
BufferedReader br = null;
BufferedWriter bw = null;
พยายาม
-
br = ใหม่ BufferedReader (FileReader ใหม่ (ไฟล์));
bw = ใหม่ BufferedWriter (FileWriter ใหม่ (ไฟล์ + ".bak"));
เส้นสตริง = null;
ในขณะที่ ((line = br.readLine())!= null)
-
bw.write(บรรทัด);
-
-
จับ (ข้อยกเว้นเช่น)
-
System.out.println("เกิดข้อผิดพลาดระหว่างการคัดลอก " + ไฟล์);
-
ในที่สุด
-
ถ้า (br != null) br.close();
ถ้า (bw != null) bw.close();
-
-
มาดูวิธีการเข้าถึงไฟล์แบบสุ่ม RandomAccessFile ส่วนใหญ่จะใช้ใน Java เพื่อดำเนินการสุ่มกับไฟล์
สร้างไฟล์ที่มีขนาดคงที่
คัดลอกรหัสรหัส ดังต่อไปนี้:
สร้างไฟล์ขนาดคงที่
โมฆะคงที่สาธารณะ createFile (ไฟล์ String, ขนาด int) พ่น IOException
-
ไฟล์ชั่วคราว = ไฟล์ใหม่ (ไฟล์);
RandomAccessFile raf = RandomAccessFile ใหม่ (temp, "rw");
raf.setLength(ขนาด);
raf.ปิด();
-
เขียนข้อมูลแบบสุ่มลงในไฟล์
คัดลอกรหัสรหัส ดังต่อไปนี้:
แทรกข้อมูลแบบสุ่มลงในไฟล์
โมฆะสาธารณะคงที่ writeFile (ไฟล์สตริง, เนื้อหาไบต์ [], int startPos, int contentLength) พ่น IOException
-
RandomAccessFile raf = new RandomAccessFile(ไฟล์ใหม่ (ไฟล์), "rw");
raf.seek(startPos);
raf.write (เนื้อหา, 0, ความยาวเนื้อหา);
raf.ปิด();
-
ต่อไป มาดูการดำเนินการทั่วไปอื่นๆ กัน
ย้ายไฟล์
คัดลอกรหัสรหัส ดังต่อไปนี้:
ย้ายไฟล์
สาธารณะ moveFile บูลีนคงที่ (String sourceFile, String destFile)
-
แหล่งที่มาของไฟล์ = ไฟล์ใหม่ (sourceFile);
ถ้า (!source.exists()) โยน RuntimeException ใหม่ ("ไฟล์ต้นฉบับไม่มีอยู่");
ไฟล์ dest = ไฟล์ใหม่ (destFile);
if (!(ไฟล์ใหม่(dest.getPath()).exists())) ไฟล์ใหม่(dest.getParent()).mkdirs();
กลับ source.renameTo (ปลายทาง);
-
คัดลอกไฟล์
คัดลอกรหัสรหัส ดังต่อไปนี้:
คัดลอกไฟล์
copyFile โมฆะคงที่สาธารณะ (String sourceFile, String destFile) พ่น IOException
-
แหล่งที่มาของไฟล์ = ไฟล์ใหม่ (sourceFile);
ถ้า (!source.exists()) โยน RuntimeException ใหม่ ("ไฟล์ไม่มีอยู่");
ถ้า (!source.isFile()) โยน RuntimeException ใหม่ ("ไม่ใช่ไฟล์");
ถ้า (!source.canRead()) โยน RuntimeException ใหม่ ("ไฟล์ไม่สามารถอ่านได้");
ไฟล์ dest = ไฟล์ใหม่ (destFile);
ถ้า (dest.exists())
-
ถ้า (dest.isDirectory()) โยน RuntimeException ใหม่ ("ปลายทางคือโฟลเดอร์");
อื่น
-
dest.ลบ();
-
-
อื่น
-
ไฟล์ parentFolder = ไฟล์ใหม่ (dest.getParent());
ถ้า (!parentFolder.exists()) parentFolder.mkdirs();
ถ้า (!parentFolder.canWrite()) โยน RuntimeException ใหม่ ("ไม่สามารถเขียนปลายทางได้");
-
FileInputStream fis = null;
FileOutputStream fos = null;
พยายาม
-
fis = FileInputStream ใหม่ (ที่มา);
fos = FileOutputStream ใหม่ (ปลายทาง);
ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [1024];
int ไบต์อ่าน = 0;
ในขณะที่ ((bytesRead = fis.read (บัฟเฟอร์, 0, buffer.length)) != -1)
-
fos.write (บัฟเฟอร์, 0, bytesRead);
-
ฟอส.ฟลัช();
-
จับ (เช่น IOException)
-
System.out.println("เกิดข้อผิดพลาดระหว่างการคัดลอก" + sourceFile);
-
ในที่สุด
-
ถ้า (fis != null) fis.close();
ถ้า (fos != null) fos.close();
-
-
คัดลอกโฟลเดอร์
คัดลอกรหัสรหัส ดังต่อไปนี้:
คัดลอกโฟลเดอร์
โมฆะคงสาธารณะ copyDir (สตริง sourceDir, สตริง destDir) ส่ง IOException
-
แหล่งที่มาของไฟล์ = ไฟล์ใหม่ (sourceDir);
ถ้า (!source.exists()) โยน RuntimeException ใหม่ ("ไม่มีแหล่งที่มา");
ถ้า (!source.canRead()) โยน RuntimeException ใหม่ ("ไม่สามารถอ่านแหล่งที่มาได้");
ไฟล์ dest = ไฟล์ใหม่ (destDir);
ถ้า (!dest.exists()) dest.mkdirs();
ไฟล์[] arrFiles = source.listFiles();
สำหรับ (int i = 0; i < arrFiles.length; i++)
-
ถ้า (arrFiles[i].isFile())
-
เครื่องอ่าน BufferedReader = BufferedReader ใหม่ (FileReader ใหม่ (arrFiles [i]));
ผู้เขียน BufferedWriter = ใหม่ BufferedWriter(FileWriter ใหม่ (destDir + "/" + arrFiles[i].getName()));
เส้นสตริง = null;
ในขณะที่ ((line = reader.readLine()) != null) write.write(line);
นักเขียน.ฟลัช();
reader.ปิด();
นักเขียน.ปิด();
-
อื่น
-
copyDir(sourceDir + "/" + arrFiles[i].getName(), destDir + "/" + arrFiles[i].getName());
-
-
-
ลบโฟลเดอร์
คัดลอกรหัสรหัส ดังต่อไปนี้:
ลบโฟลเดอร์
โมฆะสาธารณะคงที่เดล (String filePath)
-
ไฟล์ไฟล์ = ไฟล์ใหม่ (filePath);
ถ้า (ไฟล์ == null || !file.exists()) กลับ;
ถ้า (file.isFile())
-
ไฟล์.ลบ();
-
อื่น
-
ไฟล์[] arrFiles = file.listFiles();
ถ้า (arrFiles.length > 0)
-
สำหรับ (int i = 0; i < arrFiles.length; i++)
-
เดล(arrFiles[i].getAbsolutePath());
-
-
ไฟล์.ลบ();
-
-
รับขนาดโฟลเดอร์
คัดลอกรหัสรหัส ดังต่อไปนี้:
รับขนาดโฟลเดอร์
getFolderSize แบบยาวคงที่สาธารณะ (String dir)
-
ขนาดยาว = 0;
ไฟล์ไฟล์ = ไฟล์ใหม่ (dir);
ถ้า (!file.exists()) โยน RuntimeException ใหม่ ("dir ไม่มีอยู่");
ถ้า (file.isFile()) ส่งคืน file.length();
อื่น
-
สตริง[] arrFileName = file.list();
สำหรับ (int i = 0; i < arrFileName.length; i++)
-
ขนาด += getFolderSize(dir + "/" + arrFileName[i]);
-
-
ขนาดส่งคืน;
-
แบ่งไฟล์ขนาดใหญ่ออกเป็นไฟล์ขนาดเล็กหลายๆ ไฟล์
คัดลอกรหัสรหัส ดังต่อไปนี้:
แยกไฟล์ขนาดใหญ่ออกเป็นไฟล์เล็ก ๆ หลายๆ ไฟล์
โมฆะสาธารณะคงที่ splitFile (String filePath, หน่วยยาว) พ่น IOException
-
ไฟล์ไฟล์ = ไฟล์ใหม่ (filePath);
ถ้า (!file.exists()) โยน RuntimeException ใหม่ ("ไฟล์ไม่มีอยู่");
ขนาดยาว = file.length();
ถ้า (หน่วย >= ขนาด) กลับ;
จำนวน int = ขนาด % หน่วย == 0 ? (int)(ขนาด/หน่วย) : (int)(ขนาด/หน่วย) + 1;
สตริง newFile = null;
FileOutputStream fos = null;
FileInputStream fis = null;
ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [(int) หน่วย];
fis = FileInputStream ใหม่ (ไฟล์);
startPos ยาว = 0;
สตริง countFile = filePath + "_Count";
ผู้เขียน PrintWriter = PrintWriter ใหม่ (FileWriter ใหม่ (ไฟล์ใหม่ (countFile)));
Writer.println(เส้นทางไฟล์ + "/t" + ขนาด);
สำหรับ (int i = 1; i <= นับ; i++)
-
newFile = filePath + "_" + i;
startPos = (i - 1) * หน่วย;
System.out.println("กำลังสร้าง" + ไฟล์ใหม่);
fos = FileOutputStream ใหม่ (ไฟล์ใหม่ (ไฟล์ใหม่));
int bytesRead = fis.read (บัฟเฟอร์, 0, buffer.length);
ถ้า (bytesRead != -1)
-
fos.write (บัฟเฟอร์, 0, bytesRead);
Writer.println(ไฟล์ใหม่ + "/t" + startPos + "/t" + bytesRead);
-
ฟอส.ฟลัช();
ฟอส.ปิด();
System.out.println("StartPos:" + i*unit + "; EndPos:" + (i*unit + bytesRead));
-
นักเขียน.ฟลัช();
นักเขียน.ปิด();
fis.ปิด();
-
รวมไฟล์ขนาดเล็กหลายไฟล์ให้เป็นไฟล์ขนาดใหญ่ไฟล์เดียว
คัดลอกรหัสรหัส ดังต่อไปนี้:
รวมไฟล์ขนาดเล็กหลายไฟล์ให้เป็นไฟล์ขนาดใหญ่ไฟล์เดียว
โมฆะสาธารณะคงที่ linkFiles (จำนวนสตริง) พ่น IOException
-
ไฟล์ไฟล์ = ไฟล์ใหม่ (countFile);
ถ้า (!file.exists()) โยน RuntimeException ใหม่ ("ไม่มีไฟล์นับอยู่");
เครื่องอ่าน BufferedReader = BufferedReader ใหม่ (FileReader ใหม่ (ไฟล์));
เส้นสตริง = reader.readLine();
สตริง newFile = line.split("/t")[0];
ขนาดยาว = Long.parseLong(line.split("/t")[1]);
RandomAccessFile raf = new RandomAccessFile(newFile, "rw");
raf.setLength(ขนาด);
FileInputStream fis = null;
บัฟเฟอร์ไบต์ [] = null;
ในขณะที่ ((line = reader.readLine()) != null)
-
สตริง[] arrInfo = line.split("/t");
fis = FileInputStream ใหม่ (ไฟล์ใหม่ (arrInfo [0]));
บัฟเฟอร์ = ไบต์ใหม่ [Integer.parseInt (arrInfo [2])];
startPos ยาว = Long.parseLong(arrInfo[1]);
fis.read(บัฟเฟอร์, 0, Integer.parseInt(arrInfo[2]));
raf.seek(startPos);
raf.write(บัฟเฟอร์, 0, Integer.parseInt(arrInfo[2]));
fis.ปิด();
-
raf.ปิด();
-
ดำเนินการคำสั่งภายนอก
คัดลอกรหัสรหัส ดังต่อไปนี้:
ดำเนินการคำสั่งภายนอก
โมฆะคงสาธารณะ execExternalCommand (คำสั่ง String อาร์กิวเมนต์สตริง)
-
กระบวนการกระบวนการ = null;
พยายาม
-
กระบวนการ = Runtime.getRuntime().exec(command + " " + อาร์กิวเมนต์);
InputStream คือ = process.getInputStream();
BufferedReader br = BufferedReader ใหม่ (InputStreamReader ใหม่ (เป็น));
เส้นสตริง = null;
ในขณะที่ ((line = br.readLine()) != null)
-
System.out.println (บรรทัด);
-
-
จับ (ข้อยกเว้นเช่น)
-
System.err.println(เช่นgetMessage());
-
ในที่สุด
-
ถ้า (กระบวนการ != null) กระบวนการ ทำลาย();
-
-