JavaRush /จาวาบล็อก /Random-TH /คอฟฟี่เบรค #229. วิธีทำงานกับไฟล์และอินพุต/เอาท์พุตใน Jav...

คอฟฟี่เบรค #229. วิธีทำงานกับไฟล์และอินพุต/เอาท์พุตใน Java วิธีการอรรถประโยชน์ของคลาส Objects

เผยแพร่ในกลุ่ม

วิธีทำงานกับไฟล์และอินพุต/เอาท์พุตใน Java

ที่มา:สื่อ บท ช่วยสอนนี้จะอธิบายวิธีสร้าง อ่าน เขียน และลบไฟล์ใน Java คุณยังจะได้เรียนรู้ว่า คลาส File , InputStreamและOutputStream ทำงาน อย่างไร คอฟฟี่เบรค #229.  วิธีทำงานกับไฟล์และอินพุต/เอาท์พุตใน Java  วิธีการอรรถประโยชน์ของคลาส Objects - 1

การแนะนำ

ใน Java ไฟล์จะถูกแสดงโดยคลาสFile คลาสFileจัดเตรียมวิธีการสร้าง อ่าน เขียน และลบไฟล์ อินพุต/เอาต์พุต (I/O) คือกระบวนการถ่ายโอนข้อมูลระหว่างโปรแกรมและแหล่งข้อมูลภายนอก เช่น ไฟล์ ซ็อกเก็ตเครือข่าย หรือคอนโซล Java มีคลาสมากมายสำหรับอินพุต/เอาต์พุต รวมถึงคลาส InputStreamและOutputStream

การสร้างไฟล์

หากต้องการสร้างไฟล์ คุณสามารถใช้ เมธอด File.createNewFile ( ) มันจะสร้างไฟล์ใหม่หากไม่มีไฟล์ชื่อเดียวกันนี้ หากมีไฟล์ดังกล่าวอยู่แล้ว เมธอด createNewFile ( )จะส่งIOException ต่อไปนี้คือตัวอย่างวิธีสร้างไฟล์ใหม่ชื่อmyfile.txtในไดเร็กทอรีปัจจุบัน:
File myFile = new File("myfile.txt");
myFile.createNewFile();

กำลังอ่านไฟล์

หากต้องการอ่านไฟล์ใน Java คุณสามารถใช้คลาสFileInputStream มันมีวิธีการในการอ่านไบต์จากไฟล์ หากต้องการอ่านเนื้อหาของไฟล์ คุณควรใช้เมธอดread() วิธีการนี้จะอ่านหนึ่งไบต์จากไฟล์และส่งกลับค่าของไบต์ ตัวอย่างเช่น รหัสต่อไปนี้อ่านเนื้อหาของไฟล์myfile.txtและพิมพ์ลงในคอนโซล:
File myFile = new File("myfile.txt");
FileInputStream inputStream = new FileInputStream(myFile);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
    System.out.print(new String(buffer, 0, bytesRead));
}
inputStream.close();

ไฟล์บันทึก

หากต้องการเขียนลงไฟล์ คุณสามารถใช้คลาสFileOutputStream มีวิธีการเขียนไบต์ลงในไฟล์ หากต้องการเขียนเนื้อหาของสตริงลงในไฟล์ ให้ใช้เมธอดwrite() วิธีการนี้จะเขียนจำนวนไบต์ที่ระบุจากอาร์เรย์ที่ระบุไปยังไฟล์ นี่คือตัวอย่างวิธีการเขียนสตริง “Hello, world!” ไปยัง ไฟล์ myfile.txt :
File myFile = new File("myfile.txt");
FileOutputStream outputStream = new FileOutputStream(myFile);
byte[] buffer = "Hello, world!".getBytes();
outputStream.write(buffer);
outputStream.close();

กำลังลบไฟล์

หากต้องการลบไฟล์ใน Java คุณควรใช้เมธอดFile.delete() หากไม่มีไฟล์ที่คุณต้องการลบ เมธอดDelete()จะส่งกลับค่าfalse นี่คือตัวอย่างโค้ดที่จะลบ ไฟล์ myfile.txt :
File myFile = new File("myfile.txt");
myFile.delete();

บทสรุป

ในโพสต์นี้ เราได้พูดคุยถึงพื้นฐานของการทำงานกับไฟล์และ I/O Java คุณได้เรียนรู้วิธีสร้าง อ่าน เขียน และลบไฟล์แล้ว คุณยังได้เรียนรู้เกี่ยวกับคลาส Fileและ คลาส InputStreamและOutputStream

เมธอดยูทิลิตี้ของคลาส Objects - วิธีทำงานกับเมธอดเหล่านั้น

ที่มา: Inside Java ด้วยโพสต์นี้ คุณจะพัฒนาความรู้เกี่ยวกับวิธีการต่างๆ ที่มีอยู่ในคลาสObjects คลาสObjectsใน Java มีวิธีการอรรถประโยชน์มากมายที่ทำให้ง่ายต่อการดำเนินการต่างๆ บนอ็อบเจ็กต์ คลาส Objectsได้รับการอัปเดตหลายครั้งใน JDK release : มีการอัปเดตที่สำคัญมากใน JDK 8 และ 9 และการอัปเดตเล็กน้อยใน JDK 16 และ 19 มาดูกันว่าคุณสามารถใช้คลาส Objects ได้อย่างไร

การเปรียบเทียบวัตถุ

ออบเจ็กต์มีตัวเลือกมากมายสำหรับการเปรียบเทียบค่าของสองออบเจ็กต์ ประโยชน์หลักของการใช้Objectsก็ คือความปลอดภัยจาก การเกิด ค่าว่าง

เท่ากับ()

ด้านล่างนี้เป็นตัวอย่างของการเปรียบเทียบสองระเบียน
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime copyOfbilly =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));
nullValue.equals(billy);//NPE
Objects.equals(nullValue, billy);// false
Objects.equals(billy, nicolai);// false
Objects.equals(billy, copyOfbilly);// true

ลึกเท่ากับ()

ใน คลาส Objects คุณยังสามารถใช้ deepEquals()เพื่อเปรียบเทียบสองอาร์เรย์ได้ ซึ่งแตกต่าง จากปกติเท่ากับ()สิ่งนี้จะเปรียบเทียบค่าที่เก็บไว้ในอาร์เรย์ซึ่งควรนำไปสู่ผลลัพธ์ที่สอดคล้องกันมากขึ้น โดยพื้นฐานแล้ววิธีนี้ต้องผ่านArrays.deepEquals( )
record RaceTime(String runnerName, Duration time) {}

RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

RaceTime[] raceTimes1 = new RaceTime[] { billy, nicolai };
RaceTime[] raceTimes2 = new RaceTime[] { billy, nicolai };

Objects.equals(raceTimes1, raceTimes2);// false
Objects.deepEquals(raceTimes1, raceTimes2);// true

เปรียบเทียบ()

วัตถุยังมี เมธอด comparison()ซึ่งสามารถรับสองวัตถุและComparator <T> วิธีการCompare()เป็นหนึ่งในไม่กี่ วิธี null -unsafe ในObjectsเนื่องจากไม่มีการส่งคืนที่ยอมรับได้หากหนึ่งในอาร์กิวเมนต์เป็น null
record RaceTime(String runnerName, Duration time) {}
class RaceTimeComparator implements Comparator<RaceTime> {
@Override
public int compare(RaceTime o1, RaceTime o2) {
	return o1.time.compareTo(o2.time);
}
}
RaceTime billy =
new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

Objects.compare(billy, nicolai, new RaceTimeComparator());//-1
Objects.compare(null, nicolai, new RaceTimeComparator());//NPE

สตริงและแฮชโค้ด

คลาสObjectsมีวิธีการแปลงวัตถุเป็นค่าStringและHashCode ข้อดีหลักของวิธีการเหล่า นี้ ก็คือ ปลอดภัยจาก เหตุการณ์ ที่เป็นโมฆะ

แปลงเป็นสตริง

วิธีหนึ่งที่น่าสนใจคือtoString(obj, nullDefault)ซึ่งให้ค่าเริ่มต้นหากเกิดข้อผิดพลาด ซึ่งหมายความว่าtoIdentityString(obj)ส่งคืนtoString()และhashCode()ของอ็อบเจ็กต์ที่ส่งผ่านราวกับว่าไม่มีการเขียนทับวิธีการเหล่านี้
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

Objects.toString(billy);//RaceTime[runnerName=Billy Korando, time=PT1M30S]
Objects.toString(nullValue);//null
Objects.toString(nullValue, "Did not finish");//Did not finish
Objects.toIdentityString(billy);//ObjectsExamples$1RaceTime@251a69d7

แปลงเป็นแฮชโค้ด

ออบเจ็กต์ยังมีวิธีการแปลงออบเจ็กต์เป็นค่ารหัสแฮชด้วย
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

Objects.hashCode(nullValue);//0
Objects.hashCode(billy);//[HashValue]
Objects.hash(billy, nicolai);//[HashValue]

กำลังตรวจสอบค่าว่าง

คลาสObjects มีหลายวิธี ใน การตรวจสอบและจัดการnull

การขว้าง NullPointException เป็น null

วิธีการneedNonNull(obj)จะส่งNullPointExceptionหากค่าที่ส่งผ่านเป็น null
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName);
		time = Objects.requireNonNull(time);
	}
}

การโยน NullPointException เป็น null พร้อมข้อความถึงผู้ใช้

เมธอดneedNonNull(obj, String) จะส่งข้อ ผิด พลาดNullPointExceptionพร้อมข้อความถึงผู้ใช้หากค่าที่ส่งเป็นnull
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName, "runner name required!");
		time = Objects.requireNonNull(time, "race time required!");
	}
}

ส่งกลับค่าเริ่มต้นเป็นโมฆะ

เมธอดneedNonNullElse(obj, defaultValue)จะส่งคืนdefaultValue ที่ส่ง ผ่าน หากobjเป็นnull
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNullElse(runnerName, "John Smith");
		time = Objects.requireNonNullElse(time, Duration.ZERO);
	}
}

การใช้ซัพพลายเออร์

คลาสObjects ยังจัดให้มี เมธอดneedNonNull(obj, Supplier<String>)และT needNonNullElseGet(T, Supplier<T>)ซึ่งสามารถใช้เพื่อจัดเตรียมข้อความหรือค่าเริ่มต้น ควรใช้เฉพาะในกรณีที่การสร้างข้อความหรือค่าเริ่มต้นจะมีผลกระทบต่อประสิทธิภาพอย่างมาก
record RaceTime(String runnerName, Duration time) {
static Supplier<String> noNameMsgSupplier = () -> "runner name required!";
static Supplier<String> noTimeMsgSupplier = () -> "race time required!";
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName, noNameMsgSupplier);
		time = Objects.requireNonNull(time, noTimeMsgSupplier);
	}
}
record RaceTime(String runnerName, Duration time) {
static Supplier<String> noNameValueSupplier = () -> "John Smith";
static Supplier<Duration> noTimeValueSupplier = () -> Duration.ZERO;
	RaceTime{
		runnerName = Objects.requireNonNullElseGet(runnerName, noNameValueSupplier);
		time = Objects.requireNonNullElseGet(time, noTimeValueSupplier);
	}
}

การตรวจสอบค่าว่างเชิงคาดการณ์

ออบเจ็กต์มี การตรวจสอบ ค่าว่างสำหรับใช้ในเพรดิเคต แม้ว่าจะสามารถใช้ในสถานการณ์อื่นได้เช่นกัน
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
Objects.nonNull(nullValue);//false
Objects.isNull(nullValue);//true

การตรวจสอบดัชนี

สุดท้ายนี้ คลาส Objectsมีตัวเลือกมากมายสำหรับการตรวจสอบตำแหน่งดัชนีเมื่อสำรวจผ่านFile , String , Collectionหรือวัตถุที่คล้ายกัน วิธีการเหล่านี้บางวิธีเพิ่งถูกเพิ่มลงใน JDK 16
int checkIndex(int index, int length)

int checkFromToIndex(int fromIndex, int toIndex, int length)

int checkFromIndexSize(int fromIndex, int size, int length)

long checkIndex(long index, long length)

long checkFromToIndex(long fromIndex, long toIndex, long length)

long checkFromIndexSize(long fromIndex, long size, long length)
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION