JavaRush /Blog Java /Random-VI /Nghỉ giải lao #229. Cách làm việc với các tệp và Đầu vào/...

Nghỉ giải lao #229. Cách làm việc với các tệp và Đầu vào/Đầu ra trong Java. Các phương thức tiện ích của lớp Đối tượng

Xuất bản trong nhóm

Cách làm việc với các tệp và Đầu vào/Đầu ra trong Java

Nguồn: Medium Hướng dẫn này giải thích cách tạo, đọc, ghi và xóa tệp trong Java. Bạn cũng sẽ tìm hiểu cách hoạt động của các lớp File , inputStreamOutputStream . Nghỉ giải lao #229.  Cách làm việc với các tệp và Đầu vào/Đầu ra trong Java.  Các phương thức tiện ích của lớp Object - 1

Giới thiệu

Trong Java, các tệp được biểu thị bằng lớp Tệp . Lớp File cung cấp các phương thức để tạo, đọc, ghi và xóa file. Đầu vào/đầu ra (I/O) là quá trình truyền dữ liệu giữa chương trình và nguồn bên ngoài, chẳng hạn như tệp, ổ cắm mạng hoặc bảng điều khiển. Java cung cấp nhiều lớp cho đầu vào/đầu ra, bao gồm các lớp Đầu vàoĐầu ra .

Tạo tập tin

Để tạo một file, bạn có thể sử dụng phương thức File.createNewFile() . Nó sẽ tạo một tệp mới nếu tệp có cùng tên chưa tồn tại. Nếu một tệp như vậy đã tồn tại, phương thức createNewFile() sẽ đưa ra IOException . Đây là ví dụ về cách tạo một tệp mới có tên myfile.txt trong thư mục hiện tại:
File myFile = new File("myfile.txt");
myFile.createNewFile();

Đọc tập tin

Để đọc một tệp trong Java, bạn có thể sử dụng lớp FileInputStream . Nó cung cấp các phương thức để đọc byte từ một tập tin. Để đọc nội dung của file, bạn nên sử dụng phương thức read() . Phương thức này đọc một byte từ một tệp và trả về giá trị của byte. Ví dụ: đoạn mã sau đọc nội dung của tệp myfile.txt và in nó ra bảng điều khiển:
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();

Ghi tập tin

Để ghi vào một tập tin, bạn có thể sử dụng lớp FileOutputStream . Nó cung cấp các phương thức để ghi byte vào một tập tin. Để ghi nội dung của một chuỗi vào một tập tin, hãy sử dụng phương thức write() . Phương thức này ghi số byte được chỉ định từ một mảng được chỉ định vào một tệp. Đây là một ví dụ về cách viết chuỗi “Hello, world!”. vào tệp myfile.txt :
File myFile = new File("myfile.txt");
FileOutputStream outputStream = new FileOutputStream(myFile);
byte[] buffer = "Hello, world!".getBytes();
outputStream.write(buffer);
outputStream.close();

Xóa tập tin

Để xóa một file trong Java, bạn nên sử dụng phương thức File.delete() . Nếu file bạn muốn xóa không tồn tại thì phương thức delete() sẽ trả về false . Đây là một ví dụ về mã xóa tệp myfile.txt :
File myFile = new File("myfile.txt");
myFile.delete();

Phần kết luận

Trong bài đăng này, chúng ta đã thảo luận những kiến ​​thức cơ bản khi làm việc với tệp và I/O Java. Bạn đã học cách tạo, đọc, ghi và xóa tập tin. Bạn cũng đã tìm hiểu về lớp File và các lớp inputStreamOutputStream .

Các phương thức tiện ích của lớp Đối tượng - cách làm việc với chúng

Nguồn: Inside Java Với bài đăng này, bạn sẽ nâng cao kiến ​​thức của mình về các phương thức khác nhau được cung cấp trong lớp Đối tượng . Lớp Đối tượng trong Java có nhiều phương thức tiện ích giúp bạn dễ dàng thực hiện nhiều thao tác khác nhau trên đối tượng. Lớp Đối tượng đã trải qua một số cập nhật trong các bản phát hành JDK : đã có những cập nhật rất quan trọng trong JDK 8 và 9 cũng như các cập nhật nhỏ trong JDK 16 và 19. Hãy xem cách bạn có thể sử dụng lớp Đối tượng .

So sánh các đối tượng

Các đối tượng cung cấp một số tùy chọn để so sánh giá trị của hai đối tượng. Lợi ích chính của việc sử dụng triển khai Đối tượng là sự an toàn trước các lần xuất hiện null .

bằng()

Dưới đây là một ví dụ về so sánh hai bản ghi.
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

deepEquals()

Trong lớp Đối tượng , bạn cũng có thể sử dụng deepEquals() để so sánh hai mảng . Không giống như Equals() thông thường , điều này sẽ so sánh các giá trị được lưu trữ trong mảng, điều này sẽ dẫn đến kết quả nhất quán hơn. Về cơ bản phương pháp này đi qua 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

so sánh()

Các đối tượng cũng có một phương thức so sánh() , có thể lấy hai đối tượng và một Comparator<T> . Phương thức so sánh() là một trong số ít phương thức null -không an toàn trong Đối tượng vì nó không có kết quả trả về được chấp nhận nếu một trong các đối số của nó là 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

Chuỗi và HashCode

Lớp Đối tượng cung cấp các phương thức để chuyển đổi một đối tượng thành các giá trị ChuỗiHashCode . Một lần nữa, ưu điểm chính của các phương pháp này là chúng an toàn trước các lần xuất hiện null .

Chuyển đổi thành chuỗi

Một trong những phương pháp thú vị hơn là toString(obj, nullDefault) , cung cấp giá trị mặc định nếu xảy ra lỗi. Điều này có nghĩa là toIdentityString(obj) trả về toString()hashCode() của các đối tượng được truyền như thể cả hai phương thức này đều không bị ghi đè.
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

Chuyển đổi sang HashCode

Các đối tượng cũng cung cấp các phương thức để chuyển đổi một đối tượng thành giá trị mã băm của nó.
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]

Kiểm tra giá trị rỗng

Lớp Đối tượng cung cấp một số phương thức để kiểm tra và xử lý null .

Ném NullPointException vào null

Phương thức requireNonNull(obj) sẽ ném ra ngoại lệ NullPointException nếu giá trị được truyền là null .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName);
		time = Objects.requireNonNull(time);
	}
}

Ném NullPointException vào null kèm theo thông báo cho người dùng

Phương thức requireNonNull(obj, String) sẽ đưa ra lỗi NullPointException kèm theo thông báo cho người dùng nếu giá trị được truyền là null .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName, "runner name required!");
		time = Objects.requireNonNull(time, "race time required!");
	}
}

Trả về giá trị mặc định cho null

Phương thức requireNonNullElse(obj, defaultValue) sẽ trả về defaultValue đã truyền nếu objnull .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNullElse(runnerName, "John Smith");
		time = Objects.requireNonNullElse(time, Duration.ZERO);
	}
}

Sử dụng nhà cung cấp

Lớp Objects cũng cung cấp các phương thức requireNonNull(obj, Nhà cung cấp<String>)T requireNonNullElseGet(T, Nhà cung cấp<T>) , có thể được sử dụng để cung cấp thông báo hoặc giá trị mặc định. Chúng chỉ nên được sử dụng nếu việc tạo thông báo hoặc giá trị mặc định sẽ có tác động đáng kể đến hiệu suấ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);
	}
}

Kiểm tra null dự đoán

Các đối tượng cung cấp khả năng kiểm tra null để sử dụng trong các vị từ, mặc dù nó cũng có thể được sử dụng trong các tình huống khác.
record RaceTime(String runnerName, Duration time) {}

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

Kiểm tra chỉ mục

Cuối cùng, lớp Objects cung cấp một số tùy chọn để kiểm tra vị trí chỉ mục khi duyệt qua một File , String , Collection hoặc đối tượng tương tự. Một số phương pháp này gần đây đã được thêm vào 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)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION