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 , inputStream và OutputStream .
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 và
Đầ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
inputStream và
OutputStream .
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);
Objects.equals(nullValue, billy);
Objects.equals(billy, nicolai);
Objects.equals(billy, copyOfbilly);
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);
Objects.deepEquals(raceTimes1, raceTimes2);
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());
Objects.compare(null, nicolai, new RaceTimeComparator());
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ỗi và HashCode . 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() và
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);
Objects.toString(nullValue);
Objects.toString(nullValue, "Did not finish");
Objects.toIdentityString(billy);
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);
Objects.hashCode(billy);
Objects.hash(billy, nicolai);
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
obj là
null .
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>) và
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);
Objects.isNull(nullValue);
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)
GO TO FULL VERSION